首页 > 解决方案 > 三重 DES C# 错误:指定的初始化向量 (IV) 与此算法的块大小不匹配

问题描述

I am running the following code in C# to decrypt a ciphertext (A19E14B80C19B70925A93DBC9250EB2EC1B6365DCDE42B9F1E44CD4D9AA246BA) that was generated with a Triple-DES-CBC with PKCS5Padding under IV (D160A98F71D5251A) with a given Triple DES key (43451943D61940EE3DF251C34B649EAB602DF3BAE61). 所有这些都是十六进制格式。但是,当我运行代码时,我不断收到错误消息:指定的初始化向量(IV)与此算法的块大小不匹配。谁能帮我弄清楚为什么我的代码不起作用?

using System;
using System.Security.Cryptography;
using System.Text;

public class MyClass
{
    public static void RunDecrypt()
    {
        string result = TripleDesDecrypt("A19E14B80C19B70925A93DBC9250EB2EC1B6365DCDE42B9F1E44CD4D9AA246BA");
        WL(result);

        // PAUSE
        RL();
    }

    static string TripleDesDecrypt(string Data)
    {
        byte[] key = Encoding.UTF8.GetBytes("43451943D61940EE3DF251C34B649EAB602DF3BAE61");
        byte[] iv = Encoding.UTF8.GetBytes("D160A98F71D5251A");
        byte[] data = StringToByteArray(Data);
        byte[] enc = new byte[0];
        TripleDES tdes = TripleDES.Create();
        tdes.IV = iv;
        tdes.Key = key;
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.Zeros;
        ICryptoTransform ict = tdes.CreateDecryptor();
        enc = ict.TransformFinalBlock(data, 0, data.Length);
        return Encoding.UTF8.GetString(enc);
    }

    public static byte[] StringToByteArray(String hex)
    {
        int NumberChars = hex.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }

    #region Helper methods

    public static void Main()
    {
        try
        {
            RunDecrypt();
        }
        catch (Exception e)
        {
            string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString());
            Console.WriteLine(error);
        }
        finally
        {
            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }
    }

    private static void WL(object text, params object[] args)
    {
        Console.WriteLine(text.ToString(), args);
    }

    private static void RL()
    {
        Console.ReadLine();
    }

    private static void Break()
    {
        System.Diagnostics.Debugger.Break();
    }

    #endregion
}

标签: c#encryptiontripledes

解决方案


推荐阅读