【问题标题】:C# .NET Cryptography don't decrypt properlyC# .NET Cryptography 无法正确解密
【发布时间】:2015-04-09 22:18:55
【问题描述】:

我正在尝试加密和解密 C# (.NET 3.5) 中的文本,发现这个简单的代码不起作用:

    private const string KEY = "Chiave";

    static void Main(string[] args)
    {

        string plainText = "Data to be encrypted";

        byte[] keyArray;
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(KEY));

        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(plainText);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateEncryptor();
        byte[] encArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.PKCS7;

        cTransform = tdes.CreateDecryptor();
        byte[] decArray = cTransform.TransformFinalBlock(encArray, 0, encArray.Length);

        if (encArray.Length == decArray.Length)
        {
            for (int i = 0; i < encArray.Length; ++i)
                Console.Out.Write("{0,3}|{1,3}", encArray[i], decArray[i]);
        } else
            Console.Out.Write("Length error!");

        Console.In.Read();
    }

似乎加密或解密阶段会弄乱文本开头的一些字节(在我运行程序时以不同的方式)有时甚至会改变字节数组的长度。 我能够使用 ECB 密码使其工作,但我的数据有一些静态块,随时都会导致相同的结果。

来自https://msdn.microsoft.com/it-it/library/system.security.cryptography.ciphermode(v=vs.110).aspx关于欧洲央行:

重要提示:不推荐使用此模式,因为它可以打开门 多个安全漏洞。如果要加密的明文包含 大量重复,密文是可行的 一次打破一个街区。也可以使用块分析 来确定加密密钥。此外,活跃的对手可以 在不检测的情况下替换和交换单个块,这 允许将块保存并插入到流中的其他点 不被发现。

这些是 enc 之后的一些结果。和十二月:

��u��T�be encrypted
U����ŋbe encrypted
5�AL\"0be encrypted

等等,谢谢你的建议。

【问题讨论】:

  • 那是因为 IV。抱歉,该睡觉了,现在你会找到示例,知道要查找什么了。

标签: c# .net encryption cryptography tripledes


【解决方案1】:

您已经创建了TripleDESCryptoServiceProvider 的新实例,但这个新实例的 IV 值与第一个不同

此外,将加密数组的长度与解密数组的长度进行比较是不正确的。您应该尝试取回原始字符串并检查两者是否相等

private const string KEY = "Chiave";
static void Main(string[] args)
{
    string plainText = "Data to be encrypted";

    byte[] keyArray;
    MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
    keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(KEY));

    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(plainText);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.CBC;
    tdes.Padding = PaddingMode.PKCS7;

    ICryptoTransform cTransform = tdes.CreateEncryptor();
    byte[] encArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

    // REMOVE THESE LINES 
    // tdes = new TripleDESCryptoServiceProvider();
    // tdes.Key = keyArray;
    // tdes.Mode = CipherMode.CBC;
    // tdes.Padding = PaddingMode.PKCS7;

    cTransform = tdes.CreateDecryptor();
    byte[] decArray = cTransform.TransformFinalBlock(encArray, 0, encArray.Length);

    // if (encArray.Length == decArray.Length)
    // {
    //    for (int i = 0; i < encArray.Length; ++i)
    //        Console.Out.Write("{0,3}|{1,3}", encArray[i], decArray[i]);
    //} else
    //    Console.Out.Write("Length error!");

    string result = UTF8Encoding.UTF8.GetString(decArray);
    Console.WriteLine(result);

    Console.In.Read();
}

【讨论】:

  • 感谢 IV(我省略了将结果字符串计算为加密文本的 base64 编码以确保它不是编码问题)
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 2022-12-11
  • 2019-04-07
  • 2022-08-14
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多