1. RSA加密和解密基础概念

RSA是一种非对称加密。

RSA秘钥:私钥和公钥,一对私钥和公钥就像夫妻一样是唯一的,用私钥加密后必须用对应的公钥才能解密,用公钥加密后必须用对应的私钥才能解密。

加密和解密方式:公钥加密-私钥解密,私钥加密-公钥解密

2. 使用OpenSSL库进行RSA加密和解密的基础过程

加密基础过程
       1) 调用OpenSSL库生成秘钥(非必要步骤,如果已经有秘钥对了,就不需要进行这步了)

2) 调用OpenSSL库对明文进行加密

2) 对加密后密文进行BASE64转码(非必要步骤,一般开发过程中,为了传输or存贮方便,都会对密文进行BASE64编码)

注意:OpenSSL的RSA加密接口,每次加密数据的最大长度是有限制的,所以对“较大数据”进行加密,需要循环对“较大数据”分段加密

解密基础过程
       1)对BASE64内容进行BASE64解码

2) 调用OpenSSL库对密文进行解密

注意:OpenSSL的RSA解密接口,每次解密数据的最大长度是有限制的,所以对“较大数据”进行解密,需要循环对“较大数据”分段解密

3. 直接上代码

私钥和公钥格式
   说明:C++ OpenSSL中RSA秘钥(公钥和私钥)是有起止标识的,并且每64个字节会有一个换行符(\n),这个可能和其他编程语言(例如Java)是不同的。据我所知Java中秘钥是没有起止标识,只有秘钥内容的,也没有换行符(\n)(个人开发中遇到的情形,也不排除有其他情形的)

1)私钥格式

(据我所知)私钥的起止标识只有一种。

起始标识:-----BEGIN RSA PRIVATE KEY-----
        结束标识:-----END RSA PRIVATE KEY-----

2)·公钥格式

(据我所知)公钥的起止标识有两种。

第一种
        起始标识:-----BEGIN RSA PUBLIC KEY-----
        结束标识:-----END RSA PUBLIC KEY-----

第二种
        起始标识:-----BEGIN PUBLIC KEY-----
        结束标识:-----END PUBLIC KEY-----

生成秘钥对(公钥和私钥)

#include <fstream>
#include "openssl/rsa.h"#define KEY_LENGTH  2048             // 密钥长度
#define PUB_KEY_FILE "pubkey.pem"    // 公钥路径
#define PRI_KEY_FILE "prikey.pem"    // 私钥路径/*
制造密钥对:私钥和公钥
**/
void GenerateRSAKey(std::string & out_pub_key, std::string & out_pri_key)
{size_t pri_len = 0; // 私钥长度size_t pub_len = 0; // 公钥长度char *pri_key = nullptr; // 私钥char *pub_key = nullptr; // 公钥// 生成密钥对RSA *keypair = RSA_generate_key(KEY_LENGTH, RSA_3, NULL, NULL);BIO *pri = BIO_new(BIO_s_mem());BIO *pub = BIO_new(BIO_s_mem());// 生成私钥PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL);// 注意------生成第1种格式的公钥//PEM_write_bio_RSAPublicKey(pub, keypair);// 注意------生成第2种格式的公钥(此处代码中使用这种)PEM_write_bio_RSA_PUBKEY(pub, keypair);// 获取长度  pri_len = BIO_pending(pri);pub_len = BIO_pending(pub);// 密钥对读取到字符串  pri_key = (char *)malloc(pri_len + 1);pub_key = (char *)malloc(pub_len + 1);BIO_read(pri, pri_key, pri_len);BIO_read(pub, pub_key, pub_len);pri_key[pri_len] = '\0';pub_key[pub_len] = '\0';out_pub_key = pub_key;out_pri_key = pri_key;// 将公钥写入文件std::ofstream pub_file(PUB_KEY_FILE, std::ios::out);if (!pub_file.is_open()){perror("pub key file open fail:");return;}pub_file << pub_key;pub_file.close();// 将私钥写入文件std::ofstream pri_file(PRI_KEY_FILE, std::ios::out);if (!pri_file.is_open()){perror("pri key file open fail:");return;}pri_file << pri_key;pri_file.close();// 释放内存RSA_free(keypair);BIO_free_all(pub);BIO_free_all(pri);free(pri_key);free(pub_key);
}

私钥加密-公钥解密
   1)对长度较短的数据加密和解密(数据长度小于RSA单次处理的最大长度)

