2013-07-05 34 views
4

我有下面的代碼被亂扔的5%的時間一個CryptographicException,我想不通爲什麼),它不會一直失敗和b)爲什麼它的失敗可言:爲什麼只有5%的時間才能得到錯誤的數據異常?

// Initialize the new secure keys 
var keyGenerator = KeyGenerator.Create(); 
var keyPair = keyGenerator.GenerateKeyPair(); 
this._privateKey = keyPair.ToEncryptedPrivateKeyString(privateKeySecret); 
this._publicKey = keyPair.ToPublicKeyString(); 

// Initialize the certificate generation 
var certificateGenerator = new X509V3CertificateGenerator(); 
var serialNo = BigInteger.ProbablePrime(128, new Random()); 
certificateGenerator.SetSerialNumber(serialNo); 
certificateGenerator.SetSubjectDN(GetLicenseeDN()); 
certificateGenerator.SetIssuerDN(GetLicencerDN()); 
certificateGenerator.SetNotAfter(DateTime.Now.AddYears(100)); 
certificateGenerator.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0))); 
certificateGenerator.SetSignatureAlgorithm("SHA512withRSA"); 
certificateGenerator.SetPublicKey(keyPair.PublicKey); 
var result = certificateGenerator.Generate(keyPair.PrivateKey); 
this._clientCertificate = new X509Certificate2(DotNetUtilities.ToX509Certificate(result)); 
this._clientCertificate.PrivateKey = DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters)keyPair.PrivateKey); 

堆棧的樣子:

System.Security.Cryptography.CryptographicException: Bad Data. 
Result StackTrace: 
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 
    at System.Security.Cryptography.Utils._ImportKey(SafeProvHandle hCSP, Int32 keyNumber, CspProviderFlags flags, Object cspObject, SafeKeyHandle& hKey) 
    at System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters(RSAParameters parameters) 
    at Org.BouncyCastle.Security.DotNetUtilities.ToRSA(RsaPrivateCrtKeyParameters privKey) in C:\BouncyCastle\crypto\src\security\DotNetUtilities.cs:line 173 
    at EBSConnect.EBSClientBase.InitializeSecurity(String privateKeySecret) in c:\Projects\EBSConnect\Source\EBSConnect\EBSClientBase.cs:line 78 

的時間(95%),該代碼按預期工作,我能夠使用這種動態生成的證書聯合服務通信的休息。有任何想法嗎?

+0

請指出您使用的代碼和庫。當我尋找'ToEncryptedPrivateKeyString'(僅舉一例)時,我得到零點擊。 –

+0

對不起@owlstead,我不認爲這很重要。我試圖指出的問題是使用DotNetUtilities.ToRSA,它拋出了異常。 – djbyter

+0

不,我想我忽略了那裏的BouncyCastle標籤:( –

回答

5

假設您使用BouncyCastle C#1.7,從BigInteger轉換爲byte [](與前導零相關)有一些問題。這些已在源代碼中修復,但尚未發佈。我建議製作最新的DotNetUtilities類的本地副本,並在您的項目中使用它,直到有新版本發佈。

+0

感謝Peter,這看起來更好。它看起來像你將存儲庫移動到github? – djbyter

+0

我們已經將源代碼移動到內部git存儲庫,該鏡像是鏡像的在github上CVS存儲庫不會被更新,但它仍然會在那裏很長一段時間 –

+0

@PeterDettman這個已經發布了嗎? – zaitsman

相關問題