OpenSsl库 Rsa的简单使用

Posted 夜已深茶已凉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenSsl库 Rsa的简单使用相关的知识,希望对你有一定的参考价值。

环境的配置可以参考http://www.cnblogs.com/yangyquin/p/5284530.html

网络上传输的数据很容易被抓包,如果不加密,那么网络数
据很容易被窃取,诸如用户名、密码这些明感的信息一旦丢
失,将会造成巨大的损失。
2、常用的加密方式
对称加密:加密方和解密方使用同一个秘钥
                  优点:加密解密过程简单,高效
                  缺点:有一 方泄密了,则整个加密就失去了意义
非对称加密:加密方和解密方使用不同的秘钥
                  优点:解密的秘钥无法由加密的秘钥,即使加密方暴露出  了秘钥也没事,这种加密方和解密方使用不同的秘  钥,大大提高了安全性
                  缺点:效率比较低下,过程比较繁琐
3、辅助概念
1、质数的概念
2、互为质数的概念
4、RSA加密秘钥的获取
step1:随机选取两个数p、q,满足互质
 
step2:n=p*q,//公开模数 Public Modules,其二进制位数即为                           秘钥长度
step3:g=f(p,q)=(p-1)*(q-1)
step4:在1和g之间任意一个随机整数e,满足1<e<g,//Public                          Exponent,公开指数
step5:由 e*d mod g = 1 关系式推导出来d,//Private Exponent,  私有指数
5、RSA加密秘钥的获取
RSA算法中的:
           公开秘钥=(e,n)
           私有秘钥=(d,n)
6、RSA加密解密算法
加密算法:设M为需要加密的明文数据
   则加密算法为:Encrypt_Message = M^e mod n
解密算法:设D为需要解密的密文数据
    则解密算法为:Decrypt_Message = D^d mod n
 
8、RSA算法缺点
1 效率非常低下
2 密文数据较之原数据,其长度大大增加,即数据冗余太严重
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <Windows.h>
  4 #include <openssl/rsa.h>
  5 #include <openssl/err.h>
  6 #pragma comment(lib,"libeay32.lib")
  7 #pragma comment(lib,"ssleay32.lib")
  8 #define P "BCF3"
  9 #define Q "116AB"
 10 #define N "CDAE1851"
 11 #define E "10001"
 12 #define D "8C88F2A5"
 13 int My_Rsa_public_encrypt(int flen, const unsigned char *from, unsigned char *to);
 14 int My_Rsa_private_decrypt(int flen, const unsigned char *from, unsigned char *to);
 15 
 16 int main(void)
 17 {
 18     char* from ="456";
 19     unsigned char sz [500]={0};
 20     unsigned char decsz[500]={0};
 21     My_Rsa_public_encrypt(lstrlen(from)+1,(unsigned char*)from,sz);
 22     My_Rsa_private_decrypt(lstrlen((char*)sz),sz,decsz);
 23     system("pause");
 24     return 0;
 25 }
 26 int My_Rsa_public_encrypt(int flen, const unsigned char *from, unsigned char *to)
 27 {
 28     RSA* rSa = RSA_new();
 29     if (!rSa)return -1;
 30     BIGNUM * bIgnUm = BN_new();
 31     BIGNUM * bIgnUe = BN_new();
 32     if (!bIgnUe || !bIgnUm)
 33     {
 34         RSA_free(rSa);
 35         BN_free(bIgnUe);
 36         BN_free(bIgnUm);
 37         return -1;
 38     }
 39     BN_init(bIgnUm);
 40     BN_init(bIgnUe);
 41     BN_hex2bn(&bIgnUm,N);
 42     BN_hex2bn(&bIgnUe,E);
 43     rSa->n = bIgnUm;
 44     rSa->e = bIgnUe;
 45     ERR_load_crypto_strings();
 46     int nRet = RSA_public_encrypt(flen,from,to,rSa,RSA_NO_PADDING);
 47     DWORD dwError = ERR_get_error();
 48     if(nRet<0)
 49     {
 50         printf("%s\\r\\n",ERR_lib_error_string(dwError));
 51         printf("%s\\r\\n",ERR_func_error_string(dwError));
 52         printf("%s\\r\\n",ERR_reason_error_string(dwError));
 53         BN_free(bIgnUm);
 54         BN_free(bIgnUe);
 55         RSA_free(rSa);
 56         return -1;
 57     }
 58     printf("%X\\r\\n",*(PDWORD)to);
 59     ERR_free_strings();
 60     BN_free(bIgnUe);
 61     BN_free(bIgnUm);
 62     RSA_free(rSa);
 63     return 1;
 64     
 65 }
 66 int My_Rsa_private_decrypt(int flen, const unsigned char *from, unsigned char *to)
 67 {
 68     RSA* rSa = RSA_new();
 69     if (!rSa)return -1;
 70     BIGNUM * bIgnUm = BN_new();
 71     BIGNUM *bIgnUp = BN_new();
 72     BIGNUM * bIgnUe = BN_new();
 73     if (!bIgnUe || !bIgnUm ||!bIgnUp)
 74     {
 75         RSA_free(rSa);
 76         BN_free(bIgnUe);
 77         BN_free(bIgnUm);
 78         BN_free(bIgnUp);
 79         return -1;
 80     }
 81     BN_init(bIgnUm);
 82     BN_init(bIgnUe);
 83     BN_init(bIgnUp);
 84     BN_hex2bn(&bIgnUp,E);
 85     BN_hex2bn(&bIgnUm,N);
 86     BN_hex2bn(&bIgnUe,D);
 87     rSa->n = bIgnUm;
 88     rSa->d = bIgnUe;
 89     rSa->e = bIgnUp;
 90     ERR_load_crypto_strings();
 91     int nRet = RSA_private_decrypt(flen,from,to,rSa,RSA_NO_PADDING);
 92     DWORD dwError = ERR_get_error();
 93     if(nRet<0)
 94     {
 95         printf("%s\\r\\n",ERR_lib_error_string(dwError));
 96         printf("%s\\r\\n",ERR_func_error_string(dwError));
 97         printf("%s\\r\\n",ERR_reason_error_string(dwError));
 98         BN_free(bIgnUm);
 99         BN_free(bIgnUe);
100         RSA_free(rSa);
101         return -1;
102     }
103     printf("%s\\r\\n",to);
104     ERR_free_strings();
105     BN_free(bIgnUe);
106     BN_free(bIgnUm);
107     BN_free(bIgnUp);
108     RSA_free(rSa);
109     return 1;
110 }

 

 
 
 
 
 
 
 

以上是关于OpenSsl库 Rsa的简单使用的主要内容,如果未能解决你的问题,请参考以下文章

用openssl库RSA加密解密

如何利用OpenSSL库进行RSA加密和解密

利用openssl进行RSA加密解密

Java中使用OpenSSL生成的RSA公私钥

openssl rsa/pkey

iOS端使用DSA加密