/*
@brief : 私钥加密
@para  : clear_text  -[i] 需要进行加密的明文pri_key     -[i] 私钥
@return: 加密后的数据
**/
std::string RsaPriEncrypt(const std::string &clear_text, std::string &pri_key)
{std::string encrypt_text;BIO *keybio = BIO_new_mem_buf((unsigned char *)pri_key.c_str(), -1);RSA* rsa = RSA_new();rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);if (!rsa){BIO_free_all(keybio);return std::string("");}// 获取RSA单次可以处理的数据的最大长度int len = RSA_size(rsa);// 申请内存:存贮加密后的密文数据char *text = new char[len + 1];memset(text, 0, len + 1);// 对数据进行私钥加密(返回值是加密后数据的长度)int ret = RSA_private_encrypt(clear_text.length(), (const unsigned char*)clear_text.c_str(), (unsigned char*)text, rsa, RSA_PKCS1_PADDING);if (ret >= 0) {encrypt_text = std::string(text, ret);}// 释放内存  free(text);BIO_free_all(keybio);RSA_free(rsa);return encrypt_text;
}
/*
@brief : 公钥解密
@para  : cipher_text -[i] 加密的密文pub_key     -[i] 公钥
@return: 解密后的数据
**/
std::string RsaPubDecrypt(const std::string & cipher_text, const std::string & pub_key)
{std::string decrypt_text;BIO *keybio = BIO_new_mem_buf((unsigned char *)pub_key.c_str(), -1);RSA *rsa = RSA_new();// 注意--------使用第1种格式的公钥进行解密//rsa = PEM_read_bio_RSAPublicKey(keybio, &rsa, NULL, NULL);// 注意--------使用第2种格式的公钥进行解密(我们使用这种格式作为示例)rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL);if (!rsa){unsigned long err= ERR_get_error(); //获取错误号char err_msg[1024] = { 0 };ERR_error_string(err, err_msg); // 格式:error:errId:库:函数:原因printf("err msg: err:%ld, msg:%s\n", err, err_msg);BIO_free_all(keybio);return decrypt_text;}int len = RSA_size(rsa);char *text = new char[len + 1];memset(text, 0, len + 1);// 对密文进行解密int ret = RSA_public_decrypt(cipher_text.length(), (const unsigned char*)cipher_text.c_str(), (unsigned char*)text, rsa, RSA_PKCS1_PADDING);if (ret >= 0) {decrypt_text.append(std::string(text, ret));}// 释放内存  delete text;BIO_free_all(keybio);RSA_free(rsa);return decrypt_text;
}

2)对长度较长的数据加密和解密(数据长度大于RSA单次处理数据块的最大长度)

/*
@brief : 私钥加密
@para  : clear_text  -[i] 需要进行加密的明文pri_key     -[i] 私钥
@return: 加密后的数据
**/
std::string RsaPriEncrypt(const std::string &clear_text, std::string &pri_key)
{std::string encrypt_text;BIO *keybio = BIO_new_mem_buf((unsigned char *)pri_key.c_str(), -1);RSA* rsa = RSA_new();rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);if (!rsa){BIO_free_all(keybio);return std::string("");}// 获取RSA单次可以处理的数据块的最大长度int key_len = RSA_size(rsa);int block_len = key_len - 11;    // 因为填充方式为RSA_PKCS1_PADDING, 所以要在key_len基础上减去11// 申请内存:存贮加密后的密文数据char *sub_text = new char[key_len + 1];memset(sub_text, 0, key_len + 1);int ret = 0;int pos = 0;std::string sub_str;// 对数据进行分段加密(返回值是加密后数据的长度)while (pos < clear_text.length()) {sub_str = clear_text.substr(pos, block_len);memset(sub_text, 0, key_len + 1);ret = RSA_private_encrypt(sub_str.length(), (const unsigned char*)sub_str.c_str(), (unsigned char*)sub_text, rsa, RSA_PKCS1_PADDING);if (ret >= 0) {encrypt_text.append(std::string(sub_text, ret));}pos += block_len;}// 释放内存  delete sub_text;BIO_free_all(keybio);RSA_free(rsa);return encrypt_text;
}
/*
@brief : 公钥解密
@para  : cipher_text -[i] 加密的密文pub_key     -[i] 公钥
@return: 解密后的数据
**/
std::string RsaPubDecrypt(const std::string & cipher_text, const std::string & pub_key)
{std::string decrypt_text;BIO *keybio = BIO_new_mem_buf((unsigned char *)pub_key.c_str(), -1);RSA* rsa = RSA_new();// 注意-------使用第1种格式的公钥进行解密//rsa = PEM_read_bio_RSAPublicKey(keybio, &rsa, NULL, NULL);// 注意-------使用第2种格式的公钥进行解密(我们使用这种格式作为示例)rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL);if (!rsa){unsigned long err = ERR_get_error(); //获取错误号char err_msg[1024] = { 0 };ERR_error_string(ulErr, szErrMsg); // 格式:error:errId:库:函数:原因printf("err msg: err:%ld, msg:%s\n", err , err_msg);BIO_free_all(keybio);return decrypt_text;}// 获取RSA单次处理的最大长度int len = RSA_size(rsa);char *sub_text = new char[len + 1];memset(sub_text, 0, len + 1);int ret = 0;std::string sub_str;int pos = 0;// 对密文进行分段解密while (pos < cipher_text.length()) {sub_str = cipher_text.substr(pos, len);memset(sub_text, 0, len + 1);ret = RSA_public_decrypt(sub_str.length(), (const unsigned char*)sub_str.c_str(), (unsigned char*)sub_text, rsa, RSA_PKCS1_PADDING);if (ret >= 0) {decrypt_text.append(std::string(sub_text, ret));printf("pos:%d, sub: %s\n", pos, sub_text);pos += len;}}// 释放内存  delete sub_text;BIO_free_all(keybio);RSA_free(rsa);return decrypt_text;
}

