2

我正在尝试使用 Windows RT 加密字符串。之前可以ProtectDatasystem.security命名空间中使用,但在 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);
}

编辑:例外是

提供的句柄无效。(来自 HRESULT 的异常:0x80090026)

加解密时出现在第3行

4

2 回答 2

3

根据文档,您使用的构造函数只能用于解密,不能用于加密:

用于解密操作的构造函数。在调用UnprotectAsyncorUnprotectStreamAsync方法之前使用此构造函数。

对于加密,您必须使用另一个构造函数,它指定是否应为本地机器、当前用户、特定用户等加密数据。

我不知道为什么在您的情况下它不适用于解密,但是如果加密不起作用,我不确定您要解密什么...

于 2014-06-16T09:48:16.147 回答
1

尝试执行以下操作:

public static async Task<string> EncryptSting(string data)
{
    DataProtectionProvider provider = new DataProtectionProvider("LOCAL=user");
    ...
    ...
}

干杯!

于 2016-04-11T14:50:17.003 回答