📄 rsa_test.c
字号:
/*
@RSA_Jinyu_06072202
*/
#include "stdio.h"
#define P 17
#define Q 29
long t1[3] = {0}, t2[3] = {0};
/*
long GCD(long m, long n)
{
long temp = 0;
if(m == 0 && n == 0) return 1;
else if(m == 0) return n;
else if(n == 0) return m;
else
{
if(m > n)
{
temp = m % n;
if(temp == 0) return n;
else
{
m = temp;
temp = GCD(m, n);
}
}
else
{
temp = n % m;
if(temp == 0) return m;
else
{
n = temp;
temp = GCD(m, n);
}
}
}
}
*/
long GCD(long m,long n)
{
long temp=m;
long r;
if(m < n) /* swap m,n*/
{
m = n;
n = temp;
}
if(0 == m)
{
printf("You must enter one number much than zero!");
getch();
exit(1);/*abnormity*/
}
while(n != 0)
{
r = m % n;
m = n;
n = r;
}
return m;
}
long GetReverse(long d, long fn, long t1[], long t2[])
{
long t[3] = {0};
long q = 0;
int i = 0;
t1[0] = 1; t1[1] = 0; t1[2] = fn;
t2[0] = 0; t2[1] = 1; t2[2] = d;
while(1)
{
if(t2[2] == 0) return -1;
else if(t2[2] == 1)
{
if(t2[1] < 0) t2[1] += fn;
return t2[1];
}
q = t1[2] / t2[2];
t[0] = t1[0] - q * t2[0];
t[1] = t1[1] - q * t2[1];
t[2] = t1[2] - q * t2[2];
for(i = 0; i < 3; i++)
{
t1[i] = t2[i];
t2[i] = t[i];
}
}
}
long min(long m, long n)
{
if(m >= n) return n;
else return m;
}
long ChoiceSK(long s, long fn)
{
long choice = 0, temp = 0;
printf("\n\t=====RSA_Test By JinYu_06072202=====\n");
printf("\n\tSelect a Integer From %ld to %ld: ", s, fn);
while(1)
{
scanf("%d", &choice);
temp = GCD(choice, fn);
if(temp == 1) return choice;
else printf("\n\tRetry!");
}
}
long Encrypt(int M, long PKe, long n)
{
long i = 0, C = 0;
C = M;
for(; i < PKe-1; i++)
{
C = (M * C) % n;
}
return C;
}
long Decrypt(int C, long SKd, long n)
{
long i = 0, M = 0;
M = C;
for(; i < SKd-1; i++)
{
M = (M * C) % n;
}
return M;
}
void Encryption(long PKe, long n)
{
long M = 0, C = 0;
FILE *fptrI = NULL, *fptrO = NULL;
char extension[] = ".txt";
char file_name_out[10];
char file_name_in[10];
printf("\n\tMessageFile name(No Extension):\t");
scanf("%s",file_name_in);
printf("\n\n\tOutputFile name(No Extension):\t");
scanf("%s",file_name_out);
strcat(file_name_in,extension);
strcat(file_name_out,extension);
fptrI = fopen(file_name_in,"rb");
fptrO = fopen(file_name_out,"a+");
while(fread(&M,sizeof(char),1,fptrI))
{
C = Encrypt(M, PKe, n);
fwrite(&C,sizeof(int),1,fptrO);
}
fclose(fptrI);
fclose(fptrO);
}
void Decryption(long SKd, long n)
{
int M = 0, C = 0;
FILE *fptrI = NULL, *fptrO = NULL;
char extension[] = ".txt";
char file_name_out[10];
char file_name_in[10];
printf("\n\n\tCryptedFile name(No Extension):\t");
scanf("%s",file_name_in);
printf("\n\n\tOutputMFile name(No Extension):\t");
scanf("%s",file_name_out);
strcat(file_name_in,extension);
strcat(file_name_out,extension);
fptrI = fopen(file_name_in,"rb");
fptrO = fopen(file_name_out,"a+");
while(fread(&C,sizeof(int),1,fptrI))
{
/*printf("\n\t%d", (int)C);*/
M = Encrypt(C, SKd, n);
fprintf(fptrO, "%c", (char)M);
}
fclose(fptrI);
fclose(fptrO);
}
int InitMenu()
{
int choice = 0;
printf("\n\t ============ Menu ==========\n");
printf("\t 1.Encrypt 2.Decrypt 0.Exit\n");
printf("\t =========== S-RSA ==========\n");
printf("\t Enter Command Here: ");
scanf("%d", &choice);
return choice;
}
int main()
{
long n = 0, fn = 0, temp = 0, SKd = 0, PKe = 0;
int choice = 0;
/*Initialize*/
n = P * Q;
fn = (P-1) * (Q-1);
/*Ends*/
/*GetKey*/
temp = min(P, Q);
SKd = ChoiceSK(temp, fn);
/*End*/
/*Caculate PKe*/
PKe = GetReverse(SKd, fn, t1, t2);
printf("\n\t<PKe: %ld, SKd: %ld>\n", PKe, SKd);
/*Ends*/
while(1)
{
choice = InitMenu();
if(choice == 1)
/*Encrypt*/
Encryption(PKe, n);
/*Ends*/
else if(choice == 2)
/*Decrypt*/
Decryption(SKd, n);
/*Ends*/
else exit(0);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -