1

我想使用共享密码/密钥来保护基于 TCP 的程序的通信。无需处理块大小、填充等的最简单方法是直接使用流密码。这样一来,明文和加密数据之间的数据量不会发生变化,而且修改也很简单。

仅使用流密码意味着没有身份验证,我一直认为/听说没有身份验证的加密不够安全,不应使用。

如果必须向流密码添加身份验证,我们将失去流密码添加的简单性,因为我们必须添加 HMAC 或使用经过身份验证的加密方法(如NaCl 中的crypto_secretbox),有最小消息长度,我们必须处理填充, ...

你会推荐什么?在某些特定情况下仅使用流密码而不进行身份验证是否安全?

4

2 回答 2

1

使用某种消息验证器对于流密码尤其重要,因为密文更改与明文更改之间的关系非常简单。

无论如何,您不能盲目地去应用流密码而不向流中添加任何额外信息 - 请记住流密码最重要的规则:

永远不要重复使用相同的密钥流

因此,除非您只打算加密单个连接并在之后丢弃密码,否则您需要从共享密钥为每个连接生成一个会话密钥。这意味着您需要在连接开始时发送一些额外的信息,并且由于无论如何您都在发送,因此在每条消息之后发送 HMAC 应该没什么大不了的。

无论如何,使用流密码,因为它看起来更简单通常是一个错误。您从 NaCl 中提到crypto_secretbox过 - 我建议使用它,它会为您处理身份验证和填充问题。

于 2009-10-21T00:16:39.667 回答
1

您可以考虑在GCM-mode中使用 AES 。这将为您提供具有内置身份验证的流密码。

于 2009-10-21T08:01:15.050 回答