c++ openssl aes ecb加解密长字符串 示例代码
时间: 2024-10-24 09:05:39 浏览: 41
AES (Advanced Encryption Standard) 是一种对称加密算法,而 ECB (Electronic Codebook) 模式是最简单的加密模式,它将明文分块并在不解密的情况下直接存储。在 OpenSSL 中,我们可以使用 `AES-ECB` 对长字符串进行加密和解密。以下是一个基本的 C++ 示例代码:
```cpp
#include <openssl/aes.h>
#include <string>
std::string encrypt(const std::string &plaintext, const unsigned char *key, const size_t key_length) {
AES_KEY aes_key;
AES_set_encrypt_key(key, key_length * 8, &aes_key); // 设置密钥
int len = plaintext.length();
unsigned char iv[AES_BLOCK_SIZE]; // 初始化向量,对于ECB可以任意设置,这里是0
memset(iv, 0, AES_BLOCK_SIZE);
unsigned char ciphertext[len + AES_BLOCK_SIZE];
int ciphertext_len;
AES_cbc_encrypt(reinterpret_cast<const unsigned char*>(plaintext.c_str()), ciphertext, len, &aes_key, iv, AES_ENCRYPT);
ciphertext_len = len; // 原长度,因为ECB模式不需要填充
return std::string((const char*)ciphertext, ciphertext_len);
}
std::string decrypt(const std::string &ciphertext, const unsigned char *key, const size_t key_length) {
AES_KEY aes_key;
AES_set_decrypt_key(key, key_length * 8, &aes_key); // 设置密钥
int len = ciphertext.length();
unsigned char iv[AES_BLOCK_SIZE] = {0}; // 使用之前设置的初始化向量
unsigned char decrypted[len];
AES_cbc_encrypt(ciphertext.data(), decrypted, len, &aes_key, iv, AES_DECRYPT);
return std::string((char*)decrypted, len);
}
int main() {
const std::string secret = "这是一个需要加密的长字符串";
unsigned char key[AES_BLOCK_SIZE] = {'A', 'E', 'S', 'K', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};
std::string encrypted = encrypt(secret, key, sizeof(key));
std::cout << "Encrypted string: " << encrypted << "\n";
std::string decrypted = decrypt(encrypted, key, sizeof(key));
if (decrypted == secret) {
std::cout << "Decrypted successfully!\n";
} else {
std::cout << "Decryption failed.\n";
}
return 0;
}
```
注意:ECB模式不适合加密大量数据,因为它不提供信息隐藏,每个块都是独立加密的,如果两个块内容相同,加密后的结果也一样,这在实际应用中可能存在安全隐患。在生产环境中,建议使用其他模式如CBC、CTR等。
阅读全文