RSA加密及openssl的使用

2019-04-13 20:52发布

  1:rsa加密 原理:欧拉公式,本质,大数分解在现有计算力下,很难再极短时间内找到解 参考:https://blog.csdn.net/jizhen_tan/article/details/79253851 秘钥长度,指的是模值的位长度,主流为1024,2048... RSA秘钥:(公钥+模值),(私钥+模值),成对出现 公钥指数:普遍为65537(0x10001,5bits)有意的把公钥指数选的小一点,但是对应私钥指数肯定很大,意图也很明确,大家都要用公钥加密,所以大家时间很宝贵,需要快一点,私钥是个人解密,所以慢一点。 私钥指数:习惯为小于1024bit的大整数   以下参考:https://blog.csdn.net/lvxiangan/article/details/45487943 2:明文长度 网上有说明文长度小于等于密钥长度(Bytes)-11,这说法本身不太准确,会给人感觉RSA 1024只能加密117字节长度明文。实际上,RSA算法本身要求加密内容也就是明文长度m必须0n,运算就会出错?!那怎么办?且听下文分解。 只要用到padding,那么就要占用实际的明文长度,于是才有117字节的说法。我们一般使用的padding标准有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建议的padding就占用了11个字节。   3:密文长度 密文长度就是给定符合条件的明文加密出来的结果位长,这个可以确定,加密后的密文位长跟密钥的位长度是相同的   4:简介 OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。在OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站使用名为OpenSSL的开源软件包。由于这是互联网应用最广泛的安全传输方法,被网银、在线支付、电商网站、门户网站、电子邮件等重要网站广泛使用,所以该漏洞影响范围广大。   5:rsa使用 参考: https://blog.csdn.net/yyxyong/article/details/77827870 1)生成一个密钥: openssl genrsa -out prikey.pem 1024 这里-out指定生成文件的。需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成密钥的长度。 2)openssl可以将这个文件中的公钥提取出来: openssl rsa -in prikey.pem -pubout -out pubkey.pem -in指定输入文件,-out指定提取生成公钥的文件名。至此,我们手上就有了一个公钥,一个私钥(包含公钥)。现在可以将用公钥来加密文件了。 3)在目录中创建一个hello的文本文件,然后利用此前生成的公钥加密文件: openssl rsautl -encrypt -in hello -inkey pubkey.pem -pubin -out hello.en -in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。 4)解密文件: openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de -in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。 #include #include #include #include #include #include #include #define pubkey_path "pubkey.pem" #define prikey_path "prikey.pem" char *auth_encrypt(char *data, char *key_path); //加密 char *auth_decrypt(char *data, char *key_path); //解密 // encrypt char *auth_encrypt(char *data, char *key_path) { char *encrypted_data = NULL; RSA *rsa_key = NULL; FILE *file = NULL; int length = 0; //1.打开秘钥文件 if ((file = fopen(key_path, "rb")) == NULL) { perror("fopen() error"); goto End; } //2.从公钥中获取 加密的秘钥 if ((rsa_key = PEM_read_RSA_PUBKEY(file, NULL,NULL,NULL )) == NULL){ ERR_print_errors_fp(stdout); goto End; } length = strlen(data); encrypted_data = (char *)malloc(256); if (!encrypted_data) { perror("malloc() error"); goto End; } memset(encrypted_data, 0, 256); //3. encrypt if (RSA_public_encrypt(length, (unsigned char*)data, (unsigned char*)encrypted_data, rsa_key, RSA_PKCS1_PADDING) < 0) { perror("RSA_public_encrypt()"); goto End; } End: if (rsa_key) { RSA_free(rsa_key); } if (file) { fclose(file); } return encrypted_data; } // decrypt char *auth_decrypt(char *data, char *key_path) { char *decrypted_data = NULL; RSA *rsa_key = NULL; FILE *file = NULL; // 1.打开秘钥文件 if ((file = fopen(key_path, "rb")) == NULL) { perror("fopen() error"); goto End; } // 2.从私钥中获取 解密的秘钥 if ((rsa_key = PEM_read_RSAPrivateKey(file, NULL,NULL,NULL )) == NULL){ ERR_print_errors_fp(stdout); goto End; } decrypted_data = (char *)malloc(245); if (!decrypted_data) { perror("malloc() error"); goto End; } memset(decrypted_data, 0, 245); // 3.decrypt if(RSA_private_decrypt(256, (unsigned char*)data, (unsigned char*)decrypted_data, rsa_key, RSA_PKCS1_PADDING) < 0) { perror("RSA_public_encrypt() error"); goto End; } End: if (rsa_key) { RSA_free(rsa_key); } if (file) { fclose(file); } return decrypted_data; } int main(void) { char *source = "{"cip": "20.31数数据"}"; char *ptf_en, *ptf_de; printf("source is :%s ", source); //1.加密 ptf_en = auth_encrypt(source, pubkey_path); if (ptf_en == NULL){ return 0; } else { printf("ptf_en is :%s ", ptf_en); } //2.解密 ptf_de = auth_decrypt(ptf_en, prikey_path); if (ptf_de == NULL){ return 0; } else { printf("ptf_de is :%s ", ptf_de); } if(ptf_en) free(ptf_en); if(ptf_de) free(ptf_de); return 0; } 6:openssl 实现rsa,读取文件 参考:https://www.jianshu.com/p/51f8430f9c42