2017-05-27 42 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文档中提到这一点。我不知道它会抛出一个无效的演员例外。谢谢! –

相关问题