【发布时间】:2018-05-24 09:48:52
【问题描述】:
首先这是我在这里的第一个问题,我希望我可以让您清楚地了解问题并帮助可能面临类似挑战的其他人!问题的标题也是最短的 TL;我能得到的 DR :-)
所以为了给你一些背景信息,我基本上是在设计一个协议,该协议需要从服务器(在 Node.js 中实现)到设备的同步和有序文件传输,通过 TCP。流式传输文件不是一种选择,因此每个文件块都封装在具有其他未加密字段的消息中,这些字段超出了此问题的范围。
其中一个要求是文件内容不能以纯文本形式发送,因此必须选择加密方案,在这种情况下我选择 AES-256-CBC,假设出于这个问题的目的,算法不能改变。
由于设备限制(RAM ~10KB),需要将文件()分割成块,然后根据上述协议发送到设备,遵循发送/[ack|repeat] 方案。在接收时,设备能够将块存储在磁盘上。
所以我的主要问题是在后端我必须选择:
-
加密整个文件,然后将其拆分成块
-> 在接收设备上会将每个块附加到文件中,然后在收到所有块时对其进行解密。
对比
-
将文件分成块,然后对每个块进行加密。
-> 需要发送用于每个块加密的初始化向量 (IV) 以便对其进行解密。
-> 在接收块时,设备必须解密该块或将它们中的每一个与各自的 IV 一起存储,然后在接收到最后一个块后解密它们。
这里的目标是了解每种方法会产生哪些安全问题,以及它们之间的开销比较。
PS:我也有一个完整性验证方案,但不在问题范围内。
【问题讨论】:
-
我暂时删除了我的答案,因为鉴于您的新信息,它不再相关。我会尽快发布新答案。
-
好的,感谢您的意见和理解! @LukeJoshuaPark
-
您可以使用流加密模式并以这种方式加密整个套接字流。这更好,因为不再需要处理块和填充。 .NET 没有内置流模式,但流行的加密库支持它。您可以继续使用 AES。
-
目标不是加密所有消息数据,而是加密其中的一些字段,这就是加密套接字方法在这种情况下无效的原因@usr
-
您能否再次澄清为什么不能选择流式传输以及为什么您认为需要 ACK?我也不太明白你所说的“块”到底是什么意思。您是否有一大块加密数据,然后是一大块未加密数据等等?
标签: security encryption tcp aes cbc-mode