⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsa_test.c

📁 1、DES加密示例程序
💻 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 + -