公钥加密-私钥解密
   该部分只对数据块较长的数据的处理为例

/*
@brief : 公钥加密
@para  : clear_text  -[i] 需要进行加密的明文pri_key     -[i] 私钥
@return: 加密后的数据
**/
std::string RsaPubEncrypt(const std::string &clear_text, const std::string &pub_key)
{std::string encrypt_text;BIO *keybio = BIO_new_mem_buf((unsigned char *)pub_key.c_str(), -1);RSA* rsa = RSA_new();// 注意-----第1种格式的公钥//rsa = PEM_read_bio_RSAPublicKey(keybio, &rsa, NULL, NULL);// 注意-----第2种格式的公钥(这里以第二种格式为例)rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL);// 获取RSA单次可以处理的数据块的最大长度int key_len = RSA_size(rsa);int block_len = key_len - 11;    // 因为填充方式为RSA_PKCS1_PADDING, 所以要在key_len基础上减去11// 申请内存:存贮加密后的密文数据char *sub_text = new char[key_len + 1];memset(sub_text, 0, key_len + 1);int ret = 0;int pos = 0;std::string sub_str;// 对数据进行分段加密(返回值是加密后数据的长度)while (pos < clear_text.length()) {sub_str = clear_text.substr(pos, block_len);memset(sub_text, 0, key_len + 1);ret = RSA_public_encrypt(sub_str.length(), (const unsigned char*)sub_str.c_str(), (unsigned char*)sub_text, rsa, RSA_PKCS1_PADDING);if (ret >= 0) {encrypt_text.append(std::string(sub_text, ret));}pos += block_len;}// 释放内存  BIO_free_all(keybio);RSA_free(rsa);delete[] sub_text;return encrypt_text;
}
/*
@brief : 私钥解密
@para  : cipher_text -[i] 加密的密文pub_key     -[i] 公钥
@return: 解密后的数据
**/
std::string RsaPriDecrypt(const std::string &cipher_text, const std::string &pri_key)
{std::string decrypt_text;RSA *rsa = RSA_new();BIO *keybio;keybio = BIO_new_mem_buf((unsigned char *)pri_key.c_str(), -1);rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);if (rsa == nullptr) {unsigned long err = ERR_get_error(); //获取错误号char err_msg[1024] = { 0 };ERR_error_string(err, err_msg); // 格式:error:errId:库:函数:原因printf("err msg: err:%ld, msg:%s\n", err, err_msg);return std::string();}// 获取RSA单次处理的最大长度int key_len = RSA_size(rsa);char *sub_text = new char[key_len + 1];memset(sub_text, 0, key_len + 1);int ret = 0;std::string sub_str;int pos = 0;// 对密文进行分段解密while (pos < cipher_text.length()) {sub_str = cipher_text.substr(pos, key_len);memset(sub_text, 0, key_len + 1);ret = RSA_private_decrypt(sub_str.length(), (const unsigned char*)sub_str.c_str(), (unsigned char*)sub_text, rsa, RSA_PKCS1_PADDING);if (ret >= 0) {decrypt_text.append(std::string(sub_text, ret));printf("pos:%d, sub: %s\n", pos, sub_text);pos += key_len;}}// 释放内存  delete[] sub_text;BIO_free_all(keybio);RSA_free(rsa);return decrypt_text;
}

