首页 > 解决方案 > 使用随机 IV 在 C# 中加密/解密字符串时遇到问题

问题描述

我正在重写一些代码以在我的加密字符串前面添加一个随机 IV。我认为加密是正确的(无法解密,所以我不是 100% 确定),但问题是当我运行解密功能时,出现异常

System.Security.Cryptography.CryptographicException: 'The input data is not a complete block.'

下面是源代码。有谁知道我要去哪里错了?我认为错误出在 binaryWritr.Write 调用中,但经过几次迭代,我没有取得进展。任何帮助将不胜感激!

public static string EncryptString(string inputText)
    {
        using(var aes = new AesCryptoServiceProvider() {
            Mode = CipherMode.CBC,
            Padding = PaddingMode.PKCS7
        }) {
            var input = Encoding.UTF8.GetBytes(inputText);
            aes.GenerateIV();
            var iv = aes.IV;
            using(var encrypter = aes.CreateEncryptor(aes.Key, iv))
            using(var cipherStream = new MemoryStream()) {
                using(var tCryptoStream = new CryptoStream(cipherStream, encrypter, CryptoStreamMode.Write))
                using(var tBinaryWriter = new BinaryWriter(tCryptoStream)) {
                    //Prepend IV to data
                    cipherStream.Write(iv, 0, iv.Length);
                    tBinaryWriter.Write(input);
                    tCryptoStream.FlushFinalBlock();
                }

                return Convert.ToBase64String(cipherStream.ToArray());
            }
        }
    }

    public static string DecryptString(string inputText)
    {
        var aes = new AesCryptoServiceProvider() {
            Mode = CipherMode.CBC,
            Padding = PaddingMode.PKCS7
        };

        //get first 16 bytes of IV and use it to decrypt
        var iv = new byte[16];
        Array.Copy(Encoding.ASCII.GetBytes(inputText), 0, iv, 0, iv.Length);

        using(var ms = new MemoryStream()) {
            using(var cs = new CryptoStream(ms, aes.CreateDecryptor(aes.Key, iv), CryptoStreamMode.Write))
            using(var binaryWriter = new BinaryWriter(cs)) {
                //Decrypt Cipher Text from Message
                binaryWriter.Write(
                    Encoding.ASCII.GetBytes(inputText),
                    iv.Length,
                    inputText.Length - iv.Length
                );
            }

            return Encoding.Default.GetString(ms.ToArray());
        }
    }

标签: c#.netencryption

解决方案


推荐阅读