C++ OpenSSL AES_cfb128_encrypt C++;
我试图实现一个“非常”简单的加密/解密示例。我需要它的一个项目,我想加密一些用户信息。我不能加密整个数据库,只能加密表中的一些字段 数据库和项目的大部分其他工作(加密除外): 以下是它的简化版本:C++ OpenSSL AES_cfb128_encrypt C++;,c++,encryption,openssl,aes,C++,Encryption,Openssl,Aes,我试图实现一个“非常”简单的加密/解密示例。我需要它的一个项目,我想加密一些用户信息。我不能加密整个数据库,只能加密表中的一些字段 数据库和项目的大部分其他工作(加密除外): 以下是它的简化版本: #include <openssl/aes.h> #include <openssl/evp.h> #include <iostream> #include <string.h> using namespace std; int main() {
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
/* ckey and ivec are the two 128-bits keys necessary to
en- and recrypt your data. Note that ckey can be
192 or 256 bits as well
*/
unsigned char ckey[] = "helloworldkey";
unsigned char ivec[] = "goodbyworldkey";
int bytes_read;
unsigned char indata[AES_BLOCK_SIZE];
unsigned char outdata[AES_BLOCK_SIZE];
unsigned char decryptdata[AES_BLOCK_SIZE];
/* data structure that contains the key itself */
AES_KEY keyEn;
/* set the encryption key */
AES_set_encrypt_key(ckey, 128, &keyEn);
/* set where on the 128 bit encrypted block to begin encryption*/
int num = 0;
strcpy( (char*)indata , "Hello World" );
bytes_read = sizeof(indata);
AES_cfb128_encrypt(indata, outdata, bytes_read, &keyEn, ivec, &num, AES_ENCRYPT);
cout << "original data:\t" << indata << endl;
cout << "encrypted data:\t" << outdata << endl;
AES_cfb128_encrypt(outdata, decryptdata, bytes_read, &keyEn, ivec, &num, AES_DECRYPT);
cout << "input data was:\t" << decryptdata << endl;
return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
/*ckey和ivec是
加密并重新加密数据。请注意,ckey可以
192或256位
*/
无符号字符ckey[]=“helloworldkey”;
无符号字符ivec[]=“goodbyworldkey”;
读取整数字节;
无符号字符indata[AES_BLOCK_SIZE];
无符号字符输出数据[AES_块大小];
无符号字符解密数据[AES_块大小];
/*包含密钥本身的数据结构*/
爱依斯基凯恩;
/*设置加密密钥*/
AES设置加密密钥(ckey、128和keyEn);
/*在128位加密块上设置开始加密的位置*/
int num=0;
strcpy((char*)indata,“你好,世界”);
字节\u read=sizeof(indata);
AES加密(indata、outdata、字节读取和keyEn、ivec和num、AES加密);
cout问题在于AES\u cfb128\u encrypt
修改ivec
(必须修改才能允许链接)。您的解决方案是创建ivec
的副本,并在每次调用AES\u cfb128\u encrypt
之前对其进行初始化,如下所示:
const char ivecstr[AES_BLOCK_SIZE] = "goodbyworldkey\0";
unsigned char ivec[AES_BLOCK_SIZE];
memcpy( ivec , ivecstr, AES_BLOCK_SIZE);
然后在第二次调用AES\u cfb128\u encrypt
之前重复memcpy
注意1:您的初始向量太短了一个字节,因此我在它的末尾添加了一个明确的\0
。在复制或传递字符串时,您应该确保所有字符串的长度都正确
注2:任何使用加密的代码都应该避免使用strcpy
或任何其他未检查长度的副本。这是一种危险。您是否也尝试过使用AES\u set\u decrypt\u key
?对我来说似乎很奇怪,但嘿,该函数必须有用处。您确定要使用低级AES加密函数吗?使用高级EVP接口是一个更好的主意。另外,与您的问题有些无关,但不要将加密数据打印到标准输出。它不是ASCII数据。如果必须打印出来,请先用base64编码。您也使用“helloworldkey”作为128位密钥,但该数组只有14个字符(包括NUL终止符)或112位。与IV相同。您不应该使用AES\u encrypt
和friends。您应该使用EVP.*
函数。请参阅OpenSSL wiki上的。事实上,您可能应该使用身份验证加密,因为它提供机密性和真实性。请参阅OpenSSL wiki上的。非常感谢!这样做了。我已经e忽略了ivec被修改的事实。