AES加密错误:输入数据不是完整的块?

Con*_*cer 7 c# encryption

这是加密方法:

public static byte[] Encrypt(byte[] plaintext, byte[] key)
{
    using (var aes = Aes.Create())
    {
        aes.BlockSize = 128;
        aes.Mode = CipherMode.ECB;
        aes.Padding = PaddingMode.None;

        var iv = new byte[16];
        for (int i = 0; i < iv.Length; i++)
            iv[i] = 0;
        aes.IV = iv;

        var encryptor = aes.CreateEncryptor(key, aes.IV);
        using(var target = new MemoryStream())
        using (var cs = new CryptoStream(target, encryptor, CryptoStreamMode.Write))
        {
            using (var source = new StreamWriter(cs))
                source.Write(plaintext);
            return target.ToArray();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我是怎么称呼的:

var key = new byte[16] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
var plaintext = new byte[16] { 128, 0, 112, 0, 96, 0, 80, 0, 64, 0, 48, 0, 32, 0, 16, 0 };
Run Code Online (Sandbox Code Playgroud)

但它一直在source.Write(明文)上抛出异常,说它不是一个完整的块?我正在使用一个16字节/ 128位阵列,块大小设置为128.我不明白什么是错的?

另外,只是为了阻止任何有关ECB不好的建议,这不是为了生产,我只是在玩耍.

SLa*_*aks 7

StreamWriter将UTF8文本字符写入流.
你正在写plaintext.ToString()为密文的文本.

返回"System.Byte[]",不会转换为16字节的UTF8.

  • @Justin984 他是说如果你已经有了一个字节数组,你就不需要使用 `StreamWriter`,因为那是为了将字符串转换为具有特定编码(默认为 UTF-8)的字节数组。只需使用 [`Stream.Write()`](http://msdn.microsoft.com/en-us/library/system.io.memorystream.write(v=vs.110) 直接将您的字节写入流。 aspx)。 (3认同)

Zag*_*Nut 5

我相信问题在于填充模式。除非确定要加密的文本可以被BlockSize(以位为单位,或者BlockSize / 8以字节为单位)可以整除,否则应指定除None以外的PaddingMode。

请参阅此处的示例代码