【问题标题】:Encrypting a Large File of irregular size using AES algorithm使用 AES 算法加密不规则大小的大文件
【发布时间】:2014-06-29 06:44:04
【问题描述】:

目前在我的项目中,我需要加密一个可变大小(大约 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 填充加密文件以使倍数为
  • 如果是这种情况,我如何识别我所做的零填充量,因为我知道只需删除 0 的最后一位 从一个文件,可能会导致文件失去完整性,特别是如果 该文件恰好在末尾包含一个 0。
  • 在加密文件前附加标头是否更好? 包含文件的大小信息,可能还有它的 校验和。

谢谢。

ps:我是加密新手(尤其是 AES)

【问题讨论】:

  • 除非这是关于学习 AES,否则您应该真正使用 EVP_ 更高级别的函数。如果您不能(因为运行时间极其有限?),您可以随时尝试复制EVP_ 功能的行为。特别是如果您只是使用 AES 而不知道如何首先执行加密 - 即使 EVP_ 也不会保护您免受诸如“......在文件中失去完整性......”之类的想法。
  • 谢谢,我一定会用EVP_

标签: c encryption cryptography aes


【解决方案1】:

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

它的工作原理是这样的:如果需要添加一个字节,则添加带有值的字节(所有值以十六进制显示)01,如果需要添加两个字节,则添加带有值02 的两个字节,并且很快。在不需要填充的情况下,您仍然需要添加一个具有 16 个填充字节的块,其值为 10

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

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

【讨论】:

  • 你的 10 真的是 16,不是吗?您应该以 0x 为前缀或使用 16 位小数来清楚。
  • @jim-flood 即使是在 2-digit 格式的 byte 值的上下文中?你是认真的吗?
  • @AntonSamsonov 是的,我是认真的,不是吗?这既是祝福,也是诅咒。 :^)
  • @AntonSamsonov 如果我们将答案写给有经验和有能力的程序员阅读,我们肯定会回答 0b10 倍的问题。
猜你喜欢
  • 2021-05-19
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2015-02-05
  • 2015-02-23
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
相关资源
最近更新 更多