AesCryptoServiceProvider.TransformFinalBlock错误:输入数据不是完整的块

本文关键字:数据 TransformFinalBlock 错误 输入 AesCryptoServiceProvider | 更新日期: 2023-09-27 17:58:24

我编写了一个本应是简单的加密/解密应用程序来熟悉AesCryptoServiceProvider,但我收到了一个错误。错误是"输入数据不是一个完整的块。"这是代码:

    static void Main(string[] args)
    {
        Console.WriteLine("Enter string to encrypt:");
        string userText = Console.ReadLine();
        byte[] key;
        byte[] IV;
        using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
        {
            key = aes.Key;
            IV = aes.IV;
        }
        byte[] encryptedText = EncryptString(userText, key, IV);
        Console.WriteLine(Convert.ToBase64String(encryptedText));
        string decryptedText = DecryptString(encryptedText, key, IV);
        Console.WriteLine(decryptedText);
        Console.ReadLine();
    }
    private static byte[] EncryptString(string encryptText, byte[] key, byte[] IV)
    {
        using (AesCryptoServiceProvider symAlg = new AesCryptoServiceProvider())
        {
            symAlg.Key = key;
            symAlg.IV = IV;
            ICryptoTransform ct = symAlg.CreateEncryptor(symAlg.Key, symAlg.IV);
            byte[] encryptTextBytes = UnicodeEncoding.ASCII.GetBytes(encryptText);
            byte[] encryptedText = ct.TransformFinalBlock(encryptTextBytes, 0, encryptTextBytes.Length);
            return encryptTextBytes;
        }
    }
    private static string DecryptString(byte[] decryptText, byte[] key, byte[] IV)
    {
        using (AesCryptoServiceProvider symAlg = new AesCryptoServiceProvider())
        {
            symAlg.Key = key;
            symAlg.IV = IV;
            ICryptoTransform ct = symAlg.CreateDecryptor(symAlg.Key, symAlg.IV);
            byte[] decryptedUserText = ct.TransformFinalBlock(decryptText, 0, decryptText.Length);
            return Convert.ToBase64String(decryptedUserText);
        }
    }

我可以在网上找到这个错误的结果,但它们都与写入内存流进行加密有关,这并不是我真正要做的。有人能帮我指出我在这里做错了什么吗?

AesCryptoServiceProvider.TransformFinalBlock错误:输入数据不是完整的块

哈,找到了
看看你在加密函数中返回的内容:

        byte[] encryptTextBytes = UnicodeEncoding.ASCII.GetBytes(encryptText);
        byte[] encryptedText = ct.TransformFinalBlock(encryptTextBytes, 0, encryptTextBytes.Length);
        return encryptTextBytes;

提示:这不是加密的东西。