我希望使用共享密码/密钥来保护基于TCP的程序的通信。在不必处理块大小,填充...的情况下,最简单的方法是直接使用stream cipher。这样做,清除和加密数据之间的数据量不会改变,修改也很简单。
仅使用流密码意味着没有身份验证,我一直认为/听说没有身份验证的加密不够安全,不应该使用。
如果必须在流密码中添加身份验证,我们就会失去流密码添加的简单性,因为我们必须添加HMAC或使用经过身份验证的加密方法(如来自NaCl的crypto_secretbox),这是一个最小的消息长度,我们必须处理填充,...
你会推荐什么?在某些特定情况下,仅使用流密码而不进行身份验证是否安全?
答案 0 :(得分:1)
使用某种消息身份验证器特别对流密码非常重要,因为密文更改与明文更改之间的关系非常简单。
你不能盲目地去应用流密码而不向流中添加任何额外的信息,无论如何 - 记住流密码最重要的规则:
因此,除非您只是要加密单个连接,并在之后抛弃密码,否则您需要为共享密钥中的每个连接生成一个会话密钥。这意味着你需要在连接开始时发送一些额外的信息,因为无论如何你发送它,在每条消息之后发送HMAC应该没什么大不了的。
使用流密码因为它似乎更简单通常是一个错误,无论如何。你提到了来自NaCl的crypto_secretbox
- 我建议使用它,它将为你处理身份验证和填充问题。
答案 1 :(得分:1)
您可以考虑在GCM-mode中使用AES。这将为您提供内置身份验证的流密码。