我正在开发一个项目,该项目涉及使用UDP通过高性能套接字连接发送一些非常小的加密消息。我在其他帖子中读到,AES应该使用128位密钥加密的最小字节数是块大小,即16字节。
但是,真正的问题是 - 这足以提供良好的保护吗?我正在考虑使用一种方案,将一些随机数据添加到消息中,并获得1到12之间的随机数,用于将4字节的实际数据放入块中。块中的零字节将是随机数,它是4字节块中的起始位置。构建块后,将使用128位密钥使用AES对其进行加密。客户端断开连接后,数据没有任何值,连接最多不应超过24-48小时。这样的事情会起作用,还是应该发送更多数据以使潜在的对手更难打破?
我还将加密在用户断开连接后需要保护的其他数据,如信用卡号,银行帐户信息,密码哈希等。我计划使用带有256位密钥的AES。因此,对于这种情况的同样问题 - 应该加密的最小字节数是多少,以便为256位密钥提供良好的保护? 16个字节是否足够,或者32个会更好?
我打算使用bouncy castle的快速AES引擎来处理小消息。参见:
http://www.bouncycastle.org/csharp/index.html
对于256位AES加密,我正在考虑使用RijndaelManaged,因为它似乎在服务器上具有更好的安全功能,并且对于这些不常见的事务而言,性能不是很大的问题。
答案 0 :(得分:3)
首先,密文越少,攻击的可能性就越小。看来你认为这是相反的方式。
对于UDP,我强烈建议您查看计数器模式加密。优点是可以预先计算密钥流,这使得低延迟加密/解密成为可能。它也不需要填充,因此您不必发送超过所需数据的数据(请注意,您有关于数据长度的辅助通道,因此可以清楚地看到“是”和“否”之间的差异)。你确实需要一个好的NONCE。
如果您想要完整性保护,那么GCM模式加密是非常可取的。如果它不可用,请查看密码文本上的HMAC或MAC - 但您需要两个密钥而不是一个密钥。