我试图实现一个"非常"简单的加密/解密示例.我需要一个项目,我想加密一些用户信息.我无法加密整个数据库,只能加密表中的某些字段.
除了加密之外,数据库和项目的大部分工作都有效:以下是它的简化版本:
#include#include #include #include 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; }
但是"解密"数据的输出是一些随机字符,但在每次执行代码后它们都是相同的.outdata
每次执行都会改变......
我试图调试并搜索解决方案,但我找不到任何解决方案来解决我的问题.
现在我的问题是,这里出了什么问题?或者我是否完全误解了所提供的功能?
问题是AES_cfb128_encrypt
修改ivec
(它必须为了允许链接).您的解决方案是ivec
在每次调用之前创建并初始化它的副本,AES_cfb128_encrypt
如下所示:
const char ivecstr[AES_BLOCK_SIZE] = "goodbyworldkey\0"; unsigned char ivec[AES_BLOCK_SIZE]; memcpy( ivec , ivecstr, AES_BLOCK_SIZE);
然后memcpy
在第二次打电话之前重复AES_cfb128_encrypt
.
注1:你的初始向量是一个字节太短,所以我\0
在它的末尾添加了一个明确的附加.复制或传递时,应确保所有字符串的长度都正确.
注意2:任何使用加密的代码都应该真正避免使用strcpy
或未经检查长度的任何其他副本.这是一种危险.