RSA中通过KeyPair来生成公私匙
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
在做数字签名或者加解密时,为什么不直接使用上门的公私匙 而是要对公私匙做转化
比如公匙
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey publicK = keyFactory.generatePublic(keySpec);
比如私匙
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
目前网上的帖子基本都是用转化后的公私匙
但自己在方法里试了下 在签名 验签方法里如果直接使用 不转化的 也是可以做数字签名的,那这几步转化的意义何在,求达人告知下 。
简洁性:对信息原文做hash,得到digest。信息越短加密的耗时越少。
不可抵赖性:信息拥有者要保证签名的唯一性,必须是唯一能够加密digest的人,因此必须用私钥加密(就像字迹他人无法学会一样),得到签名。如果用公钥,那每个人都可以伪造签名了。
4.数字证书
问题起源:对1和3,发信者怎么知道从网上获取的公钥就是真的?没有遭受中间人攻击?
这样就需要第三方机构来保证公钥的合法性,这个第三方机构就是CA(Certificate Authority),证书中心。
CA用自己的私钥对信息原文所有者发布的公钥和相关信息进行加密,得出的内容就是数字证书。
信息原文的所有者以后发布信息时,除了带上自己的签名,还带上数字证书,就可以保证信息不被篡改了。信息的接收者先用CA给的公钥解出信息所有者的公钥,这样可以保证信息所有者的公钥是真正的公钥,然后就能通过该公钥证明数字签名是否真实了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。