我试图用Windows rt加密字符串。之前可以在system.security
命名空间中使用ProtectData
,但在WinRT中不存在。我尝试使用下面的代码,但它不工作。
public static async Task<string> EncryptSting(string data)
{
DataProtectionProvider provider = new DataProtectionProvider();
IBuffer unprotectedData = CryptographicBuffer.ConvertStringToBinary(data, BinaryStringEncoding.Utf8);
//crashes here
IBuffer protectedData = await provider.ProtectAsync(unprotectedData);
return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, protectedData);
}
public static async Task<string> DecryptString(string data)
{
DataProtectionProvider provider = new DataProtectionProvider();
IBuffer inputData = CryptographicBuffer.ConvertStringToBinary(data, BinaryStringEncoding.Utf8);
//crashes here
IBuffer unprotectedData = await provider.UnprotectAsync(inputData);
return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, unprotectedData);
}
编辑:异常是
提供的句柄无效。(Exception from HRESULT: 0x80090026)
在加密和解密
根据文档,您使用的构造函数只能用于解密,不能用于加密:
用于解密操作的构造函数。在调用
UnprotectAsync
或UnprotectStreamAsync
方法之前使用此构造函数。
对于加密,必须使用另一个构造函数,该构造函数指定是否应该为本地机器、当前用户、特定用户等加密数据。
我不知道为什么它不能在你的情况下解密,但如果加密不起作用,我不确定你在试图解密什么…
尝试以下操作:
public static async Task<string> EncryptSting(string data)
{
DataProtectionProvider provider = new DataProtectionProvider("LOCAL=user");
...
...
}
干杯!