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 }
时间: 2024-08-13 10:28:29

OpenSsl库 Rsa的简单使用的相关文章

用openssl库RSA加密解密

1 #include <stdio.h> 2 #include <openssl/rsa.h> 3 #include <openssl/pem.h> 4 #include <openssl/err.h> 5 6 //加密 7 int my_encrypt(const char *input, int input_len, char *output, int *output_len, const char *pri_key_fn) 8 { 9 RSA *p_r

使用openssl库实现RSA、AES数据加密

使用openssl库实现RSA.AES数据加密 openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加密:公钥加密,私钥解密.openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所以一般的做法是使用对称密钥加密数据,然后再把这个只在当前有效的临时生成的对称密钥用非对称密钥的公钥加密之后传递给目标方,目标方使用约定好的非对称密钥中的私钥解开,得到数据加密的密钥,再进行数据解密,得到数据,这种使用方式很常见,可以认为是对HTTPS的裁剪.对称

RSA加解密 私钥加密公钥解密 私加公解 &amp;&amp; C++ 调用openssl库 的代码实例

前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密  私加 ============================================== // 私钥加密 std::string rsa_pri_encrypt(const std::string &clearText, std::string &pubKey) { std::string strRet; BIO *keybio

iOS App中 使用 OpenSSL 库

转自:http://blog.csdn.net/kmyhy/article/details/6534067 在你的 iOS App中 使用 OpenSSL 库 ——译自x2on的“Tutorial: iPhone App with compiled OpenSSL 1.0.0a Library” 原文地址:http://www.x2on.de/2010/07/13/tutorial-iphone-app-with-compiled-openssl-1-0-0a-library/,本文有少许地方做

在你的 iOS App中 使用 OpenSSL 库

在你的 iOS App中 使用 OpenSSL 库 ——译自x2on的“Tutorial: iPhone App with compiled OpenSSL 1.0.0a Library” 原文地址:http://www.x2on.de/2010/07/13/tutorial-iphone-app-with-compiled-openssl-1-0-0a-library/ ,本文有少许地方做了调整. 1.下载OpenSSL源代码库: http://www.openssl.org/source/

利用openssl进行RSA加密解密

openssl是一个功能强大的工具包,它集成了众多密码算法及实用工具.我们即可以利用它提供的命令台工具生成密钥.证书来加密解密文件,也可以在利用其提供的API接口在代码中对传输信息进行加密. RSA是一个非对称加密算法.简单说来,非对称加密算法就是说加密解密一个文件需要有两个密钥,一个用来加密,为公钥,一个用来解密,为私钥.证书可以用来授权公钥的使用. 今天小研究了下openssl的rsa加密,其中主要涉及利用公钥和密钥加解密文件,没有涉及对证书的操作.想要集体了解的可以去: http://ww

Windows下 OpenSSL的安装与简单使用

1. openssl的最新版本 最新版本是 openssl1.1.1 官方地址 https://www.openssl.org/source/ TLS1.3的协议(RFC8446)在2018.8.12发布之后一个月之内 openssl1.1.1 就发布 支持tls1.3了. 可以在linux 下面编译使用. 2. 这里为了适应 准备在windows平台下进行openssl的安装与使用 方法主要是有两个 一个是 安装 openssl的必要的运行依赖环境,然后编译安装openssl 但是这个感觉比较

linux学习 建立静态库,动态库,写简单的makefile

建立静态库 建立四个文件 bin(可执行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件中执行 1)gcc -c add.c //编译add.c源文件生成add.o目标文件 2)ar crsv ../lib/ libadd.a add.o //对目标文件*.o进行归档,生成lib*.a, 把这个生成文件放在lib里 3)gcc -o main main.c -L(大些的爱偶,放库的路径)../lib   –l(小写的爱偶,库名为add) a

使用OpenSSL做RSA签名验证 支付宝移动快捷支付 的server异步通知

因为业务须要.我们须要使用支付宝移动快捷支付做收款.支付宝给了我们<移动快捷支付应用集成接入包支付接口>见支付宝包<WS_SECURE_PAY_SDK>. 支付宝给的serverdemo仅仅有Java.C#.PHP三种,而我们server端使用的是C++. 这当中就涉及到接收支付宝的server异步通知.为了确保接收到的server异步通知来至支付宝,我们就必须验证支付宝的签名. 坑爹的是,原来PC端使用MD5做签名,预计支付宝考虑到移动端的风险更高,于是改用RSA做移动快捷支付应