2014-04-07 35 views
2

加密私鑰我有密碼保護的,加密的RSA私鑰,這與PyCrypto(2.6.1)創建,並已根據自己的文檔格式如下:PrivateKeyInfo, PKCS#8 (DER SEQUENCE), PEM (RFC1423),看 [https://www.dlitz.net/software/pycrypto/api/current/Crypto.PublicKey.RSA._RSAobj-class.html#exportKey]閱讀與BouncyCastle的/ spongycastle

如何使用Bouncycastle/Spongycastle解密此RSA密鑰?

我在Google上搜索了很長時間,結果只有1.50版本(因爲PEMReader已被棄用並被刪除)或PEMParser似乎無法閱讀的例子這種格式。順便說一句:有沒有關於我錯過了Bouncycastle的文檔?

這是我的加密私鑰的標題:

-----BEGIN PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,68949227DD8A502D 
xyz... 

,我真的很感激,如果有人可以幫助我!

+0

這是加密密鑰(與CBC模式和輸入矢量68949227DD8A502D TripleDes的)。因此,在PEMReader可以讀取它之前,它必須先解密。 – divanov

+0

請注意,密鑰是用舊的(並且不安全的)算法加密的。目前的做法是使用PKCS#8來保護私鑰。 Bouncy Castle支持JceOpenSSLPKCS8DecryptorProviderBuilder類中的PKCS#8解密。 –

回答

2

使用答案this question你應該做到以下幾點

File privateKeyFile = new File(privateKeyFileName); // private key file in PEM format 
PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile)); 
Object object = pemParser.readObject(); 
PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password.toCharArray()); 
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); 
KeyPair kp; 
if (object instanceof PEMEncryptedKeyPair) { 
    kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv)); 
} 

那麼你可以說

PrivateKey key = kp.getPrivateKey(); 
7

要總結一下我對這個話題herethere發現:

這裏是最終的代碼,如果你想獲得模數,例如:

// For JcaPEMKeyConverter().setProvider("BC") 
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

// Using bcpkix-jdk14-1.48 
PEMParser pemParser = new PEMParser(new FileReader(file)); 
Object object = pemParser.readObject(); 
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); 
KeyPair kp; 
if (object instanceof PEMEncryptedKeyPair) 
{ 
    // Encrypted key - we will use provided password 
    PEMEncryptedKeyPair ckp = (PEMEncryptedKeyPair) object; 
    PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password.toCharArray()); 
    kp = converter.getKeyPair(ckp.decryptKeyPair(decProv)); 
} 
else 
{ 
    // Unencrypted key - no password needed 
    PEMKeyPair ukp = (PEMKeyPair) object; 
    kp = converter.getKeyPair(ukp); 
} 

// RSA 
KeyFactory keyFac = KeyFactory.getInstance("RSA"); 
RSAPrivateCrtKeySpec privateKey = keyFac.getKeySpec(kp.getPrivate(), RSAPrivateCrtKeySpec.class); 

return privateKey; 

然後可以調用例如:

privateKey.getModulus(); 
+0

解析後的PEM對象也可以是一個PrivateKeyInfo,私鑰用'converter.getPrivateKey((PrivateKeyInfo)對象)檢索;'' –