首页 > 编程知识 正文

一个私钥对应多个公钥,什么是公钥和私钥

时间:2023-05-04 15:32:35 阅读:148065 作者:2451

1、使用生成密钥,如果路径d:/wymtest.keystore不存在,则自动创建; 如果存在,则添加到其中

c : (users keytool-genkey-alias test 11-keyalg RSA-keysize 1024-key stored :/wy mtest.keystore-validity 4000

-validity参数指定创建的证书的有效期为几天

-指定-alias test11别名; 如果密钥库包含多个公钥/私钥对和证书,则必须使用别名。 同一密钥库中可以包含多个条目(公钥/私钥对和证书),它们在密钥库中通过别名(alias )进行区分。

例如,如果再次使用test11别名运行,则不会创建错误: keytool错误: java.lang.Exception:键值对,并且别名已存在

如果密钥库只有一个密钥对别名,则可以使用jdk的方法来获取别名并对其进行解密。

但是,如果密钥库中存在多个别名的话,由于无法区别该别名属于哪个密钥对,所以不要使用此方法

fileinputstreamis=new file inputstream (new file (' d :wy mtest.keystore ' ) ); keystore keystore=keystore.getinstance (jks ); keystore.load(is,' 123456'.toCharArray ) ); enumerationaliasenum=keystore.aliases (; 字符串密钥别名=' '; while (alias enum.hasmoreelements () keyalias=(string ) aliasEnum.nextElement ); System.out.println (别名' keyAlias ); }输出结果:别名test11

2、加载公钥。 测试签名验证

publicstaticvoidmain (stringaa [ ] throws exception ) fileinputstreamis=new file inputstream (new file (d : ) //此处输入的keystore密码是keystore.load(is,' 123456'.toCharArray ) ),其中两个密码可以不匹配; //加载别名,认为这里只有一个别名,可以这样取; 如果有多个别名,则别名将通过参数传递。 否则,第二次是第一次enumerationaliasenum=keystore.aliases (); 字符串密钥别名=' '; while (alias enum.hasmoreelements () keyalias=(string ) aliasEnum.nextElement ); System.out.println (别名' keyAlias ); } certificate certificate=keystore.get certificate (key alias ); //公钥公共密钥=keystore.get certificate (key alias ).get公共密钥; //加载私钥。 在此处键入私钥密码privatekeyprivatekey=() keystore.private key entry (keystore.get entry ) keyalias, newkeystore.paswordprivate ) )//另一种加载私钥的格式//private key private key=(private key ) keystore.getkey (key alialialias ) //base64私钥string strkey=base64.encode base64 string (private key.get encoded ) ); system.out.println(strkey ); //测试签名string sign=base64 .编码base64 string (sign ('测试msg'.getBytes ),privateKey,' SHA1withRSA ',null ) ); //测试测试测试为boolean verfi=verify (测试msg(.getbytes )、base64.decodebase64(sign )、publicKey、) SHA1withRSA,为空} /** *签名* /公共静态字节[ ] sign (byte [ ] message,PrivateKey privateKey,String algorithm,String provider ) thrign } else { signature=signature.getinstance (algorithm,provider ); }signature.initsign(privatekey ); signature.update(message; return signature.sign (; } /** *验证签字*/publicstaticbooleanverify (byte [ ] message,byte[] signMessage,PublicKey publicKey,String algorithm string algorithm if (null==provider|| provider.length (==0) ) signature=signature.getinstance (algorithm ); } else { signature=signature.getinstance (algorithm,provider ); } signature.init verify (public key ); signature.update(message; return signature.verify (sign message; (最终输出: true。 表示通过了加载和测试。

3、在这个keystore中是单个密钥对。 下面再放一个试试。

keytool-genkey-alias test 22-keyalg RSA-keysize 1024-key stored :/wy mtest.keystore-validity 4000

再输入test22这个别名。 不要每次都使用相同的别名。 否则会报告错误。 没有在java.lang.Exception:中创建键值对。 别名xxx已经存在

请参阅。

此时,按照上面1,的方法测试输入为以下:

别名test11

别名test22

因此,如果keystore中存在多个别名,则应该通过参数传递别名。

(附带)使用openssl等工具生成证书和密钥时,别名不是必需的。 制造时未指定,但有默认别名。 例如1 )2) 3等。 获取密钥和证书时,必须指定别名。

其他命令: https://blog.csdn.net/u 014386474/article/details/51996019

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。