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

📄 rsa.c

📁 加密算法。
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "rsa_incl.h"
#include "r_random.h"
#include "rsa.h"
#include "nn.h"

static int rsapublicfunc PROTO_LIST((unsigned char *, unsigned int *, unsigned char *, unsigned int, R_RSA_PUBLIC_KEY *));
static int rsaprivatefunc PROTO_LIST((unsigned char *, unsigned int *, unsigned char *, unsigned int, R_RSA_PRIVATE_KEY *));



int mainrsa()
{
//	int status;
//	R_RSA_PUBLIC_KEY publicKey;    /* new RSA public key */
//	R_RSA_PRIVATE_KEY privateKey;  /* new RSA private key */
	R_RSA_PROTO_KEY protoKey;      /* RSA prototype key */
	R_RANDOM_STRUCT randomStruct;  /* random structure */

	R_RSA_PUBLIC_KEY publicKey1;    /* new RSA public key */
	R_RSA_PRIVATE_KEY privateKey1;  /* new RSA private key */

//	unsigned char output[128];
	unsigned int outputLen;        /* length of output block */
//	unsigned char input[130];           /* input block */
	unsigned int inputLen=117;          /* length of input block */

	FILE * infile;
	FILE * outfile;

//	DWORD start,end;
	char filename[100];

	R_RandomCreate(&randomStruct);

	protoKey.bits=1024;
	protoKey.useFermat4=1;

	strcpy(filename,"PEMKeys");
//	status=R_GeneratePEMKeys(&publicKey, &privateKey, &protoKey, &randomStruct);
//	SaveKeys(filename,publicKey,privateKey);
	LodeKeys(filename,&publicKey1,&privateKey1);

/////////////////////////////////////////////////////////////////
/*
	infile=fopen("input.txt","rb");
	outfile=fopen("output.txt","wb");
	fseek(infile, 0L, SEEK_END);
	inputLen=ftell(infile);
	fseek(infile,0L,SEEK_SET);

	FilePrivateEncrypt (outfile, &outputLen, infile, inputLen,&privateKey1);

	fclose(infile);
	fclose(outfile);

	infile=fopen("output.txt","rb");
	outfile=fopen("output2.txt","wb");
	fseek(infile, 0L, SEEK_END);
	inputLen=ftell(infile);
	fseek(infile,0L,SEEK_SET);

	FilePublicDecrypt (outfile, &outputLen, infile, inputLen,&publicKey1);

	fclose(infile);
	fclose(outfile);
*/
	infile=fopen("input.txt","rb");
	outfile=fopen("output.txt","wb");
	fseek(infile, 0L, SEEK_END);
	inputLen=ftell(infile);
	fseek(infile,0L,SEEK_SET);

	FilePublicEncrypt (outfile, &outputLen, infile, inputLen,&publicKey1);

	fclose(infile);
	fclose(outfile);

	infile=fopen("output.txt","rb");
	outfile=fopen("output2.txt","wb");
	fseek(infile, 0L, SEEK_END);
	inputLen=ftell(infile);
	fseek(infile,0L,SEEK_SET);

	FilePrivateDecrypt (outfile, &outputLen, infile, inputLen,&privateKey1);

	fclose(infile);
	fclose(outfile);



//////////////////////////////////////////////////////////////////////////////
/*
	R_memcpy(input,"ScanDisk checked drive C for problems, with the following results: Directory structure Scan Disk did not perform any.\0",inputLen+1);
	inputLen=117;          
	printf("%s\n",input);

	start = timeGetTime();
	status=RSAPublicEncrypt(output, &outputLen, input, inputLen, &publicKey1);
	end = timeGetTime();
	output[outputLen]=0;
	printf("%s--%d\n",output,outputLen);
	printf("PublicEncrypt time:%u\n" , end-start );

	R_memcpy(input,output,outputLen);
	inputLen=outputLen;


	start = timeGetTime();
	status=RSAPrivateDecrypt(output, &outputLen, input, inputLen, &privateKey1);
	end = timeGetTime();
	output[outputLen]=0;
	printf("%s--%d\n",output,outputLen);
	printf("PrivateDecrypt time:%u\n" , end-start );

	R_memcpy(input,output,outputLen);
	inputLen=outputLen;

	start = timeGetTime();
	status=RSAPrivateEncrypt(output, &outputLen, input, inputLen, &privateKey1);
	end = timeGetTime();
	output[outputLen]=0;
	printf("%s--%d\n",output,outputLen);
	printf("PrivateEncrypt time:%u\n" , end-start );

	R_memcpy(input,output,outputLen);
	inputLen=outputLen;

	start = timeGetTime();
	status=RSAPublicDecrypt(output, &outputLen, input, inputLen, &publicKey1);
	end = timeGetTime();
	output[outputLen]=0;
	printf("%s--%d\n",output,outputLen);
	printf("PublicDecrypt time:%u\n" , end-start );
*/

	return 0;
}

int SaveKeys(char* filename,R_RSA_PUBLIC_KEY publicKey,R_RSA_PRIVATE_KEY privateKey)
{
	FILE* KeyFile;

	KeyFile=fopen(filename,"wb");
	if( KeyFile== NULL )
		return 0;
	
	fwrite(&publicKey,sizeof(R_RSA_PUBLIC_KEY),1,KeyFile);
	fwrite(&privateKey,sizeof(R_RSA_PRIVATE_KEY),1,KeyFile);

	fclose(KeyFile);
	return 1;
}


