2017-05-27 84 views
1

我正在嘗試我的手在UWP平臺上的加密和解密,並試圖找出這個問題。所以首先,我加密我的字符串「示例語句」。使用以下:CryptographicEngine.DecryptAsync引發「System.InvalidCastException:'指定的轉換無效。' 「而CryptographicEngine.Decrypt不

IBuffer bufEncrypted = CryptographicEngine.Encrypt(key, CryptographicBuffer.ConvertStringToBinary(strToEncrypt, BinaryStringEncoding.Utf8), null); 
string strEncrypted = CryptographicBuffer.EncodeToBase64String(bufEncryptedStr); 

然後,當我嘗試解密 「strEncrypted」 使用:

IBuffer bufToDecrypt = CryptographicBuffer.DecodeFromBase64String(strEncrypted); 
IBuffer bufEncryptedStr = await CryptographicEngine.DecryptAsync(key, bufToDecrypt, null); 

我得到的錯誤是 「System.InvalidCastException: '指定的轉換是無效的。'」。

然而,當我嘗試同樣的解密使用:

​​

我沒有得到任何錯誤,並且可以使用得到解密的字符串:

CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, bufEncryptedSt1r); 

任何想法我可能會丟失?

相關信息:

IBuffer bufKeyMaterial = CryptographicBuffer.GenerateRandom(256); 
SymmetricKeyAlgorithmProvider provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcbPkcs7); 
CryptographicKey key = provider.CreateSymmetricKey(bufKeyMaterial); 

回答

1

首先,我測試了您的代碼段與Cryptographic​Engine類的Decrypt方法,它可以很好地工作,並有正確的結果。這樣你就可以使用Decrypt方法。

IBuffer bufEncryptedStr = CryptographicEngine.Decrypt(key, bufToDecrypt, null); 
String strDecrypted = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, bufEncryptedStr); 

爲什麼DecryptAsync方法會拋出異常,這是期望的行爲。根據DecryptAsync的說法,您只需(可以)在持久密鑰上調用DecryptAsync

如果關鍵是持久密鑰和解密操作需要用戶界面或需要很長的時間,使用DecryptAsync方法,而不是解密方法的

更多細節請參考this similar thread

+0

我不明白爲什麼沒有在Microsoft文檔中提到這一點。我不知道它會拋出一個無效的演員例外。謝謝! –

相關問題