当前位置: 首页 > 知识库问答 >
问题:

使用AES-256-CBC的文件加密与区块加密

仲孙绍元
2023-03-14

首先,这是我在这里的第一个问题,我希望我能让你对这个问题有一个清晰的认识,也能帮助其他可能面临类似挑战的人!问题的标题也是最短的TL;我能得到的医生:-)

所以为了给你一点背景知识,我基本上设计了一个协议,需要通过TCP从服务器(在Node.js中实现)到设备的同步有序文件传输。流式传输文件不是一个选项,因此每个文件块都封装在一条包含其他非加密字段的消息中,这些字段超出了本问题的范围。

其中一个要求是,文件内容不能以纯文本形式发送,因此必须选择加密方案。在本例中,我选择AES-256-CBC,假设出于这个问题的目的,算法不能更改。

由于设备限制(RAM~10KB),需要拆分文件(

因此,我这里的主要问题是,在后端,我必须在以下两者之间进行选择:

>

-

>

-

-

这里的目标是了解每种方法都会产生哪些安全问题,以及它们之间的开销比较。

PS:我也有一个完整性验证方案,但不在问题的范围之内。

共有2个答案

姚星腾
2023-03-14

我觉得这个问题中有一些部分没有提到,这将有助于更好地了解问题,但从表面上看,根据提供的信息,第二种选择可能会更好。

对于第一个选项,您限制了方案的延展性,因为对于给定块,由于使用CBC模式,您不太可能动态解密内容。虽然这可能不是您的计划目前的要求,但可能是在将来。

使用第二个选项,可以将数据作为独立Blob传递。您可以随意加密和解密这些Blob,并在必要时组合它们。

每个选项都可能有更多的优点/缺点,但您提供的计划细节并没有提供一个了解它们是什么的机会。我建议你谨慎行事。我知道你正在使用的设备有着非常严格的要求,这使得传统的密码术失去了奢华,但是设计和实现你自己的密码系统是非常困难的,特别是在这样严格的要求下。听起来你们的计划似乎并没有提供前向保密,这意味着若推进的话,任何其他问题都可能是灾难性的。

阎经武
2023-03-14

为了回答你的问题,除了我的另一个评论中的关键AES问题之外,我认为最好的方法是第二个解决方案。但是在你的情况下,我会为每个块添加一个HAMC。所以:

  • 将文件分成块
  • 为每个区块生成一个IV
  • 使用相应的IV和AES密钥加密区块
  • 添加一个HMAC(使用与加密不同的AES密钥,因此需要2个AES密钥)计算每个区块的IV密码文本(重要的是使用加密区块而不是清除区块)
  • 发送您的区块
  • 在设备上接收您的区块
  • 检查每个区块的HMAC(这样它将确认区块未损坏且经过良好验证)
  • 使用第1个密钥和相应的IV解密数据
  • 添加所有区块以获取原始文件

第二个更安全,因为您可以控制之前解密的所有块。

我的意思是,如果你逐块加密并添加一个HMAC,当你在你的设备上收到一个块时,首先你检查HMAC,如果可以的话,你可以解密这个块。这样,如果有人在您的网络上试图破坏或其他任何块,HMAC可以验证加密块的来源和内容。

虽然这是不可能与您的第一个选项。如果有人试图在传输过程中破坏一个块,那么,充其量你不能解密你的全局块,最坏的情况是它可以给黑客一些关于加密系统的信息。这对攻击者来说只是拼图的一部分。这还不够,他需要更多的尝试来解密自己的一大块,但这是有风险的。

 类似资料:
  • 目前,我正在使用以下OpenSSL命令加密敏感文件: 以及解密: 到目前为止,这一切都很好,但由于我对加密和密码学没有太多经验,所以我想了解一下这是否是最好的方法。 我是否正确加密/解密文件?这样我是否充分利用了AES-256?我是否在这里做了一些可能会影响加密文件安全性的错误操作? 非常感谢评论/回复。 丹尼尔。 PS:我不太确定这是属于超级用户还是stackoverflow,请告知。

  • 我使用以下命令加密了一个文件 openssl rand 32>test.key openssl enc-aes-256-cbc-iter 10000-pbkdf2-salt-输入test.txt-输出test.txt.enc-通过文件:test.key 我的代码 我得到的错误 我引用了以下链接 尝试使用时,仍然得到错误

  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 我在Erlang中加密AES 256位CBC然后用c代码解密它时遇到了一个问题。而加密/解密在Erlang和C中有效,但不能从一个到另一个。 和 c 代码 我得到的错误是 当我在Erlang中解密时,它可以正常工作,当我在C中加密时,它也可以使用相同的Key和IV。它是否是密码模式不匹配。虽然在我看来是正确的。任何指针都会非常有用。谢谢。 我算出,同样的数据我用C加密和解密,然后进行十六进制转储。

  • 我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/

  • 几天来,我一直试图用java解密一个用OpenSSL加密的消息。使用以下命令对邮件进行了加密: openssl enc-e-aes-256-cbc-kfile$file.key-in toto-out toto.enc。 文件file.key包含256位的对称密钥。命令中没有指定salt,但文件以salted__开头。下面是我编写的类,试图解密文件,但即使删除文件的16个字符也无法得到任何东西,即