如何用C++和OpenSSL库来实现 AES-256-CBC,ChaCha20,RSA,ECC,SHA-256,HMAC,国密算法加密
时间: 2025-06-08 08:48:57 浏览: 53
<think>嗯,用户现在想用C++和OpenSSL库实现多种加密算法,包括AES-256-CBC、ChaCha20、RSA、ECC、SHA-256、HMAC,还有国密算法。首先,我需要确定用户的需求是什么。他们可能是在开发一个需要多种加密功能的应用程序,或者是在学习OpenSSL的使用。不过用户之前已经问过AES-256-CBC的实现,现在扩展到了更多算法,包括国密算法,这可能意味着他们的项目需要符合中国的加密标准,或者他们所在的环境有合规性要求。
首先,我需要回顾一下之前给出的AES-256-CBC的示例,确保这次回答的结构类似,保持一致性,这样用户更容易理解。接下来,对于每个算法,我需要整理出对应的OpenSSL函数和步骤。比如,ChaCha20在OpenSSL中的实现可能与AES类似,使用EVP接口,而RSA和ECC则涉及非对称加密,需要使用不同的函数,比如EVP_PKEY相关的函数。
国密算法(如SM2、SM3、SM4)可能需要确认OpenSSL的版本是否支持。因为OpenSSL 1.1.1之后开始支持国密算法,但可能需要特定的编译选项或者使用分支版本。用户可能需要额外安装支持国密的OpenSSL版本,比如使用国内的分支或者通过配置选项启用。这部分需要明确告诉用户,否则他们可能会遇到编译错误。
然后,我需要考虑每个算法的实现步骤是否足够详细,比如密钥生成、加密、解密过程,以及必要的错误处理和资源清理。例如,RSA加密需要生成密钥对,而ECC可能涉及椭圆曲线的选择。同时,哈希算法如SHA-256和HMAC相对简单,但需要正确使用EVP摘要接口。
用户可能没有提到的细节包括密钥管理、随机数生成、填充方式等,这些在加密实现中非常重要。比如,IV的生成应该使用安全的随机数,而不是硬编码。此外,国密算法的示例代码可能需要更详细的说明,因为用户可能对这部分不太熟悉。
另外,用户可能希望这些示例代码能够直接复制粘贴使用,因此需要确保代码的正确性和完整性,包括头文件引用、编译选项(如链接-lssl -lcrypto),以及必要的资源释放,比如EVP上下文的内存管理。
最后,要提醒用户注意安全实践,比如使用适当的密钥派生函数、避免硬编码密钥、处理错误返回值,以及选择正确的加密模式(如GCM用于认证加密)。特别是国密算法的使用可能需要遵循特定的国家标准和合规性要求,这一点需要强调。
综上所述,我需要组织每个算法的代码示例,分步骤说明,并附上注意事项,确保用户能够理解并正确实现这些加密功能,同时满足他们的实际需求,尤其是国密算法的部分可能需要更详细的指导。</think>以下是用C++和OpenSSL实现多种加密算法的代码示例和关键要点(版本要求:OpenSSL 1.1.1+):
---
### 一、AES-256-CBC(对称加密)
```cpp
#include <openssl/evp.h>
std::vector<unsigned char> aes_encrypt(
const std::vector<unsigned char>& plaintext,
const unsigned char key[32],
const unsigned char iv[16])
{
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
std::vector<unsigned char> ciphertext(plaintext.size() + EVP_CIPHER_block_size(EVP_aes_256_cbc()));
int len;
EVP_EncryptUpdate(ctx, ciphertext.data(), &len, plaintext.data(), plaintext.size());
int ciphertext_len = len;
EVP_EncryptFinal_ex(ctx, ciphertext.data() + len, &len);
ciphertext_len += len;
ciphertext.resize(ciphertext_len);
EVP_CIPHER_CTX_free(ctx);
return ciphertext;
}
```
---
### 二、ChaCha20(流密码)
```cpp
std::vector<unsigned char> chacha20_encrypt(
const std::vector<unsigned char>& plaintext,
const unsigned char key[32],
const unsigned char iv[12]) // 96-bit IV
{
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_chacha20(), NULL, key, iv);
std::vector<unsigned char> ciphertext(plaintext.size());
int len;
EVP_EncryptUpdate(ctx, ciphertext.data(), &len, plaintext.data(), plaintext.size());
EVP_CIPHER_CTX_free(ctx);
return ciphertext;
}
```
---
### 三、RSA(非对称加密)
```cpp
#include <openssl/rsa.h>
std::vector<unsigned char> rsa_encrypt(
const std::vector<unsigned char>& plaintext,
RSA* public_key)
{
std::vector<unsigned char> ciphertext(RSA_size(public_key));
int len = RSA_public_encrypt(
plaintext.size(), plaintext.data(),
ciphertext.data(), public_key,
RSA_PKCS1_OAEP_PADDING);
ciphertext.resize(len);
return ciphertext;
}
// 生成密钥对示例
RSA* generate_rsa_keypair(int bits = 2048) {
RSA* rsa = RSA_new();
BIGNUM* bn = BN_new();
BN_set_word(bn, RSA_F4);
RSA_generate_key_ex(rsa, bits, bn, NULL);
BN_free(bn);
return rsa;
}
```
---
### 四、ECC(椭圆曲线加密)
```cpp
#include <openssl/ec.h>
std::vector<unsigned char> ecdh_shared_secret(
EC_KEY* local_key,
EC_KEY* peer_public_key)
{
std::vector<unsigned char> secret(ECDH_size(local_key));
int len = ECDH_compute_key(
secret.data(), secret.size(),
EC_KEY_get0_public_key(peer_public_key),
local_key, NULL);
secret.resize(len);
return secret;
}
// 生成ECC密钥示例
EC_KEY* generate_ecc_key(int nid = NID_secp256k1) {
EC_KEY* key = EC_KEY_new_by_curve_name(nid);
EC_KEY_generate_key(key);
return key;
}
```
---
### 五、SHA-256(哈希)
```cpp
#include <openssl/sha.h>
std::vector<unsigned char> sha256_hash(
const std::vector<unsigned char>& data)
{
std::vector<unsigned char> digest(SHA256_DIGEST_LENGTH);
SHA256(data.data(), data.size(), digest.data());
return digest;
}
```
---
### 六、HMAC(消息认证码)
```cpp
#include <openssl/hmac.h>
std::vector<unsigned char> hmac_sha256(
const std::vector<unsigned char>& key,
const std::vector<unsigned char>& data)
{
std::vector<unsigned char> digest(EVP_MAX_MD_SIZE);
unsigned int len;
HMAC(EVP_sha256(), key.data(), key.size(),
data.data(), data.size(),
digest.data(), &len);
digest.resize(len);
return digest;
}
```
---
### 七、国密算法(SM2/SM3/SM4)
```cpp
// SM4-CBC加密(需启用国密算法支持)
std::vector<unsigned char> sm4_encrypt(
const std::vector<unsigned char>& plaintext,
const unsigned char key[16],
const unsigned char iv[16])
{
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_sm4_cbc(), NULL, key, iv);
std::vector<unsigned char> ciphertext(plaintext.size() + 16);
int len;
EVP_EncryptUpdate(ctx, ciphertext.data(), &len, plaintext.data(), plaintext.size());
int ciphertext_len = len;
EVP_EncryptFinal_ex(ctx, ciphertext.data() + len, &len);
ciphertext_len += len;
ciphertext.resize(ciphertext_len);
EVP_CIPHER_CTX_free(ctx);
return ciphertext;
}
// SM3哈希
std::vector<unsigned char> sm3_hash(
const std::vector<unsigned char>& data)
{
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(ctx, EVP_sm3(), NULL);
EVP_DigestUpdate(ctx, data.data(), data.size());
std::vector<unsigned char> digest(EVP_MAX_MD_SIZE);
unsigned int len;
EVP_DigestFinal_ex(ctx, digest.data(), &len);
digest.resize(len);
EVP_MD_CTX_free(ctx);
return digest;
}
```
---
### 关键注意事项
1. **OpenSSL版本要求**:
- 国密算法需要OpenSSL 1.1.1+并启用`enable-sm3` `enable-sm4`编译选项
- 部分系统需要单独安装国密算法支持包
2. **安全实践**:
```cpp
// 安全的随机数生成
#include <openssl/rand.h>
unsigned char iv[16];
RAND_bytes(iv, sizeof(iv)); // 必须检查返回值
```
3. **内存管理**:
```cpp
// 必须手动释放非对称加密密钥
RSA_free(rsa_key);
EC_KEY_free(ecc_key);
```
4. **编译参数**:
```bash
g++ -o program program.cpp -lssl -lcrypto
```
---
### 算法选择建议
| 场景 | 推荐算法 | OpenSSL常量 |
|-------|-----------|--------------|
| 高性能对称加密 | AES-256-GCM | `EVP_aes_256_gcm()` |
| 移动端流加密 | ChaCha20-Poly1305 | `EVP_chacha20_poly1305()` |
| 国密合规要求 | SM4-CBC/SM2 | `EVP_sm4_cbc()` |
| 数字签名 | ECDSA | `EC_KEY` + `ECDSA_sign()` |
建议优先使用EVP统一接口(如`EVP_EncryptInit_ex`),而非直接调用底层函数(如`AES_encrypt`),以保证算法的可替换性和代码一致性。
阅读全文
相关推荐













