使用AES算法加密不规则大小的大文件

时间:2014-06-29 06:44:05

标签: c encryption cryptography aes

目前在我的项目中,我需要加密一个可变大小的文件(大约1到1.5 GB)

我正在使用openssl项目中的aes算法。但我没有使用整个库,只是一些从"密码"生成密钥的函数。并使用这些密钥加密128字节的固定块

简而言之,

void aes_encrypt(char* in, char* out , AES_KEY ekey);
void aes_decrypt(char* in, char* out , AES_KEY dkey);

现在的主要问题是这些函数的块大小仅为128字节。

所以我必须编写一个包装函数,它接受我的文件并将其分成128个字节的块,并将其提供给这些加密/解密例程。

所以我的问题是,

  • 在我的包装器中,我如何处理文件大小不是的情况 128的整数倍
  • 我是否需要用0&#39填充加密文件以构成
  • 的倍数
  • 如果是这种情况,我如何识别我已完成的零填充量,据我所知,只需删除0的最后一位 从文件中,可能会导致文件失去完整性,尤其是如果 该文件最后恰好包含一个0。
  • 将标头添加到加密文件是否是更好的方法, 包含文件的大小信息,可能包含文件的大小信息 校验和。

感谢。

ps:我不熟悉加密(特别是AES)

1 个答案:

答案 0 :(得分:3)

块长度为128位或16字节。例如,您可以使用PKCS7填充(参见RFC 2315的第10.3节)使最后一个块长16个字节。

它的工作原理如下:如果需要添加一个字节,则添加一个带有值的字节(所有值都以十六进制显示)01,如果需要添加两个字节,则添加两个字节,其值为{{1} }}, 等等。如果不需要填充,您仍然需要添加一个带有16个填充字节的块,其值为02

要删除填充字节,只需查看文件的最后一个字节,它就会给出要删除的字节数。

另请注意,ECB模式(彼此独立加密块)可能不是最佳使用方式,请同时查看CBC模式。