2017-08-12 825 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格式化的密鑰正確地解碼了您的業務。