我刚刚完成了一个应用程序,一个简单的信使客户端和我希望加密所有数据,无论是3或200个字母的短语。
此类应用的最佳算法是什么?此时我正在尝试将3DES与crypto ++一起使用(在VC10上),但填充和其他事情看起来有点困难。
我不熟悉密码学,所以欢迎任何有用的建议。
答案 0 :(得分:8)
使用TLS,比如OpenSSL,这是一种久经考验的技术,用于保护传输中的数据 (尽管您需要一个受信任的根节点, and there are PROBLEMS with that所以你可能想要签名。
之后,您应该询问是否需要在本地 存储 这些消息,如果是,那么是否要加密它们。安全性要求不同 - 受密码保护的对称密码可能更合适。
如果您担心安全的聊天服务,那么您可能会担心安全的 匿名 聊天服务,在这种情况下您可能需要查看{ {3}}
答案 1 :(得分:4)
一个重要因素是预期网络连接的可靠性。如果您不希望丢失很多数据包,或者到达的数据包很晚,那么您可以在链接模式下使用流密码或对称分组密码。如果您期望更多的网络不可靠,那么ECB模式下的对称分组密码会更合适,因为丢失的数据只会丢失数据,并且不会使整个事情不同步。你想用一些随机数据填充每个明文块;例如,如果每个块是64位,则使该数据最多为32位,其余为随机。这样,如果多次发送相同的数据就不会很明显。
一般来说,PKC不用于加密消息。它用于加密随机会话密钥,然后与快速对称算法(如3DES,AES或Blowfish)一起使用。
答案 2 :(得分:3)
首先,几乎仅使用3DES的原因是与已经使用3DES的其他东西兼容,并且不支持任何更新的东西。 3DES主要是一种快速入侵,允许预先存在的DES(特别是在硬件中)的实现继续使用直到它们被替换 - 但它通常是一个非常糟糕的选择。 DES实际上是用硬件实现的 - 在软件中,它需要大量的CPU时间来实现安全性。
其次,你还没有真正告诉我们这种情况给出真正的答案。你是在谈论一个基本封闭的系统,你可以在那里预先分享密钥给用户,或者通过一些带外手段获得密钥(例如,打电话给他们,同意一个密钥,然后在那之后他们可以在没有进一步调用的情况下使用它吗?)或者您是否需要能够接受任意用户而无需任何手动设置(更复杂)?用户是否需要某种方式来验证服务器的身份,或者您是否希望他们只相信响应正确的URL 将成为正确的服务器(同样,添加此类验证会添加很多更复杂)?
为了论证,我们假设您需要加密但不需要验证(即,没有必要验证与正确服务器的连接)。在这种情况下,我首先选择AES - 众所周知,易于获得,经过深入研究,并且就公知而言,非常安全。
从那里,您需要选择一个键。一种典型的方式是使用一些公钥协议(例如,RSA)来交换密钥。一种可能的方法是客户端将其公钥发送到服务器。服务器生成会话密钥(只是一个正确大小的随机数用作加密密钥),使用客户端的公钥对其进行加密,然后将结果发送回客户端。对于该会话的剩余部分,使用该会话密钥使用对称协议(例如,AES)对在两者之间交换的所有数据进行加密。
至于如何生成随机数:请不使用rand()
或该订单上的任何内容。通常的方法是在所谓的计数器模式下使用相同的加密算法(AES) - 您只需保留一个计数器,并创建一个密钥,您可以增加内部保留的计数器,使用某个密钥对其进行加密,并使用结果作为会话密钥。
由于其他人已经提到了使用加密的操作模式,我也会在这上面加上我的两分钱:你可能不想要使用ECB,除非你真的期望一个非常嘈杂的连接,和接收器获取所有可能的数据非常重要,即使存在向攻击者公开数据的风险。
CBC(只有一个明显的可能性)使几乎具有从丢失的数据包中恢复的能力(它是自同步的,因此传输中的突发噪声可以破坏两个数据包而不是像在ECB中),但伟大的会更多地隐藏攻击者的数据。
答案 3 :(得分:-2)
我认为RSA会完成这项工作,您可以使用哈希来检查数据是否已更改