要使用rsa加密,本来准备在网上找rsa加密算法,但是找到的c源码都不太好用,后来搜索到openssl库有实现rsa算法的函数,就根据网上搜索的内容,自己封装了几个rsa加密API.
rsa算法原理说明网上有很多,大家可以自行搜索。
下面重点介绍openssl 下rsa加密的实现
参考文章:
http://blog.csdn.net/small_qch/article/details/19330211?utm_source=tuicool
http://www.cnblogs.com/aLittleBitCool/archive/2011/09/22/2185418.html
http://www.cppblog.com/sleepwom/archive/2010/01/11/105418.html
http://bbs.csdn.net/topics/360083130
http://blog.csdn.net/huyiyang2010/article/details/38066273
http://wenku.baidu.com/link?url=y-KjF6NakXZHVGYdjjcM6nRyyjLGZM43B7TbQRAMv2wMLNbdwSlXrrPGZ-RJEFCPNt5qMMtgIupK6qmB7rWZtJ6PhSZfF7i28vHYZohhCSO
http://bbs.csdn.net/topics/290034327
http://blog.csdn.net/sagely/article/details/367125
根据网上搜索及自己亲自代码调试,完成rsa加解密签名
1:输入命令,生成公钥和私钥(1024位)
openssl genrsa -out prikey.pem 1024openssl rsa -in privkey.pem -pubout -out pubkey.pem
2. c代码实现
/*
rsa.h
openssl genrsa -out prikey.pem 1024
openssl rsa -in prikey.pem -pubout -out pubkey.pem
*/
#include
/*my_rsa_public_encrypt公钥加密与my_rsa_public_encrypt公钥解密配对
公钥加密,读取pubkey.pem来做加密
入参filename,保存公钥的文件名称,src待加密数据,加密数据长度
出参des加密后数据,deslen加密数据长度
src长度大于公钥长度时(RSA_size),会分段加密。
加密结果des比src长度大,所以需要给des分配比src更大的空间
例如密钥长度(RSA_size)为128,src长度为1~117,加密结果为128个字节。src长度为118~234,加密结果为256字节
*/
int my_rsa_public_encrypt(char *filename,unsigned char *src,int srclen,unsigned char *des,int *deslen);
/*私钥解密,读取prikey.pem来做解密
入参filename,保存公钥的文件名称,src待解密数据,srclen解密数据长度
出参des解密后数据,deslen解密数据长度*/
int my_rsa_prikey_decrypt(char *filename,unsigned char *src,int srclen,unsigned char *des,int *deslen);
/*my_rsa_prikey_encrypt私钥加密与my_rsa_public_decrypt公钥解密配对
私钥加密,读取prikey.pem来做加密。
入参filename,保存公钥的文件名称,src待加密数据,加密数据长度
出参des加密后数据,deslen加密数据长度
src长度大于公钥长度时(RSA_size),会分段加密。
加密结果des比src长度大,所以需要给des分配比src更大的空间
例如密钥长度(RSA_size)为128,src长度为1~117,加密结果为128个字节。src长度为118~234,加密结果为256字节
因此des的长度,应该比 RSA_size*(strlen(src)/(RSA_size-11)+1)大才行。
*/
int my_rsa_prikey_encrypt(char *filename,unsigned char *src,int srclen,unsigned char *des,int *deslen);
/*
公钥解密,读取public.pem来做解密
入参filename,保存公钥的文件名称,src待解密数据,srclen解密数据长度
出参des解密后数据,deslen解密数据长度
*/
int my_rsa_public_decrypt(char *filename,unsigned char *src,int srclen,unsigned char *des,int *deslen);
/* my_rsa_prikey_sign私钥签名
入参filename,私钥文件名称;
src待签名数据;
srclen待签名数据长度
出参des签名结果,返回结果长度为秘钥长度值,需分配比秘钥长度更大的空间,以免内存越界
deslen签名结果长