2017-08-12 141 views
2

我有一个RSA私钥存储为字符串,我需要将其转换为用于API的PrivateKey对象。我可以找到从私钥文件转换为字符串的人的例子,但没有其他方式。将RSA PKCS1私钥字符串转换为Java PrivateKey对象

我设法将其转换为一个专用密钥对象,但它是在PKCS8,当我需要它是PKCS1,我知道Java没有PKCS1EncodedKeySpec

byte[] key64 = Base64.decodeBase64(privateKeyString.getBytes()); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
KeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes); 
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec); 
+0

如果您的意思是_must_接受PKCS1 RSAPrivateKey(又名OpenSSL的'传统'格式)base64(〜PEM或DER),并且无法修复它:如果清除请参阅https://stackoverflow.com/questions/3243018/如何加载rsa私人密钥从文件或我的黑客在https://stackoverflow.com/questions/23709898/java-convert-dkim-private-key-from-rsa-to-der-for -javamail加密PEM(不太可能?)请参阅https://stackoverflow.com/questions/44681737/get-a-privatekey-from-a-rsa-pem-file或https://stackoverflow.com/questions/35276820/decrypting-an-openssl-pem-encoded-rsa-private-key-with java –

+0

你的第二段没有任何意义。 –

回答

1

似乎有一些混乱你的一部分。 PKCS#1和PKCS#8密码标准确实定义了编码格式来表示二进制中的RSA私钥。 PKCS#8专门为此设计;它会在私钥本身之上添加额外的元信息。例如,它添加一个对象标识符来表明这确实是一个RSA私钥。

PKCS#1直接描述了私钥的所有组成部分,如私有指数,模数以及通常还需要执行更高效的基于中国剩余定理(CRT)的操作的公共指数参数。 PKCS#8私钥使用PKCS#1实际存储私钥参数。

现在我不需要解释一些更紧迫的事情了。您需要PKCS#8和PKCS#1来创建私钥的二进制表示。然而,密钥本身 - 当被RSA算法使用时 - 根本不是二进制的。它由大量数字组成(例如,Java中的BigInteger值)。所以说RSA私钥对象需要在PKCS#1中没有任何意义。

因此,简单地说:如果base 64编码的PKCS#8格式化的密钥正确地解码了您的业务。