RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,广泛用于数据加密和数字签名领域。它是由 Ron Rivest、Adi Shamir 和 Leonard Adleman 于 1977 年共同提出的。
RSA 算法常用于如下场景:
- 公钥加密,私钥解密
- 私钥加密,公钥解密(不推荐)
- 私钥签名,公钥验签
通过 Java 包下的工具类可以生成 RSA 公钥和私钥。
如上,通过 创建 RSA 密钥对生成器,然后通过 方法指定 RSA 的密钥长度为 2048 位。注意,RSA 密钥长度位数必须是 512 的倍数,最小为 512,密钥长度越长,越安全(难激活成功教程),但是 密钥的生成、加密、解密都会更加的耗时。一般来说,目前最常见、安全的 RSA 密钥长度为 2048 位。
最后生成 密钥对,然后从密钥对中获取到 公钥 和 私钥。
执行 main 方法,生成的密钥对如下:
你可以看到,私钥要长得多。而且,每次生成的密钥对内容都是不一样的。
使用公钥加密数据,私钥解密。这是最常见的用法。
方法用于加密数据,参数 可以指定公钥或者是私钥, 表示原文,最后加密的结果会输出到 中。
考虑到要加密的原文可能会很大,因此通过 流进行分段加密。对于 2048 位的密钥(使用 PKCS#1 v1.5 填充方案,填充开销通常为11字节)来说,分段加密的最大长度为 字节。
方法用于解密数据,参数 可以指定公钥或者是私钥, 表示 加密后的密文,解密后的结果输出到 中。这里也采用了分段解密的方式,对于 2048 位的密钥来说,分段解密的最大长度为 字节。
最后,在 方法中,按照上一节的方式生成 RSA 密钥对。
首先使用私钥加密原文,获取到密文后,再用公钥解密密文。获取到原文。
执行 main 方法,输出如下:
如上,成功地加密解密了数据,
RSA 算法的执行速度较慢,尤其是对于大型密钥和数据。因此,在实际应用中,通常使用 RSA 算法来加密对称密钥(如 AES),然后使用对称加密算法加密实际的数据,以提高效率。
还是使用上节中的 main 方法,只需要调换一下加密、解密的密钥即可。
执行 main 方法,输出如下:
私钥加密、公钥解密的方式在加密通信中不推荐使用,原因如下:
- 安全性:私钥加密、公钥解密方式容易受到中间人攻击(Man-in-the-Middle Attack)。在这种攻击中,攻击者可以截获公钥,将其替换为自己的公钥,并将解密和加密操作重定向到自己的密钥上。这样,攻击者就可以轻松地获取敏感信息。
- 效率:私钥加密、公钥解密的过程相对于公钥加密、私钥解密更加耗时。私钥加密通常需要进行较大的计算量,因为私钥的长度通常比公钥更长。这会导致加密和解密操作的延迟增加。
- 密钥管理:私钥是加密系统中的重要组成部分,其安全性至关重要。在私钥加密、公钥解密的方式中,需要确保私钥的安全存储和传输,以防止未经授权的访问。相比之下,公钥可以公开传播,并不需要像私钥那样严格保护。
所以,常见的做法是使用公钥加密、私钥解密的方式来确保加密通信的安全性。这种方式可以保证加密过程在公共网络上进行,而私钥只保留在通信的接收方,从而更好地保护了敏感信息的安全性。
私钥签名和公钥验签是一种常见的数字签名机制,用于验证消息的完整性和身份认证。
- 私钥签名
- 发送方使用其私钥对消息进行签名。具体过程为先对消息进行哈希运算,然后使用私钥对哈希值进行加密。这样产生的密文就是数字签名。
- 私钥签名的关键是私钥的保密性,只有私钥的持有者才能生成有效的签名。
- 公钥验签
- 接收方收到消息和相应的数字签名。
- 接收方使用发送方的公钥对数字签名进行解密,得到签名的哈希值。
- 接收方对接收到的消息进行哈希运算,得到消息的哈希值。
- 最后,接收方比较解密得到的签名哈希值与计算得到的消息哈希值是否一致。
- 如果两个哈希值相同,说明签名有效,消息没有被篡改,并且发送方的身份得到了验证。
私钥用于生成签名,公钥用于验证签名。由于私钥是私密的,只有签名者可以生成有效的签名,而公钥是公开的,任何人都可以使用公钥验证签名。
数字签名可以提供消息的完整性和身份认证,确保消息在传输过程中没有被篡改,并且发送方是可信的。它在许多领域中被广泛应用,如电子邮件、网络通信和数字证书等。
方法使用 RSA 私钥 对数据 进行签名并返回,签名使用的算法通过 参数指定。
方法则使用 RSA 公钥 校验数据 的签名 是否合法,同样,通过 参数指定和签名时一样的算法。
最后,在 main 方法中,先根据第一节中的方法生成 RSA 密钥对。
然后调用 方法,使用私钥对原文 进行签名,获取签名结果。
得到签名后,再调用 方法,使用公钥验证原文 的签名是否合法。
这里的签名和验签均使用同一算法:。
执行 main 方法,输出如下:
验签时,如果 签名 或者是 原文 有任何改动,那么签名就会验证失败。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/15917.html