近期做程序,需要用到可信数据传输,进而想到了非对称加密,虽然懂得数学原理,但自己实现起来太过繁琐,且不能保证效率,所以在网上搜索成品,无奈废品太多,好在找到一个名叫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); }
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