Java中的DSA与RSA和AES128与AES256加密

时间:2012-02-20 21:24:23

标签: java client-server rsa aes dsa

DSA& RSA

不是关于哪一个更强。

我一直在互联网上研究这个主题,下面是我所掌握的信息摘要。 你能否告诉我它是否正确,以及是否还有其他重要问题我不在这里提及。

这里我只讨论DSA与RSA在Java应用程序中的应用。 我的主要目标 - 使用公钥算法从客户端向服务器发送会话密钥(AES),然后检查客户端的真实性。

DSA。
1。在Java中,您应该使用私钥加密文件。
2。这意味着IT是签名 - 任何拥有公钥的人都可以阅读它,但只有所有者才能签名。
3。如果您尝试将公钥用作私有,反之亦然,那么您将遇到麻烦,因为通过私有方式猜测公钥并不困难。
4。您实际上无法使用DSA发送会话密钥,因为每个人都可以解密它。

RSA。
1。在Java中,您应该使用公钥加密文件。
2。这意味着这是向一个特定接收者传递秘密消息的最佳方式。除了主人之外,没有人可以在签名后阅读。
3。如果你尝试互相切换键会带来麻烦(与上面相同)
4。您可以有效地使用RSA为客户端发送使用服务器的开放密钥加密的会话密钥,然后从使用客户端打开密钥签名的服务器接收确认。

基于此,我决定将RSA用于我的目的。

AES256与AES128

另一个不相关的问题 - 您是否认为对于没有任何极端敏感数据的会话加密,使用AES256是有意义的?

我愿意,但它会给最终用户带来麻烦。我知道安装更新到Java允许256位密钥是非常容易的,但令人遗憾的事实是即使这么简单的事情也可以将潜在的用户群减少一半。

另一方面 - 如果我不发送敏感信息(如信用卡号码)并且每个密钥的使用时间不会超过几天,那么AES128就足够了吗?

显然,我将为那些不需要安装更新的用户提供使用AES256的选项。

感谢您的任何评论!

2 个答案:

答案 0 :(得分:2)

正如您所发现的,DSA只是一种签名算法,而不是加密算法,因此不适合密钥交换。

如果您有在线连接(而不仅仅是从一个点传输到另一个点),您可以使用Diffie-Hellman(基于类似DSA的想法),并在签名模式下使用DSA或RSA来验证其他为了避免中间人攻击。

除此之外,RSA密钥交换也很常见(即发送使用服务器的RSA密钥加密的密钥AES密钥)。

对于AES变体,AES-128应该在任何时候都是安全的(即暴力应该比你的生存时间更长)。由于美国军方希望对不同的东西使用不同级别的安全性,因此只有一个更大的关键变体。 (而且,AES-256最近显示出一些(理论上的)弱点,这些弱点不在AES-128中,这可能意味着AES-128实际上更安全。)

但正如Kerrek评论的那样,不要试图发明自己的协议,使用现有协议。您将犯下其他人之前所犯的所有错误,并添加新的错误。 (如果需要,您可以自己实现这些协议,但是重用现有实现也更容易和更安全 - 即使使用安全协议也会有很多问题,例如使用错误的随机数。)< / p>

对于在线(双面)通信,SSL(或现在更好的后续TLS)是要走的路。在Java中,它可用作SSLEngine类(如果要使用异步I / O),或者使用SSL(Server)SocketFactory(用于正常的套接字读/写)。我将它用于applet /服务器通信(对于我的项目fencing-game)。

对于离线(单向)通信(如电子邮件)或存储,请使用PGP数据格式(也可以使用RSA和AES)。 (但我不知道现有的Java实现。)

答案 1 :(得分:1)

DSA表示“数字签名算法”。它适用于签名。您无法使用它来加密任何内容。

AES128 足够足以保护敏感信息。甚至美国政府也允许将其用于除了被列为TOP SECRET的信息以外的任何信息,并且这只是因为“更安全而不是抱歉”的心态,并且考虑到这些信息如果在50年后解码可能仍然有害。我会毫不犹豫地使用它来传输信用卡号码(毕竟,这些号码将在不到10年后到期)。