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被修改的事实。