2

DSA 和 RSA

不在于哪个更强。

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

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

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

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

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

AES256 与 AES128

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

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

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

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

感谢您的任何评论!

4

2 回答 2

3

正如您所发现的,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),也可以使用 a SSL(Server)SocketFactory(用于普通套接字读/写)。我将它用于小程序/服务器通信(用于我的项目fencing-game)。

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

于 2012-02-20T21:41:09.470 回答
1

DSA 的意思是“数字签名算法”。是用来签名的。你不能用它来加密任何东西。

AES128对于敏感信息来说足够安全。甚至美国政府也允许将其用于除被归类为绝密的信息之外的任何东西,这只是因为“比抱歉更安全”的心态,并考虑到这些信息如果在 50 年后被解码仍然可能有害。我会毫不犹豫地用它来传输信用卡号(毕竟,它会在不到 10 年的时间内到期)。

于 2012-02-20T21:32:12.423 回答