使用AES加密文件

凯文

我正在尝试构建一个程序来接收文件(任意大小的EXE),对其进行加密并将其复制到结构中。然后稍后对其进行解密,并确保其使用相同。

我很难加密然后解密文件。它似乎没有正确加密,我也不知道如何测试。

这是我的问题:

  1. 我在这里做错了什么?
  2. 是否有更好的库可以使用AES加密?还是我应该坚持使用openSSL
  3. 假设我想使用另一个关键字“ 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技能有点生锈。

w

我在这里做错了什么?

好吧,这有点太开放了,无法彻底回答。

从显而易见的地方开始,您正在使用低级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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章