Java中的DSA与RSA以及AES128与AES256加密



DSA&RSA

这与哪一个更强无关。

我一直在网上研究这个话题,下面是我得到的信息摘要。你能告诉我它是否正确,以及是否有任何其他我在这里没有提到的重要问题吗。

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

DSA。
1.在Java中,应该使用私钥对文件进行加密。
2.这意味着它是一个签名-任何拥有公钥的人都可以读取它,但只有所有者才能签名。
3.如果你试图将公钥用作私钥,反之亦然,你会遇到麻烦,因为按私钥猜测公钥并不难。
4.您实际上不能使用DSA发送会话密钥,因为每个人都可以解密它。

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

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

AES256与AES128

另一个无关的问题——你认为对于没有任何极其敏感数据的会话加密,使用AES256有意义吗?

我很愿意,但这会给最终用户带来问题。我知道安装允许256位密钥的Java更新非常容易,但可悲的事实是,即使是这样简单的事情也可以将潜在的用户群减少一半。

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

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

感谢您的评论!

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

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

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

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

但正如Kerrek所评论的,不要试图发明自己的协议,使用现有的协议。你会犯以前犯过的所有错误,并添加新的错误。(如果你愿意,你可以自己实现这些协议,但重用现有的实现通常也更容易、更安全——即使使用安全的协议,也有很多错误,比如使用坏的随机数。)

对于在线(双边)通信,SSL(或者现在更好的是它的继任者TLS)是可行的。在Java中,它可以作为SSLEngine类(如果您想使用异步I/O)或SSL(Server)SocketFactory类(用于普通套接字读/写)使用。我把它用于小程序/服务器通信(用于我的项目击剑游戏)。

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

DSA的意思是"数字签名算法"。它是用来签名的。您不能使用它来加密任何内容。

AES128对于敏感信息来说足够安全。即使是美国政府也允许使用除被列为最高机密的信息之外的任何信息,这只是因为"安全总比抱歉好"的心态,并考虑到如果在50年后解码这些信息可能仍然有害。我会毫不犹豫地用它来传输信用卡号(毕竟,信用卡号不到10年就会过期)。

最新更新