测试代码

int main()
{// 原始明文  std::string src_text = "test begin\n this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! this is an rsa test example!!! \ntest end";//src_text = "rsa test";std::string encrypt_text;std::string decrypt_text;// 生成密钥对std::string pub_key;std::string pri_key;OpensslTool::GenerateRSAKey(pub_key, pri_key);printf("public key:\n");printf("%s\n", pub_key.c_str());printf("private key:\n");printf("%s\n", pri_key.c_str());// 私钥加密-公钥解密encrypt_text = OpensslTool::RsaPriEncrypt(src_text, pri_key);printf("encrypt: len=%d\n", encrypt_text.length());decrypt_text = OpensslTool::RsaPubDecrypt(encrypt_text, pub_key);printf("decrypt: len=%d\n", decrypt_text.length());printf("decrypt: %s\n", decrypt_text.c_str());// 公钥加密-私钥解密encrypt_text = OpensslTool::RsaPubEncrypt(src_text, pub_key);printf("encrypt: len=%d\n", encrypt_text.length());decrypt_text = OpensslTool::RsaPriDecrypt(encrypt_text, pri_key);printf("decrypt: len=%d\n", decrypt_text.length());printf("decrypt: %s\n", decrypt_text.c_str());return 0;
}

4. 总结
1)单次加密数据的最大长度(block_len),由RSA秘钥模长RSA_size()和填充模式有关

A. 填充模式:RSA_PKCS1_PADDING, block_len=RSA_size() - 11

B. 填充模式:RSA_PKCS1_OAEP_PADDING,block_len=RSA_size() - 41

C. 填充模式:RSA_NO_PADDING(不填充),block_len=RSA_size()

调用加密接口时,如果传入的加密数据的长度大于block_len,则加密接口将返回错误

2)公钥的使用(公钥和公钥加密解密接口),公钥的类型 和 生成公钥RSA对象指针的接口必须是一一对应的,否则将操作失败

A. 第1种格式的公钥(-----BEGIN RSA PUBLIC KEY----- / -----END RSA PUBLIC KEY-----),对应的接口如下:

生成公钥:PEM_write_bio_RSAPublicKey()

生成公钥RSA对象指针:PEM_read_bio_RSAPublicKey()

B. 第2种格式的公钥(-----BEGIN PUBLIC KEY----- / -----END PUBLIC KEY-----),对应的接口如下:

生成公钥:PEM_write_bio_RSA_PUBKEY()

生成公钥RSA对象指针:PEM_read_bio_RSA_PUBKEY()

3) 在使用其他编程语言生成的RSA秘钥对时,可能(同时)遇到以下问题(本人在使用java生成的公钥时全部遇到了,血的经验……):

A. 秘钥对只有“秘钥内容”,而没有“秘钥起止标识”;(公钥+私钥都可能遇到)

B. 秘钥内容没有换行符(\n);(公钥可能会遇到)

遇到这个问题,请不要紧张,自己写个函数对“秘钥内容”包装一下,加上“起止标识”和换行符(\n)。对于“起止标识”,一种格式不行就换另一种试试,本人遇到的就是需要使用第二种“起止标识”的,代码请参考:

#define RSA_KEYSUB_LEN    64std::string iifs::IIRSA::FormatPubKey(const std::string & key)
{std::string pub_key = "-----BEGIN PUBLIC KEY-----\n";auto pos = key.length();pos = 0;while (pos < key.length()) {pub_key.append(key.substr(pos, RSA_KEYSUB_LEN));pub_key.append("\n");pos += RSA_KEYSUB_LEN;}pub_key.append("-----END PUBLIC KEY-----");return pub_key;
}

