【发布时间】:2014-07-04 15:38:22
【问题描述】:
我正在尝试构建一个程序,该程序接收文件(任意大小的 EXE),对其进行加密并将其复制到结构中。以后再解密,确保和使用的一样。
我很难加密然后解密文件。它似乎没有正确加密,我不知道如何测试它。
这是我的问题:
- 我在这里做错了什么?
- 是否有更好的库来使用 AES 进行加密?还是我应该坚持使用 openSSL
- 假设我想使用另一个键,例如“HelloWorld”。我可以只使用该字符串并将其用作加密算法的参数吗?我必须设置正确的密钥位长度吗?如果有怎么办?
代码:
struct structData{
unsigned char * FileBuffer;
unsigned long FileSize;
//More stuff in here
};
struct Data sData;
/*
I load the data here, and fill in the data etc
*/
unsigned char Key[]={ //128bit key
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
};
unsigned char *enc_data = malloc(sData->FileSize);//Temporary holder for the File
AES_KEY enc_key;
AES_set_encrypt_key(Key,128,&enc_key);//Put key defined here
AES_encrypt(sData->FileBuffer,enc_data,&enc_key);
sData->FileBuffer = enc_data;//This should move the stuff over
//Should be encrypted here
sData->FileBuffer = enc_data;//Copy the output to the file buffer
free(enc_data);//Free memory
AES_KEY dec_key;
AES_set_decrypt_key(Key, 128,&dec_key);
AES_decrypt(sData->FileBuffer,dec_data,&dec_key);
sData->FileBuffer = dec_data;
free(dec_data);
任何事情都会有所帮助,希望我正朝着正确的方向前进,我的 C 技能有点生疏。
【问题讨论】:
-
这实际上是您使用的代码吗?因为你释放(enc_data)并尝试在之后解密它。您应该为 pFileBuffer 分配一块新的内存并使用 memcpy() 来复制 enc_data 的内容。注意:sData->pFileBuffer = enc_data;不复制任何内容,它只是将 pFileBuffer 设置为指向与 enc_data 相同的位置。
-
这不可能是他使用的代码。该结构没有
pFileBuffer成员。 -
这不是我使用的代码,我重命名了一些变量,我会在编辑中修复它。
-
您不需要大于算法块大小的临时缓冲区,即 16 字节(128 位)。抛开内存泄漏不谈,这段代码只会加密 一个 块(16 字节)。简而言之,您需要更熟悉分组密码的工作原理。 (仍在尝试理解为什么您指定了 192 位密钥,但您将长度硬编码为 128,因此这不是真正的问题)。
-
@robin.koch 好的。这是我想的,谢谢!和 WhozCraig,我看到我错误地指定了密钥长度。所以正确的做法是循环这个函数直到 eof?
标签: c encryption struct cryptography openssl