我正在尝试构建一个文件(一个任意大小的EXE)的程序,加密它并将其复制到一个结构。然后再解密,确保使用相同。
我很难加密然后解密文件。它似乎没有正确加密,我不知道如何测试它。
以下是我的问题:
代码:
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技能有点生疏。
答案 0 :(得分:4)
我在这里做错了什么?
嗯,这有点太开放了,无法彻底回答。
从明显的开始,您使用低级AES_*
接口并在ECB模式下运行AES。你没有得到你的钥匙。你很难对密钥进行编码。
看起来你也有内存管理问题。您似乎无法在任何地方使用FileSize
。
使用AES加密是否有更好的库?
如果您将使用OpenSSL,那么您应该使用EVP_*
接口和使用经过身份验证的加密模式(如GCM)。使用GCM模式,您可以获得机密性和真实性。请参阅OpenSSL wiki上的EVP Authenticated Encryption and Decryption。
让我们说我想用另一个关键词“HelloWorld”。我可以使用该字符串并将其用作加密算法的参数吗?我必须设置密钥的正确位长吗?如果是这样的话?
您应该派生一个密钥而不是直接从密码中使用它。请参阅OpenSSL文档中的EVP_BytesToKey(3)
和PKCS5_PBKDF2_HMAC(3)
(OpenSSL wiki没有文章或示例代码)。
......我应该坚持使用OpenSSL
如果您正确使用了库,那么您应该对它感到满意。
否则,您可以使用您喜欢的任何其他库。有关其他选择,请参阅OpenSSL wiki的Related Links页面。
答案 1 :(得分:0)