我正在尝试构建一个程序来接收文件(任意大小的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技能有点生锈。
我在这里做错了什么?
好吧,这有点太开放了,无法彻底回答。
从显而易见的地方开始,您正在使用低级AES_*
接口并在ECB模式下运行AES。您不是在派生密钥。而且,您很难对密钥进行编码。
您似乎也遇到了内存管理问题。您似乎没有在FileSize
任何地方使用。
是否有更好的库可以使用AES加密?
如果要使用OpenSSL,则可能应该使用EVP_*
接口并使用经过身份验证的加密模式,例如GCM。使用GCM模式,您可以获得机密性和真实性。请参阅OpenSSL Wiki上的EVP身份验证加密和解密。
假设我想使用另一个关键字“ HelloWorld”。我可以只使用该字符串并将其用作加密算法的参数吗?我必须设置密钥的正确位长吗?如果可以,怎么办?
您应该派生密钥,而不是直接从密码短语中使用它。请参阅EVP_BytesToKey(3)
和PKCS5_PBKDF2_HMAC(3)
在OpenSSL文档中(OpenSSL Wiki没有文章或示例代码)。
...我应该坚持使用OpenSSL
如果正确使用该库,那么您应该对此感到满意。
否则,您可以使用任何其他喜欢的库。有关其他选择,请参见OpenSSL Wiki的“相关链接”页面。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句