// 读取证书获取流
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://51itzy.com/kjqy/31210.html