5. 贴上一对秘钥(起止标识结束位置有换行,每64字节有换行)
/* 公钥 */
-----BEGIN RSA PUBLIC KEY-----
MIIBCAKCAQEAwDpa2EOEu7vCx88mVXzLHxdw1Yn0Hm7gkUEdnzdXzPenbL4NVLoj
6lxtX2UQ10wZLQfHuv5elaBn9jkCxpZgb9zkD3hKqmVLJI6HXRi2OECEnOp0Edus
crCr3N/FXvf7ALT4i9LeUlfmUmTB+kIR7VpyPY2Pg88DvA5n7QXQRRqRu8d3NBXF
ZhB9nZd8Zb8XyTStKLwwd11e7JV4vUTiA3heoNnSsBEeLN1DWdQNjCqq35AFP2yd
M1pncM4Zjhbyv0z0l776vCJyS4/iS78qund4i1dxp2l4gDoDuTd4Nck6oN/HC9Ba
nuIqrv/RP0Sw01Dij7g59nVxYA1aN8cvxQIBAw==
-----END RSA PUBLIC KEY-----
/* 私钥 */
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAwDpa2EOEu7vCx88mVXzLHxdw1Yn0Hm7gkUEdnzdXzPenbL4N
VLoj6lxtX2UQ10wZLQfHuv5elaBn9jkCxpZgb9zkD3hKqmVLJI6HXRi2OECEnOp0
EduscrCr3N/FXvf7ALT4i9LeUlfmUmTB+kIR7VpyPY2Pg88DvA5n7QXQRRqRu8d3
NBXFZhB9nZd8Zb8XyTStKLwwd11e7JV4vUTiA3heoNnSsBEeLN1DWdQNjCqq35AF
P2ydM1pncM4Zjhbyv0z0l776vCJyS4/iS78qund4i1dxp2l4gDoDuTd4Nck6oN/H
C9BanuIqrv/RP0Sw01Dij7g59nVxYA1aN8cvxQIBAwKCAQEAgCbnOtet0n0shTTE
OP3cv2T147FNaZ9AYNYTv3o6iKUaSH6zjdFtRuhI6kNgj4gQyK/afKmUY8BFTtCs
hGRASpNCtPrccZjcwwmvk2XO0CsDE0b4C+fITHXH6JUuP0/8qyNQXTc+4Y/u4ZiB
UYFhSOb207O1AooCfV7v81k1g2XkBlZqUGXBCYoo7ec5X1PoCImTHrlbwTLOaA6h
GIr0HgrsvLMVjNNvzx8p7v18jBRzolkDa3Ch3dp61QHQ9Z3lehpXByTplLHxCNDp
fa8KtmdmQVZSKsosjBoMvtxHtEEpAhhAAL+6HtlQ67Y4LHsfLtIDk/PKjMNKyeht
mDKV8wKBgQDgWdxBbLw30cos87Tk98JlWYmkuo6YtVQL0qyj4J6jFnH2LTMSiJPP
2ETcUXt2rkd5Zs6NCNQEhHifgbmvIOILqD7txNGRIDksVf5UKRC5X3+90RbQff/x
XLLzNqKIEhIrdgNQzptoTpJyj5Llzw5Sj1f0MtnKAomW4l3zmuf2BwKBgQDbWGmW
TsDsBfcTRQfBXv7WYtyrwBeOID0dfdLjN9XQv/YFWJof1EAmnemoIdxcC8SEBTvz
FW+l4hoPr5Gw/MgO3+aESDYLPN5caFgv5ifhSVyhWD8l6TpEUV/9ZEqElVVRp7gW
PBVbIgm+vduXLX2vfb3o/vDAIMbqTtLCOJNY0wKBgQCVkT2A8yglNobIoniYpSxD
kQZt0bRlzjgH4chtQGnCDvakHiIMWw01OtiS4Pz5yYT7md8IsI1YWFBqVnvKFewH
xX9JLeELatDIOVQ4G2B7lP/T4LngU//2PcyiJGxatrbHpAI13xJFibb3CmHuigmM
X4/4IeaGrFu57D6iZ0VOrwKBgQCSOvEO3ytIA/oM2K/WP1SO7JMdKrpewCi+U+Hs
z+Pgf/lY5bwVOCrEaUZwFpLoB9hYA31MuPUZQWa1H7Z1/dq0lURYMCQHfemS8DrK
mW/rhj3A5X9um3wti5VTmDGtuOOLxSVkKA48wVvUfpJkyP50/n6bVKCAFdnxieHW
0GI7NwKBgCNVncsGnj/sIwoTJ62udRTxKW5VxtmUmPcDlG05qfjCB/itrJmPC5nv
Pmzq2doZXlu9SCqTN/tEgeyJ8PGBGJFDS03T42VnjuNu4Eravbmgm4AJYLdxip4O
oCF6GkBGNYJaCCdcPHQnouW5cvTILlAvJVYn99w0Vei/VmajwCIZ
-----END RSA PRIVATE KEY-----

其他链接:https://www.jianshu.com/p/011303dc9429

