2025年获取密钥的几种方式

获取密钥的几种方式第一种 直接从证书中获取公钥 x509 格式的证书存有公钥不存在私钥 读取证书获取流 FileInputStr inStream new FileInputStr E certjni 1 cer 用证书工厂来创建证书 java security cert

大家好,我是讯享网,很高兴认识大家。 第一种:直接从证书中获取公钥,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字节就是证书中存放的公钥字节
小讯
上一篇 2025-02-27 22:48
下一篇 2025-03-28 14:04

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/31210.html