使用RSA算法加密数据

近期做程序,需要用到可信数据传输,进而想到了非对称加密,虽然懂得数学原理,但自己实现起来太过繁琐,且不能保证效率,所以在网上搜索成品,无奈废品太多,好在找到一个名叫RSAEuro的开源代码,包含了RSA和MD5实现,经过整理可以使用,在此做个记录。

此代码有如下特点:

1.知道解密结果是否正确(省去了在数据里加校验和)

2.知道解密后的数据大小(省去了在数据里标明大小)

3.在用公钥加密数据时用到了随机数,即每次加密相同的数据结果都不一样(省去了在数据里随机数)

4.公钥加密私钥解密,私钥加密公钥解密(一对密钥即可相互传输数据)

5.支持512/1024/2048三种级别的加密

示例代码:

生成密钥对

	R_RSA_PUBLIC_KEY  PubKey;
	R_RSA_PRIVATE_KEY PriKey;
	R_RANDOM_STRUCT   RandSt;
	R_RSA_PROTO_KEY   ProKey;

	//生成密钥对
	R_RandomCreate(&RandSt);
	ProKey.bits = 1024;//512 or 1024 or 2048
	ProKey.useFermat4 = 1;
	R_GeneratePEMKeys(&PubKey, &PriKey, &ProKey, &RandSt);


一对密钥相互加解密

	//公钥加密私钥解密
	char *TestBuffer = "Hello!Sid!!!";
	{
		unsigned char EncryptBuffer[128] = {0};
		unsigned char DecryptBuffer[128] = {0};
		unsigned int InputLen = sizeof(EncryptBuffer);
		unsigned int OutputLen = sizeof(DecryptBuffer);

		R_RandomCreate(&RandSt);
		RSAPublicEncrypt(EncryptBuffer, &InputLen, (unsigned char*)TestBuffer, strlen(TestBuffer), &PubKey, &RandSt);
		RSAPrivateDecrypt(DecryptBuffer, &OutputLen, EncryptBuffer, InputLen, &PriKey);
		printf("Test1:%s\n", DecryptBuffer);
	}
	//私钥加密公钥解密
	{
		unsigned char EncryptBuffer[128] = {0};
		unsigned char DecryptBuffer[128] = {0};
		unsigned int InputLen = sizeof(EncryptBuffer);
		unsigned int OutputLen = sizeof(DecryptBuffer);

		RSAPrivateEncrypt(EncryptBuffer, &InputLen, (unsigned char*)TestBuffer, strlen(TestBuffer), &PriKey);
		RSAPublicDecrypt(DecryptBuffer, &OutputLen, EncryptBuffer, InputLen, &PubKey);
		printf("Test2:%s\n", DecryptBuffer);
	}


输出密钥数据到文件中

	if (FILE *f = fopen("pub.key", "wb"))
	{
		fwrite(&PubKey, sizeof(PubKey), 1, f);
		fclose(f);
	}
	if (FILE *f = fopen("pri.key", "wb"))
	{
		fwrite(&PriKey, sizeof(PriKey), 1, f);
		fclose(f);
	}


读取key文件并做加密测试

int _tmain(int argc, _TCHAR* argv[])
{
	R_RSA_PUBLIC_KEY  PubKey;
	R_RSA_PRIVATE_KEY PriKey;

	if (FILE *f = fopen("pub.key", "rb"))
	{
		fread(&PubKey, sizeof(PubKey), 1, f);
		fclose(f);
	}
	if (FILE *f = fopen("pri.key", "rb"))
	{
		fread(&PriKey, sizeof(PriKey), 1, f);
		fclose(f);
	}
	//
	char *TestBuffer = "Hello!Sid!!!";
	{
		unsigned char EncryptBuffer[128] = {0};
		unsigned char DecryptBuffer[128] = {0};
		unsigned int InputLen = sizeof(EncryptBuffer);
		unsigned int OutputLen = sizeof(DecryptBuffer);

		RSAPrivateEncrypt(EncryptBuffer, &InputLen, (unsigned char*)TestBuffer, strlen(TestBuffer), &PriKey);
		RSAPublicDecrypt(DecryptBuffer, &OutputLen, EncryptBuffer, InputLen, &PubKey);
		printf("Test2:%s\n", DecryptBuffer);
	}
	getchar();
	return 0;
}


也可以把这两个结构体数据以字节数组的方式写在代码中

另外我还精简出了一份代码,不使用任何os api,可以方便的移植到内核模块或者其他平台,但不能生成密钥对、不能使用公钥加密

好吧我懒了,其实就是没找到time、clock、gmtime在windows内核中的替代函数而已

需要注意的是,每次加密的数据大小不能超过(位数/8)-11字节

以1024加密为例,1024bit=128byte,每次能把不超过117字节的数据加密为128字节的数据

最后附上下载地址:

http://download.csdn.net/detail/sidyhe/7872799

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值