使用OpenSSL进行RSA加密和解密(非对称)相关推荐

  1. C++使用OPENSSL进行RSA加密,java服务端解密

    RSA是一种非对称加密. 加密和解密方式:公钥加密-私钥解密,私钥加密-公钥解密 背景 为了网络数据安全,Web端(Java)要求用RSA加密算法传数据,公钥加密私钥解密方式(RSA有公钥加密私钥解密 ...

  2. php java openssl ras_php基于openssl的rsa加密解密示例

    本文实例讲述了php基于openssl的rsa加密解密.分享给大家供大家参考,具体如下: $config = array( //"config" =>"D:/php ...

  3. 黑客学习-密码学:基于openssl的算法加密和解密

    在Linux系统中自带openssl工具,加密和解密,可以在Linux上进行.利 openssl工具,用DES.3DES.IDEA.AES等对称算法对文件加密解密,和用RSA非对称算法对文件加密解密. ...

  4. java rsa加密解密_前端实现对请求参数进行RSA加密amp;解密,针对字符串过长进行分段加密amp;分段解密的处理...

    前言 在需求开发中,为了安全起见,我们都会难免遇到需要对一些敏感参数进行加密或者解密.所以,今天给大家分享的就是使用jsencrypt对请求参数进行RSA加密与解密,发这篇文章其实主要因为近期我的一位 ...

  5. GO语言实现RSA 加密和解密的实现

    RSA 加密和解密的实现 openssl生成私钥 openssl genrsa -out rsa_private_key.pem 1024 openssl生成公钥 openssl rsa -in rs ...

  6. 数字签名、证书,RSA加密、解密

    文章目录 一.相关知识扫盲篇 数字签名.数字证书 防止证书伪造 之 证书链-Digital Certificates 二.公私钥格式.协议规范 三.golang RSA加密.解密具体实现 `RSA`加 ...

  7. RSA加密与解密(Java实现)

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载. RSA的应用 RSA是一种非对称加密算法.现在,很多登陆 ...

  8. 使用OpenSSL1.1.1中的libcrypto库进行RSA加密与解密数据

    废话不多说, 直接说怎么写代码 编译的时候如何包含库文件这种事情就不说了. 第一步, 包含头文件. #include <openssl/rsa.h> // 既然是RSA加密该头文件肯定是需 ...

  9. javascript rsa java,用javascript与java执行 RSA加密与解密

    用javascript与java执行 RSA加密与解密 2009-12-12 14:58:30   出处:https://www.yqdown.com 这几天一直做安全登录,网上查了好多资料,不尽如意 ...

最新文章

  1. 代码操作Oracle
  2. MybatisPlus实现乐观锁
  3. Angular里的购物车页面实现
  4. 我用段子讲.NET之依赖注入(一)
  5. Java Web-网页基础-HTML-URL
  6. pg数据库有雷锋?用户已有权限为何无故消失?
  7. 8.2 Query 语句优化基本思路和原则
  8. 整理了10个行业的30份可视化大屏模板,可直接拿走套用
  9. 多第八田间学校:几何+图论出度+模拟+找到规律
  10. 笔记本win10系统部分应用显示模糊的问题——已解决!
  11. JavaScript进阶 | DOM
  12. mysql数据表损坏的常见原因是_MYSQL数据表损坏的分析
  13. Python beautifulsoup爬取小说
  14. 武汉科技大学计算机生命与科学周海,湖北双胞胎周海周洋:为了母亲,一个放弃清华,一人放弃中科院...
  15. 王者荣耀微信哪个服务器人多,王者荣耀微信区和qq区哪个厉害
  16. 银行卡开户及交易项目--Oracle
  17. 跟谁学计算机老师,跟谁学
  18. 想不想锁住别人的电脑?运用python成为黑客 !
  19. python编程求圆的周长和面积公式_C语言求圆的周长和面积
  20. 《Adobe Photoshop CS5中文版经典教程(全彩版)》—第1课1.6节查找资源

热门文章

  1. Jquery EasyUI datagrid数据库分页
  2. Android 圆形/圆角图片的方法
  3. js 原型prototype继承模式
  4. Android初级教程Activity小案例(计算器乘法运算)
  5. 3D人脸识别预处理,3D face recognition preprocess
  6. 【转】【Asp.Net】Asp.net发送邮件的两种方法小结
  7. 关于报表中汇率转换的问题
  8. 遍历XML引擎版本以适应代码
  9. PHP-Webshell免杀研究
  10. [译] APT分析报告:04.Kraken - 新型无文件APT攻击利用Windows错误报告服务逃避检测