【问题标题】:Encrypt file Using AES使用 AES 加密文件
【发布时间】:2014-07-04 15:38:22
【问题描述】:

我正在尝试构建一个程序,该程序接收文件(任意大小的 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 技能有点生疏。

【问题讨论】:

  • 这实际上是您使用的代码吗?因为你释放(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


【解决方案1】:

我在这里做错了什么?

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

从显而易见的开始,您正在使用低级 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 页面了解一些替代方案。

【讨论】:

  • 你不喜欢你可以创建关于加密的非常广泛的答案的方式,只是被提出问题的人忽略吗?我投票赞成您的一些(未接受)答案。感谢您在此处提供的 OpenSSL 相关答案!
  • @jww 感谢您为我指明了正确的方向。很抱歉,我花了这么长时间才让您的答案成为正确答案,但我一直在努力,最终使用您的建议(以及其他人)解决了它。我在这里发布了一个使用 EVP api 的解决方案:[link] stackoverflow.com/questions/24856303/… 这适用于二进制数据,因此可执行文件也将被加密。再次感谢。
【解决方案2】:

这是我使用 Javascript 进行 AES 加密的示例。

直播平台是here

AES 代码位于here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2014-01-18
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多