2017-09-07 68 views
0

我使用輸入到我的C#類中的私鑰密碼解密私鑰時出錯。我推測問題是因爲關鍵是:C#Bouncy Castle解碼私鑰

  1. 從具有換行符的文本文件讀取數據。
  2. 私鑰不是使用這個庫創建的,所以也許我沒有正確解碼它。
  3. 我不知道填充生成此密鑰的系統(具體來說,它是從Ruby Security lib生成的)。

被拋出的異常是

Org.BouncyCastle.Crypto.InvalidCipherTextException

與消息

墊塊損壞

在線object privateKeyObject = pemReader.ReadObject();

這裏發生的事情是提供給我一個樣品私鑰:

-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,C7E12029C6ED8D89 

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 
-----END RSA PRIVATE KEY----- 

這裏是私鑰密碼:

SPH?!(C7ryh~juR> 

這裏是代碼:

private readonly string _pubKey; 
private readonly string _privateKey; 
private readonly string _privateKeyPass; 

public RSAKeyEncryption(string pubKey, string privateKey, string privateKeyPass) 
{ 
    _pubKey = pubKey; 
    _privateKey = privateKey; 
    _privateKeyPass = privateKeyPass; 
} 

private AsymmetricCipherKeyPair DecodePrivateKey() 
{ 
    TextReader textReader = new StringReader(_privateKey); 
    PemReader pemReader = new PemReader(textReader, new PasswordFinder(_privateKeyPass)); 
    object privateKeyObject = pemReader.ReadObject(); 
    AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)privateKeyObject; 
    return keyPair; 
} 
+0

我試圖用'openssl pkey -in key.pem'查看你的密鑰,並且'無法加載密鑰'。我懷疑你的密碼中有一個Unicode字符。如果可能的話,你可能想嘗試一個純ASCII碼的密碼,其中所有字符的代碼都在0x20和0x7E之間。 –

+0

@AxelKemper對不起,關鍵是SPH?!(C7ryh〜juR> – blgrnboy

+0

使用鍵'SPH?!(C7ryh〜juR)',openssl可以加載你的密鑰而不會出現錯誤信息。 –

回答

1

以下代碼適用於我:

// https://stackoverflow.com/a/6038944/1911064 
StreamReader sr = new StreamReader(@"E:\AK\temp\key.pem"); 
string privateKeyPass = "SPH?!(C7ryh~juR>"; 
var pf = new PasswordFinder(privateKeyPass); 
PemReader pr = new PemReader(sr, pf); 
AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject(); 
RSAParameters rsa = 
     DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)KeyPair.Private); 
+0

謝謝。我的問題有兩點:首先,我有unicode的'\ uxxx'字符,這是錯誤地提供給我的密碼,而不是'>',還有,因爲密碼是從一個文本文件中讀取的,所以在它的最後有一個'\ n'換行符,如果它存在,我必須確保刪除它。 – blgrnboy

相關問題