【问题标题】:CryptographicException: Error occurred during a cryptographic operationCryptographicException:加密操作期间发生错误
【发布时间】:2018-06-07 11:49:58
【问题描述】:

我有一个字符串,我想在运行时在我的 C# WPF 应用程序中解密。

我认为我可以使用以下代码:

using System.Text;
using System.Web;
using System.Web.Security;

    [Test]
    public void Encrypt()
    {
        var text = "This is my string";
        var stream = Encoding.UTF8.GetBytes(text);
        var encodedValue = MachineKey.Protect(stream);
        var result = HttpServerUtility.UrlTokenEncode(encodedValue);
    }

    [Test]
    public void Decrypt()
    {
        var text = "ZG1CrjMgyq5O1krnBxoYM5rXH071xVxFnhC3xTTBiJ05Uy4msSe0jonP-ayFuChh_M6EaEhMif_j7i8yUSQ4Pkc63moEbvq34hMZGfYkazo1";
        var stream = HttpServerUtility.UrlTokenDecode(text);
        var decodedValue = MachineKey.Unprotect(stream);
        var result = Encoding.UTF8.GetString(decodedValue);
    }

但是我得到了一个

CryptographicException: 加密操作期间发生错误

在我的 WPF 应用程序中运行 Unprotect 命令时出错。有什么想法吗?

-- 如果上述代码仅适用于 Web 应用程序(即不在 WPF 中),为什么在单元测试中调用时它会起作用?

【问题讨论】:

  • 异常是从哪一行抛出的?
  • kennyzx - 请查看我更新的问题
  • 您确定要解码从 same 机器编码的值吗? 'ZG1CrjMgyq5O1krnBxoYM5rXH071xVxFnhC3xTTBiJ05Uy4msSe0jonP-ayFuChh_M6EaEhMif_j7i8yUSQ4Pkc63moEbvq34hMZGfYkazo1' 值是否可以从不同的机器计算?

标签: c# wpf security


【解决方案1】:

尝试这些解决方案,希望它会起作用:

1.您是否在 web.config 中为加密/解密定义了“machineKey”条目?如果没有,则定义它。

2.清除所有浏览器的cookies和缓存数据。

3.如果您使用的是表单身份验证。您可以在捕获异常时退出并允许您的用户登录并创建一个有效的 cookie(将其添加到您的 global.asax

catch (CryptographicException cex)
{
    FormsAuthentication.SignOut();
}

【讨论】:

  • 这是一个 WPF 应用程序而不是一个 Web 应用程序,所以我没有 machineKey 或 global.asx。我不能在独立客户端应用程序中使用此代码吗?它在单元测试中运行时有效。
【解决方案2】:

我现在明白了,这种模式无论如何都不适合我。 看到我正在使用客户端应用程序,任何人都可以检查我的程序集中的代码并解密字符串。

我将改为执行以下操作:

  • 使用单独的控制台应用程序和私钥来加密我的字符串。
  • 创建一个拥有私钥并可解密字符串的 Azure 函数。
  • 从我的客户端 WPF 应用程序通过 SSL 调用 Azure 函数来解密字符串。

【讨论】:

    猜你喜欢
    • 2019-07-12
    • 2014-04-21
    • 2021-04-25
    • 2016-04-11
    • 1970-01-01
    • 2013-03-28
    • 2016-02-22
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多