大家好,欢迎来到IT知识分享网。
第一种:直接从证书中获取公钥,x509格式的证书存有公钥不存在私钥
// 读取证书获取流
FileInputStream inStream = new FileInputStream(“E:\\….\\certjni\\1.cer”);
// 用证书工厂来创建证书.. (java.security.cert.CertificateFactory)
CertificateFactory cf = CertificateFactory.getInstance(“X.509”);
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
RSAPublicKey publicKey = (RSAPublicKey) cert.getPublicKey();
第二种:从byte数组中加载公钥 (publicKeyByte)
KeyFactory keyFactory= KeyFactory.getInstance(“RSA”); //java.security.KeyFactory
// java.security.spec.X509EncodedKeySpec
X509EncodedKeySpec keySpec= new X509EncodedKeySpec(publicKeyByte);
RSAPublicKey publicKey= (RSAPublicKey) keyFactory.generatePublic(keySpec);
私钥加载:加载的byte数组必须是 PKCS8标准格式
KeyFactory keyFactory= KeyFactory.getInstance(“RSA”);
//java.security.spec.PKCS8EncodedKeySpec
PKCS8EncodedKeySpec keySpec= new PKCS8EncodedKeySpec(privateKeyByte);
RSAPrivateKey privateKey= (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
第三种:用大质数生成公钥
BigInteger B1 = new BigInteger(modulus);
BigInteger B2 = new BigInteger(publicExponent);
RSAPublicKeySpec spec = new RSAPublicKeySpec(B1, B2);//存储的就是这两个大整形数 java.security.spec.RSAPublicKeySpec
try {
KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);
RSAPublicKey publicKey= (RSAPublicKey) keyFactory.generatePublic(spec);
} catch (Exception e) {
e.printStackTrace();
}
用大质数生成私钥:
BigInteger B1 = new BigInteger(modulus);
BigInteger B2 = new BigInteger(privateExponent);
RSAPrivateKeySpec spec1 = new RSAPrivateKeySpec(B1, B2);//存储的就是这两个大整形数
try {
KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);
this.privateKey = (RSAPrivateKey) keyFactory.generatePrivate(spec1);
} catch (Exception e) {
e.printStackTrace();
}
C++ 和 java 密钥互通
publicKey 对应 modulus (如果高位为1需要加0)
eNow 对应 public exponent
privateKey 对应 private exponent (如果高位为1需要加0)
===================证书中的公钥======================================
.cer证书,里面有个公钥 RSA(1024bit)
30 81 89 02 81 81 00 e1 e8 45 dc d2 af 83 1a 7c 11 d9 e4 f7 eb 84 85 33 d7 3e 96 47 33 68 29 ef 2b d9 c3 cf 5d 29 c3 d4 be 0a 9e 5d 45 05 6b 09 c0 57 b1 dd c5 87 66 1f 8e 87 5d 06 e1 48 2d 4d a6 f7 a9 d0 d3 65 f4 6a 9f 89 ce 55 10 ec c1 23 40 04 cf d5 47 ac 8a 93 6c b6 59 33 01 46 f8 0b 81 75 d4 bb dd fd 9f 3e d5 4a 75 2b f8 a1 50 15 69 6a 3d 73 f7 11 48 82 96 0e 0b f4 59 72 c0 83 a8 91 3f 30 c5 e9 cf 02 03 01 00 01
前7位不是key的主体因为所有的key都是这个开头的,后5位也不是主体,中间128位是key的主体
30表示SEQUENCE,81 89表示长度为89。 02表示整数,81 81表示长度为81。后面0x81(129)个字节表示n。(相当于 c++ 中的 publicKey)
由于n为正整数,而e1最高位为1,所以要加00(这是用0x81个字节表示128位key主体的原因) 再接着后面的02表示整数,03表示长度01 00 01为e的值,即e=65537
证书公钥加上X.509 固定头信息 {48, -127, -97, 48, 13, 6, 9, 42, -122, 72, -122, -9, 13, 1, 1, 1, 5, 0, 3, -127, -115, 0}之后
既可以利用第二种加载公钥方式生成公钥对象
第四种:java 自己生成公私钥对
KeyPairGenerator keyPairGen= null;
try {
keyPairGen= KeyPairGenerator.getInstance(“RSA”); //java.security.KeyPairGenerator
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
keyPairGen.initialize(1024, new SecureRandom()); // 初始化 1024位字节公私钥对
KeyPair keyPair= keyPairGen.generateKeyPair();
RSAPrivateKey privateKey= (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey= (RSAPublicKey) keyPair.getPublic();
===============================
java生成的公钥一般是162个字节,去掉前面固定头信息{48, -127, -97, 48, 13, 6, 9, 42, -122, 72, -122, -9, 13, 1, 1, 1, 5, 0, 3, -127, -115, 0}
剩下的140字节就是证书中存放的公钥字节
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/134758.html