openssl——aes加密

aes加密是一种对称加密。
openssl的aes加密接口,要求数据是AES_BLOCK_SIZE的整数倍,所以当源数据不是16的整数倍时,需要填充一些字节。

一下是一个封装aes加密的例子:

bool AESEncrypt(const std::string& key, const std::string& src, std::string& encrypt, int aes_key_bits) {
    std::string plain = src;
    if (key.empty() || plain.empty()) {
        return false;
    }

    int data_length = plain.length();
    if (data_length % AES_BLOCK_SIZE != 0){
        int append_data_length = (data_length / AES_BLOCK_SIZE + 1) * AES_BLOCK_SIZE;
        int padding_data = 0;
        plain.append(append_data_length - data_length, padding_data);
        data_length = append_data_length;
    }
    unsigned char * input = new unsigned char[data_length + 
### 使用 OpenSSL 实现 AES 加密文本 为了使用 OpenSSL 库中的 AES 功能来加密文本,可以按照如下方法编写 C++ 程序: #### 头文件引入 程序需包含 `openssl/aes.h` 和其他必要的头文件以便访问 AES 相关函数。 ```cpp #include <iostream> #include <cstring> #include <cstdlib> #include <iomanip> // 引入OpenSSL库的AES功能所需的头文件 extern "C" { #include <openssl/aes.h> } ``` #### 初始化向量与密钥设置 初始化向量 (IV) 是用于增加数据流的安全性的随机数;而密钥则是用来控制加解密过程的关键参数。两者都应具有足够的长度并尽可能保持秘密性。 ```cpp unsigned char key[] = "thisisaverysecretkey"; // 密钥, 需要16字节(128位), 24字节(192位), 或者32字节(256位) unsigned char iv[AES_BLOCK_SIZE]; // IV大小固定为AES_BLOCK_SIZE即16字节 memset(iv, 0x00, sizeof(iv)); // 这里简单起见全部填充为零 ``` #### 文本准备 待处理的数据应当被转换成适合 AES 操作的形式——通常是无符号字符数组形式,并且其长度应该是区块大小(通常为16字节)的整倍数。如果原文不足,则可以通过某种方式补足至适当长度。 ```cpp std::string plaintext = "HelloWorld"; int padded_length = ((plaintext.length() / AES_BLOCK_SIZE)+1)*AES_BLOCK_SIZE; char* padded_plaintext = new char[padded_length]; memcpy(padded_plaintext, plaintext.c_str(), plaintext.size()); for(int i=plaintext.size();i<padded_length;i++)padded_plaintext[i]='\0'; ``` #### 创建上下文结构体 通过调用 `AES_set_encrypt_key()` 来配置加密环境变量,之后就可以利用此对象来进行实际的操作了。 ```cpp AES_KEY enc_key; // 定义一个存储加密密钥信息的对象 if(AES_set_encrypt_key(key,strlen((const char*)key),&enc_key)<0){ std::cerr << "Failed to set encryption key." << std::endl; exit(-1); } ``` #### 执行加密操作 最后一步就是真正地执行加密动作啦!这里采用的是 ECB 模式的例子,当然也可以选择更安全 CBC 等模式。 ```cpp unsigned char ciphertext[padded_length]; // 存储加密后的结果 AES_ecb_encrypt(reinterpret_cast<const unsigned char*>(padded_plaintext), reinterpret_cast<unsigned char*>(ciphertext), &enc_key, AES_ENCRYPT); // 表明这是加密而非解密的过程 delete [] padded_plaintext; // 输出十六进制表示的结果字符串 for(size_t i=0 ; i<sizeof(ciphertext)/sizeof(unsigned char) ; ++i ) { printf("%02X", ciphertext[i]); } printf("\n"); ``` 以上代码片段展示了如何基于 OpenSSL 中提供的 API 对给定的一段文字实施 AES 加密[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值