java读取openssl生成的private key文件生成密钥的问题

2 篇文章 0 订阅

 

转自:http://shuany.iteye.com/blog/730910

由 openssl生成的private key文件如下:
-----BEGIN RSA PRIVATE KEY-----
MIICXwIBAAKBgQDzxjNvQ4oUrDtPaPAnWiiixsiZSuNXIFhSwbKoaRWYLQSSCJPI
NuwCi2uRfQemOWp9EWUwxeQOwWxD3XUqZksCj7L7AUd8RXsIlB+Nejbw4KmSxbYn
39eGrf/ipWD4lrsUJMuuNi/QcIG3EsBjs63wxKzpA1+0diOAfHzXSJewTQIDAQAB
AoGBAND6GmHJrnemZnne5fF2UtuoOZNgJaAtNEpNjtDctQxtmzttavL6UjykNKTW
YFZZZjatUOgM3ULhAeTz1ltwsd9lzw+pF9CsyAOwyQNhjdO3VV+hmAinBm/32yPp
xkuqThS40pX5SRV5HZlLLm4dj90UA1bxrgr5LUQePPI9jzBBAkEA/7Q/9DDVKjie
f8Eeuh/ZElAjVve+DgmQJYkM2QOAHkCx2Zmw5hOq1TROVJUiJsSegSWWvMDnVA/w
bPboSFKOeQJBAPQOar6bj7EdSO5atrJg3jSA+SW/j30ljhERDOk3eI8bfgMYL7EG
QOG01VwoR3uyVEKY3n8i2WKGLuNwBe/Qa3UCQQCVODYeJaUwB2yPdz6cNVuy8Ss+
ZEL35CLHlMv3lLBedziSmLr/+Tg3RVf0yjbs0s8A5NOrgRM+HjMbE5eIJQ1ZAkEA
oWsPqvYUud5WqF+TSrPLBArxvsfOTcWTCzKtyWqI8I4McFuE3571NtN18rgpX2T5
Wfrl3kzcXs/FH2SuaIj/KQJBANFxrPGmyZNcGf0uiwm241+j3Pmy90+XUrmL1VYL
z1uGk3VsnRPo1SnO+f70zS3gfqodFk5Y9S0ZAj/p6uyeL2E=
-----END RSA PRIVATE KEY-----

用java代码要从这个文件中得到想要的priavtekey 可以先用命令
openssl pkcs8 -topk8 -inform PEM -outform DER -in rsa_pem.key -out pkcs8_der.key -nocrypt


对*.key文件进行转换,然后再读转换后的文件
File file = new File(keyfile);     //keyfile key文件的地址
FileInputStream in = new FileInputStream(file);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] tmpbuf = new byte[1024];
int count = 0;
while ((count = in.read(tmpbuf)) != -1) {
bout.write(tmpbuf, 0, count);
tmpbuf = new byte[1024];
}
in.close();
把读的输入流转变成自己想要的privatekey
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(bout.toByteArray());
RSAPrivateKey privateKey = (RSAPrivateKey)keyFactory.generatePrivate(privateKeySpec);
这样就可以使用privatekey对自己的文件进行加密了
//进行加密
Signature dsa = Signature.getInstance("SHA1withRSA");      //采用SHA1withRSA加密
dsa.initSign(privateKey);
dsa.update(voucher.getBytes());    //voucher需要加密的String必须变成byte类型的
byte[] sig = dsa.sign();    
byRSA=toHexString(sig);   //加密后的byte类型变成十六进制的String

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以以下代码来读取 OpenSSL 生成的 AES 256 密钥: ```java import java.io.BufferedReader; import java.io.FileReader; import java.security.Key; import java.security.KeyFactory; import java.security.spec.PKCS8EncodedKeySpec; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class ReadOpenSSLPrivateKey { public static void main(String[] args) throws Exception { // 读取私钥文件 BufferedReader br = new BufferedReader(new FileReader("private_key.pem")); String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { if (line.startsWith("-----BEGIN ") || line.startsWith("-----END ")) { continue; } sb.append(line); } br.close(); // 解码 Base64 格式的密钥 byte[] keyBytes = Base64.getDecoder().decode(sb.toString()); // 获取密码 String password = "your_password"; // 生成 AES 密钥 byte[] ivBytes = new byte[16]; byte[] saltBytes = Arrays.copyOfRange(keyBytes, 8, 16); byte[] keyBytesWithoutSalt = Arrays.copyOfRange(keyBytes, 16, keyBytes.length); IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); SecretKeySpec keySpec = new SecretKeySpec(getAESKey(password, saltBytes), "AES"); // 解密私钥 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); byte[] decryptedBytes = cipher.doFinal(keyBytesWithoutSalt); // 换成 Key 对象 PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decryptedBytes); KeyFactory kf = KeyFactory.getInstance("RSA"); Key privateKey = kf.generatePrivate(spec); System.out.println(privateKey); } public static byte[] getAESKey(String password, byte[] saltBytes) throws Exception { SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); KeySpec spec = new PBEKeySpec(password.toCharArray(), saltBytes, 65536, 256); SecretKey tmp = factory.generateSecret(spec); return tmp.getEncoded(); } } ``` 其中 `private_key.pem` 是 OpenSSL 生成密钥文件,`your_password` 是生成密钥时设置的密码。这段代码会读取密钥文件,解码 Base64 格式的密钥生成 AES 密钥,解密私钥,并将其换成 Java 的 `Key` 对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值