我应该使用哪种加密方法?

时间:2009-10-12 22:40:21

标签: encryption rsa aes

我需要一个系统来交换非常秘密的数据(源代码是商业秘密)。我会使用Crypto ++,所以实际上我可以使用所有加密算法,虽然我更喜欢使用行业标准。

目前我正在考虑这些方法:

  1. 让服务器生成2048/4096位RSA密钥,将公钥发送到客户端,让客户端加密数据然后将其发送到服务器。
  2. 使用像Diffie-Hellman这样的密钥交换方法(Diffie-Hellman-Merkle是正确的)来交换AES-256密钥。
  3. 启动TLS连接并直接告诉服务器AES密钥。
  4. 您认为我应该使用哪种方法?只要合理,我就不关心表现;安全是最重要的。如果没有,请提出另一种方法。

    P.S。:我可能会使用对称算法进行链接,比如AES-Twofish-Serpent。

    编辑:任何推荐的软件必须在不限制专有使用的许可证中。 LGPL是必须的限制。这排除了GPL。

3 个答案:

答案 0 :(得分:11)

不要开发自己的密钥交换和/或密钥配置协议。这是历史上破坏大多数产品的原因,除非你是一个cryoptographer(不是具有加密经验的程序员),否则你可能会错误。

使用SSL / TLS等现成协议。例如。使用RSA密钥对初始化TLS以进行相互身份验证和AES会话密钥听起来适合您所描述的内容

<强>更新

Bruce Schneier

  “一位同事曾告诉我,这个世界充满了糟糕的安全感   由阅读的人设计的系统   应用密码术“

在他的帖子中,erickson已经为您提供了大量证据,说明为什么设计自己的密钥配置和管理协议存在缺陷。我只是想把重点放在为什么马洛里还活着并且做得很好,多亏了过度自信的开发人员:

您设计了您建议的方案,客户端使用公钥加密并将文档发回给您。事情很有效,但是1年后证书即将到期。您使用包含您希望用户签名的公钥的新证书向您的客户发送电子邮件,以便为您加密文档。您不知道的是,在过去的4个月中,您的ISP管理员收到了通过远程计算机路由所有IP流量的贿赂。您的电子邮件在分发之前被截获,您的附加证书将被另一个证书替换。您的所有客户现在都在发送为其他人的私钥加密的超级秘密文件。应用程序解密每个应用程序,将其存储,然后使用您的公钥对其进行加密,并将流量转发给您。您甚至不知道发生了什么事情,直到访问客户网站时,您发现他使用的证书不是您分发的证书。

您在帖子中提到链式算法的选项。没有人会蛮力你。你的弱点将是密钥管理,攻击将采取某种形式的社会工程来愚弄某人正在使用错误的密钥,或者陶醉私钥(再次,贿赂还有很长的路要走)。行业认可的协议有防止中间人攻击的步骤,他们可能依赖于识别指定密钥使用和可信任权限的PKI基础设施,他们将证书撤销列表检查步骤添加到验证等等。只是'我公开加密密钥,你用私人解密'不会使秘密安全。

答案 1 :(得分:3)

我建议将现有的S / MIME(或CMS)实施与实体加密模块一起使用来加密您的内容。

S / MIME封装数据为“静止”加密数据的存储提供了一个很好的格式:信封记录有关所使用的算法和密钥的信息,以便以后在需要时可以获得授权收件人的信息。 / p>

此外,即使它不支持“最佳”算法(如ECDH密钥协议),一个好的库比一般程序员写的东西更不容易出现漏洞。由于它很远,更可能是安全性会被实施错误破坏而不是密码分析,因此最小化这些错误是有意义的。


在合法协议中,公钥由少数可信发行者之一签名,其公钥通过某种安全方式“带外”分发。如果您已经有一种安全的方法来获取邮件发件人的公钥,为什么还要另外发送?如果你不这样做,你就搞砸了。

TLS和S / MIME依赖于在每个客户端都拥有一组众所周知的CA证书。这些用于签署服务器的公钥,以便客户端可以检测替换密钥的尝试。协议无法自助启动;必须有一种安全的方式来在带外分发“信任锚”。

另请注意,与对称密码相比,RSA速度极慢。真实协议为AES等对称算法生成“内容加密密钥”,然后使用RSA公钥作为“密钥加密密钥”来加密内容加密密钥邮件收件人。


因此,主要问题是安全地获取客户的公钥。如果你能做到这一点,那么选项#1或#2都是好的 - 假设你只是使用那个公钥,而不是试图发送另一个“带内”。实际上,在CMS中,选项#1称为“密钥传输”,选项#2称为“密钥协议”。

在实践中,“服务器”可以使用已经众所周知的CA颁发的证书,或者客户端可以将证书的哈希值与您通过电话告诉他的证书的哈希值进行比较,或者将其划分为悬崖,或其他什么。关键是,所有的安全性取决于证书的完整性。你必须保护它免受篡改。

虽然Crypto ++是一个“行业标准”,但它的安全性取决于你如何使用它。 Just like Jerry told Kramer,“门必须...... 关闭!”使用Crypto ++中的加密原语与设计不良的协议将使你无处可去。这就是为什么我强调使用CMS(一种更高级别的协议)和一个好的加密模块(加密原语)。

答案 2 :(得分:0)

ssh怎么样? (例如ssh上的rsync)?