第一种:直接从证书中获取公钥,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 pub活动:慈云数据爆款香港服务器,CTG+CN2高速带宽、快速稳定、平均延迟10+ms 速度快,免备案,每月仅需19元!! 点击查看licKey= (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字节就是证书中存放的公钥字节50711078
《获取密钥的几种方式是什么,获取密钥的几种方式有哪些》来自互联网同行内容,若有侵权,请联系我们删除!
还没有评论,来说两句吧...