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

本文介绍了如何使用OpenSSL1.1.1的libcrypto库进行RSA加密和解密数据,包括如何生成公钥私钥文件、加密解密的限制及实现关键代码。需要注意的是,加密内容长度受限于密钥长度,且公钥加密必须用私钥解密,反之亦然。为了加密长数据,可以采用分段加密的方法。
摘要由CSDN通过智能技术生成

废话不多说, 直接说怎么写代码
编译的时候如何包含库文件这种事情就不说了.

第一步, 包含头文件.

#include <openssl/rsa.h>	// 既然是RSA加密该头文件肯定是需要的
#include <openssl/bn.h>		// 这个头文件用于RSA的公钥私钥生成中, 生成大数用的
#include <openssl/pem.h>	// 这个是用于将公钥私钥保存成pem文件用的
// 其它所需的头文件会被上述三个头文件自动包含, 比如bio.h

第二步, 生成公钥私钥文件
首先说明一下, 在RSA的私钥中, 既包含私钥信息也包含公钥信息
也就是说, 所谓的公钥, 其实就是私钥的一部分

要生成公钥私钥文件, 可是使用openssl的可执行文件openssl, 通过命令行的形式执行

# 生成私钥文件key.pem, 2048是密钥的位数
openssl genrsa -out key.pem 2048
# 基于私钥文件key.pem提取公钥文件key.pub.pem
openssl rsa -in key.pem -pubout -out key.pub.pem

除了上述使用工具, 也可以使用代码生成, 这里说一下代码生成的方法:

// 生成基本的RSA密钥数据很简单, 使用下面四句话即可
RSA* rsa = RSA_new();
BIGNUM* e = BN_new();
BN_set_word(e, 65537);	// 65537是官方推荐的一个数字, 其实任意素数都是可以的
RSA_generate_key_ex(rsa, 2048, e, 0)
在C++,通过OpenSSL可以方便地进行RSA加密解密操作。以下是基本步骤: 1. **安装OpenSSL**:首先需要下载并安装OpenSSL,许多C++发行版如Dev-C++, mingw-w64等已经包含了OpenSSL支持。 2. **包含头文件**:在你的C++源码,添加`#include <openssl/bio.h>`、`#include <openssl/pem.h>`、`#include <openssl/rsa.h>`等必要的头文件。 3. **生成RSA密钥对**: - 使用`RSA* RSA_new()`创建一个新的RSA结构。 - 使用`RSA_generate_key()`生成指定长度的密钥对,例如`RSA_generate_key_ex(RSA_new(), keysize, e, NULL)`,其`keysize`是位数,`e`是公钥指数(通常取65537)。 4. **保存和加载私钥**: - 可以使用PEM(Privacy Enhanced Mail)格式将私钥转换为字符串,并保存到文件,`PEM_write_PrivateKey_file(private_key, "password", &pkey_info, NULL)`。 - 加密时从文件读取私钥并解密,`RSA* rsa = PEM_read_RSAPrivateKey(file, NULL, NULL, NULL)`。 5. **加密数据**: - 对明文使用公钥(`public_key`)加密,`unsigned char ciphertext[...];`,`RSA_public_encrypt(plaintext_len, plaintext, ciphertext, public_key, padding)` 6. **解密数据**: - 对密文使用私钥(`private_key`)解密,`RSA_private_decrypt(ciphertext_len, ciphertext, plaintext, private_key, padding)`。 7. **清理内存**: - 使用RSA对象后记得释放内存,`RSA_free(rsa)`。 ```cpp // 示例代码片段 RSA *private_key; FILE *file; if ((private_key = PEM_read_RSAPrivateKey(filename, NULL, NULL, NULL)) == NULL) { // 错误处理 } BIO *bio = BIO_new(BIO_s_mem()); if (!BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL | BIO_FLAGS_MEM_RDONLY)) { // 错误处理 } BIO_write(bio, pem, pem_length); RSA_private_decrypt(BIO_get_contents(bio), ciphertext, plaintext, private_key, RSA_PKCS1_PADDING); // 解密后的操作... RSA_free(private_key); BIO_free_all(bio); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值