CryptographicException - 无法更新密码

时间:2013-11-25 06:49:34

标签: c# dpapi

我有一些我希望保护的数据,因此我使用ProtectedData将其加密到文件中。 当我试图读取和解密数据时,我得到了最奇怪的例外:

CryptographicException - 无法更新密码。为新密码提供的值不符合域的长度,复杂性或历史记录要求。

这是抛出它的地方:

byte[] decryptedData = ProtectedData.Unprotect(Encoding.UTF8.GetBytes(fileContent),
 Encoding.UTF8.GetBytes(entropy),
 DataProtectionScope.LocalMachine);

使用DataProtectionScope.CurrentUser时也会发生这种情况。

我没有在网上找到任何有关此例外的信息,所以我几乎一无所知。

1 个答案:

答案 0 :(得分:0)

某些通用错误不会生成异常,并且会抛出最后一个错误。

来自System.Security.Cryptography.ProtectedDate.Unprotect:

throw new CryptographicException(Marshal.GetLastWin32Error());

更具体地说,它最像是失败,因为使用System.Security.Cryptography实现crypt32.dll的默认标志:CryptUnprotectData - CRYPTPROTECT_UI_FORBIDDEN - “此标志用于呈现用户界面(UI)的远程情况设置此标志并为保护或取消保护指定UI时,调用失败,GetLastError()返回ERROR_PASSWORD_RESTRICTION状态代码。“ Windows Data Protection

我发现一个对我有用的解决方法是不使用Base64转换器,我使用的是PowerShell使用的相同脚本:

static byte[] ByteArrayFromString(string s)
    {
        int length = s.Length / 2;
        byte[] numArray = new byte[length];
        if (s.Length > 0)
        {
            for (int i = 0; i < length; i++)
            {
                numArray[i] = byte.Parse(s.Substring(2 * i, 2), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture);
            }
        }
        return numArray;
    }