S-DES
#include <stdio.h>
int P10[] = {3, 5, 2, 7, 4, 10, 1, 9, 8, 6};
int P8[] = {6, 3, 7, 4, 8, 5, 10, 9};
int IP[] = {2, 6, 3, 1, 4, 8, 5, 7};
int IPI[] = {4, 1, 3, 5, 7, 2, 8, 6};
int EP[] = {4, 1, 2, 3, 2, 3, 4, 1};
int P4[] = {2, 4, 3, 1};
int S0[4][4] = {{1, 0, 3, 2}, {3, 2, 1, 0}, {0, 2, 1, 3}, {3, 1, 3, 2}};
int S1[4][4] = {{0, 1, 2, 3}, {2, 0, 1, 3}, {3, 0, 1, 0}, {2, 1, 0, 3}};
void print_array(char* label, int arr[], int n) {
printf("%s: ", label);
for(int i = 0; i < n; i++) {
printf("%d", arr[i]);
}
printf("\n");
}
int* permute(int input[], int table[], int n, int out[]) {
for (int i = 0; i < n; i++) {
out[i] = input[table[i] - 1];
}
return out;
}
int* left_shift(int key[], int n) {
for (int shifts = 0; shifts < n; shifts++) {
int count = 0;
int ele = key[count];
while (count < 4) {
key[count] = key[count + 1];
count++;
}
key[count++] = ele;
ele = key[count];
while (count < 9) {
key[count] = key[count + 1];
count++;
}
key[count++] = ele;
}
return key;
}
int* xor_arrays(int a[], int b[], int n, int out[]) {
for (int i = 0; i < n; i++) {
out[i] = a[i] ^ b[i];
}
return out;
}
int sbox_lookup(int sbox[4][4], int bits[4]) {
int row = (bits[0] << 1) | bits[3];
int col = (bits[1] << 1) | bits[2];
return sbox[row][col];
}
int* fK(int state[], int key[], int out[]) {
int L[4], R[4], ep_out[8], xor_out[8], p4_out[4];
for(int i = 0; i < 4; i++) {
L[i] = state[i];
R[i] = state[i+4];
}
permute(R, EP, 8, ep_out);
xor_arrays(ep_out, key, 8, xor_out);
int L_sbox_in[4] = {xor_out[0], xor_out[1], xor_out[2], xor_out[3]};
int R_sbox_in[4] = {xor_out[4], xor_out[5], xor_out[6], xor_out[7]};
int s0_val = sbox_lookup(S0, L_sbox_in);
int s1_val = sbox_lookup(S1, R_sbox_in);
int sbox_out[4] = { (s0_val >> 1) & 1, s0_val & 1, (s1_val >> 1) & 1, s1_val & 1 };
permute(sbox_out, P4, 4, p4_out);
int new_L[4];
xor_arrays(L, p4_out, 4, new_L);
for(int i = 0; i < 4; i++) {
out[i] = new_L[i];
out[i+4] = R[i];
}
return out;
}
int* switch_halves(int state[]) {
for (int i = 0; i < 4; i++) {
int temp = state[i];
state[i] = state[i+4];
state[i+4] = temp;
}
return state;
}
int main() {
int key[10], p10_key[10], k1[8], k2[8];
int plaintext[8], state[8], ciphertext[8];
printf("Enter 10-bit Key: ");
for (int i = 0; i < 10; i++) scanf("%d", &key[i]);
printf("Enter 8-bit Plaintext: ");
for (int i = 0; i < 8; i++) scanf("%d", &plaintext[i]);
printf("\n");
permute(key, P10, 10, p10_key);
permute(left_shift(p10_key, 1), P8, 8, k1);
print_array("Key 1 (K1)", k1, 8);
permute(left_shift(p10_key, 2), P8, 8, k2);
print_array("Key 2 (K2)", k2, 8);
permute(plaintext, IP, 8, state);
fK(state, k1, state);
switch_halves(state);
fK(state, k2, state);
permute(state, IPI, 8, ciphertext);
printf("\n");
print_array("Ciphertext", ciphertext, 8);
return 0;
}RSA
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int x;
int calci(int p,int q)
{
int r;
while(p%q!=1)
{
r=p%q;
if(r<=0)
return -1;
p=q;
q=r;
}
return p;
}
int find_d(int a,int b)
{
int i=1;
while((a*i)%b!=1)
{
i++;
}
return i;
}
int compute(int input,int range,int n)
{
int k=0,m=1;
while(k!=range)
{
m=(m*(input%n))%n;
k++;
}
return m;
}
int main(){
int p,q,s,x,n,d,m,e,phi,result,choice,result1;
{
printf("1.Encrypt\n2.Decrypt\nEnter choice");
scanf("%d",&choice);
printf("Enter the first prime number\n");
scanf("%d",&p);
printf("Enter the second prime number\n");
scanf("%d",&q);
printf("Enter the value of:");
scanf("%d",&e);
printf("Enter the value of message:");
scanf("%d",&m);
n=p*q;
phi=(p-1)*(q-1);
e=calci(e,phi);
if(e==-1)
{
printf("Not possible\n");
return 0;
}
printf("\nEncryption\n");
d=find_d(e,phi);
result=compute(m,e,n);
printf("Ciphertext=%d",result);
printf("\nDecryption\n");
result1=compute(result,d,n);
printf("Message=%d\n:",result1);
return 0;
}
}Diffi Helman
User A
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
long long power(long long base, long long exp, long long mod)
{
long long result = 1;
base = base % mod;
while(exp > 0)
{
if(exp % 2 == 1)
result = (result * base) % mod;
base = (base * base) % mod;
exp = exp / 2;
}
return result;
}
int main()
{
long long Xa, Ya, Ka, q, alpha, Yb;
char prime[50], al[50], buffer[50];
printf("Enter private key for User A (Xa): ");
scanf("%lld", &Xa);
FILE *file = fopen("master.txt","r");
if(file == NULL)
{
printf("Error opening master.txt\n");
return 1;
}
fgets(prime,sizeof(prime),file);
fgets(al,sizeof(al),file);
fclose(file);
q = atoll(prime);
alpha = atoll(al);
printf("Prime number (q): %lld\n", q);
printf("Primitive root (alpha): %lld\n", alpha);
Ya = power(alpha, Xa, q);
printf("Public key of User A (Ya): %lld\n", Ya);
FILE *fa = fopen("userA.txt","w");
fprintf(fa,"%lld",Ya);
fclose(fa);
printf("Waiting for User B's public key...\n");
sleep(10);
FILE *fb = fopen("userB.txt","r");
if(fb == NULL)
{
printf("Error opening userB.txt\n");
return 1;
}
fgets(buffer,sizeof(buffer),fb);
fclose(fb);
Yb = atoll(buffer);
Ka = power(Yb, Xa, q);
printf("Shared Secret Key (User A): %lld\n", Ka);
return 0;
}User B
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
long long power(long long base, long long exp, long long mod)
{
long long result = 1;
base = base % mod;
while(exp > 0)
{
if(exp % 2 == 1)
result = (result * base) % mod;
base = (base * base) % mod;
exp = exp / 2;
}
return result;
}
int main()
{
long long Xb, Yb, Kb, q, alpha, Ya;
char prime[50], al[50], buffer[50];
printf("Enter private key for User B (Xb): ");
scanf("%lld", &Xb);
FILE *file = fopen("master.txt","r");
if(file == NULL)
{
printf("Error opening master.txt\n");
return 1;
}
fgets(prime,sizeof(prime),file);
fgets(al,sizeof(al),file);
fclose(file);
q = atoll(prime);
alpha = atoll(al);
printf("Prime number (q): %lld\n", q);
printf("Primitive root (alpha): %lld\n", alpha);
Yb = power(alpha, Xb, q);
printf("Public key of User B (Yb): %lld\n", Yb);
FILE *fb = fopen("userB.txt","w");
fprintf(fb,"%lld",Yb);
fclose(fb);
FILE *fa = fopen("userA.txt","r");
if(fa == NULL)
{
printf("Error opening userA.txt\n");
return 1;
}
fgets(buffer,sizeof(buffer),fa);
fclose(fa);
Ya = atoll(buffer);
Kb = power(Ya, Xb, q);
printf("Shared Secret Key (User B): %lld\n", Kb);
return 0;
}Elgamal
User A
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<unistd.h>
long long power(long long base, long long exp, long long mod)
{
long long res = 1;
base = base % mod;
while(exp > 0)
{
if(exp % 2 == 1)
res = (res * base) % mod;
base = (base * base) % mod;
exp = exp / 2;
}
return res;
}
long long inverse(long long K, long long q)
{
for(long long i = 1; i < q; i++)
{
if((K * i) % q == 1)
return i;
}
return -1;
}
int main()
{
long long Xa, Ya, q, alpha;
long long K, C1, C2, inverseK, M;
char prime[20], al[20];
char strYa[20], strC1[20], strC2[20];
printf("Enter private key Xa: ");
scanf("%lld", &Xa);
FILE *file = fopen("master.txt","r");
if(file == NULL)
{
printf("Error opening master.txt\n");
return 1;
}
fgets(prime,sizeof(prime),file);
fgets(al,sizeof(al),file);
fclose(file);
q = atoll(prime);
alpha = atoll(al);
printf("q = %lld\n",q);
printf("alpha = %lld\n",alpha);
Ya = power(alpha, Xa, q);
printf("Ya = %lld\n",Ya);
sprintf(strYa,"%lld\n",Ya);
FILE *value = fopen("userA.txt","w");
fputs(strYa,value);
fputs(prime,value);
fputs(al,value);
fclose(value);
printf("Waiting for userB...\n");
sleep(10);
FILE *userA = fopen("userB.txt","r");
if(userA == NULL)
{
printf("userB.txt not found\n");
return 1;
}
fgets(strC1,sizeof(strC1),userA);
fgets(strC2,sizeof(strC2),userA);
fclose(userA);
C1 = atoll(strC1);
C2 = atoll(strC2);
K = power(C1, Xa, q);
inverseK = inverse(K,q);
M = (C2 * inverseK) % q;
printf("Recovered Message = %lld\n",M);
return 0;
}User B
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
long long power(long long base, long long exp, long long mod)
{
long long res = 1;
base = base % mod;
while(exp > 0)
{
if(exp % 2 == 1)
res = (res * base) % mod;
base = (base * base) % mod;
exp = exp / 2;
}
return res;
}
int main()
{
long long k, Ya, K, q, alpha, M;
long long C1, C2;
char Y[20], Q[20], al[20];
char strC1[20], strC2[20];
printf("Enter message M: ");
scanf("%lld",&M);
printf("Enter random k: ");
scanf("%lld",&k);
FILE *userA = fopen("userA.txt","r");
if(userA == NULL)
{
printf("userA.txt not found\n");
return 1;
}
fgets(Y,sizeof(Y),userA);
fgets(Q,sizeof(Q),userA);
fgets(al,sizeof(al),userA);
fclose(userA);
Ya = atoll(Y);
q = atoll(Q);
alpha = atoll(al);
K = power(Ya,k,q);
C1 = power(alpha,k,q);
C2 = (K * M) % q;
printf("C1 = %lld\n",C1);
printf("C2 = %lld\n",C2);
sprintf(strC1,"%lld\n",C1);
sprintf(strC2,"%lld\n",C2);
FILE *userB = fopen("userB.txt","w");
fputs(strC1,userB);
fputs(strC2,userB);
fclose(userB);
return 0;
}