int LodeKeys(char* filename,R_RSA_PUBLIC_KEY * publicKey,R_RSA_PRIVATE_KEY * privateKey)
{
	FILE* KeyFile;

	KeyFile=fopen(filename,"rb");
	if( KeyFile== NULL )
		return 0;

	fread(publicKey,sizeof(R_RSA_PUBLIC_KEY),1,KeyFile);
	fread(privateKey,sizeof(R_RSA_PRIVATE_KEY),1,KeyFile);

	fclose(KeyFile);
	return 1;
}


int FilePublicEncrypt (FILE * output, unsigned int * outputLen, FILE * input, unsigned int inputLen,
    R_RSA_PUBLIC_KEY * publicKey)
{
	int ilen=inputLen;
	int outlen,olen=0;
	int inlen,ibufsize,obufsize;
	unsigned char ibuf[MAX_RSA_MODULUS_LEN];
	unsigned char obuf[MAX_RSA_MODULUS_LEN];

	ibufsize=(publicKey->bits + 7) / 8-11;

	while(ilen > 0)
	{
		inlen = fread(ibuf, sizeof(unsigned char),ibufsize, input);
		ilen -=inlen;

		RSAPublicEncrypt(obuf, &outlen, ibuf, inlen,publicKey);

		obufsize = fwrite(obuf, sizeof(unsigned char), outlen, output);
		olen+=obufsize;
	}

	*outputLen=olen;

	return 1;
}
int FilePrivateEncrypt (FILE * output, unsigned int * outputLen, FILE * input, unsigned int inputLen,
    R_RSA_PRIVATE_KEY * privateKey)
{
	int ilen=inputLen;
	int outlen,olen=0;
	int inlen,ibufsize,obufsize;
	unsigned char ibuf[MAX_RSA_MODULUS_LEN];
	unsigned char obuf[MAX_RSA_MODULUS_LEN];

	ibufsize=(privateKey->bits + 7) / 8-11;

	while(ilen > 0)
	{
		inlen = fread(ibuf, sizeof(unsigned char),ibufsize, input);
		ilen -=inlen;

		RSAPrivateEncrypt(obuf, &outlen, ibuf, inlen,privateKey);

		obufsize = fwrite(obuf, sizeof(unsigned char), outlen, output);
		olen+=obufsize;
	}

	*outputLen=olen;

	return 1;
}

int FilePublicDecrypt (FILE * output, unsigned int * outputLen, FILE * input, unsigned int inputLen,
    R_RSA_PUBLIC_KEY * publicKey)
{
	int ilen=inputLen;
	int outlen,olen=0;
	int inlen,ibufsize,obufsize;
	unsigned char ibuf[MAX_RSA_MODULUS_LEN];
	unsigned char obuf[MAX_RSA_MODULUS_LEN];

	ibufsize=(publicKey->bits + 7) / 8;

	while(ilen > 0)
	{
		inlen = fread(ibuf, sizeof(unsigned char),ibufsize, input);
		ilen -=inlen;

		RSAPublicDecrypt(obuf, &outlen, ibuf, inlen,publicKey);

		obufsize = fwrite(obuf, sizeof(unsigned char), outlen, output);
		olen+=obufsize;
	}

	*outputLen=olen;

	return 1;
}

int FilePrivateDecrypt (FILE * output, unsigned int * outputLen, FILE * input, unsigned int inputLen,
    R_RSA_PRIVATE_KEY * privateKey)
{
	int ilen=inputLen;
	int outlen,olen=0;
	int inlen,ibufsize,obufsize;
	unsigned char ibuf[MAX_RSA_MODULUS_LEN];
	unsigned char obuf[MAX_RSA_MODULUS_LEN];

	ibufsize=(privateKey->bits + 7) / 8;

	while(ilen > 0)
	{
		inlen = fread(ibuf, sizeof(unsigned char),ibufsize, input);
		ilen -=inlen;

		RSAPrivateDecrypt(obuf, &outlen, ibuf, inlen,privateKey);

		obufsize = fwrite(obuf, sizeof(unsigned char), outlen, output);
		olen+=obufsize;
	}

	*outputLen=olen;

	return 1;
}

/* RSA encryption, according to RSADSI's PKCS #1. */

//int RSAPublicEncrypt(output, outputLen, input, inputLen, publicKey, randomStruct)
int RSAPublicEncrypt(output, outputLen, input, inputLen, publicKey)
unsigned char *output;          /* output block */
unsigned int *outputLen;        /* length of output block */
unsigned char *input;           /* input block */
unsigned int inputLen;          /* length of input block */
R_RSA_PUBLIC_KEY *publicKey;    /* RSA public key */
//R_RANDOM_STRUCT *randomStruct;  /* random structure */
{
	int status;
	unsigned char byte, pkcsBlock[MAX_RSA_MODULUS_LEN];
	unsigned int i, modulusLen;

	modulusLen = (publicKey->bits + 7) / 8;

	if(inputLen + 11 > modulusLen)
        return(RE_LEN);
/*
    R_GetRandomBytesNeeded(&i, randomStruct);
    if(i != 0)
        return(RE_NEED_RANDOM);

	*pkcsBlock = 0;                 // PKCS Block Makeup 

		// block type 2 
	*(pkcsBlock+1) = 2;

	for(i = 2; i < modulusLen - inputLen - 1; i++) {
		// Find nonzero random byte. 
		do {    // random bytes used to pad the PKCS Block 
			R_GenerateBytes(&byte, 1, randomStruct);
		}while(byte == 0);
		*(pkcsBlock+i) = byte;
	}

	// separator 
	pkcsBlock[i++] = 0;

	R_memcpy((POINTER)&pkcsBlock[i], (POINTER)input, inputLen);
*/

	i=0;

	*pkcsBlock = 0;                 // PKCS Block Makeup 

		// block type 2 
	*(pkcsBlock+1) = 2;

	for(i = 2; i < modulusLen - inputLen - 1; i++) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -