AES 加密错误:输入数据不是完整的块
本文关键字:数据 加密 错误 输入 AES | 更新日期: 2023-09-27 18:36:57
这是加密方法:
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();
}
}
}
以及我如何称呼它:
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 };
但它一直在源头抛出异常。写(明文)说它不是一个完整的块?我使用的是块大小设置为 16 字节/128 位的数组。我不明白怎么了?
另外,只是为了阻止任何关于欧洲央行不好等的建议,这不是为了生产,我只是在玩。
StreamWriter
将UTF8 文本字符写入流。
您正在将plaintext.ToString()
作为密文的文本写入。
这将返回 "System.Byte[]"
,它不会转换为 16 字节的 UTF8。
我认为问题是填充模式。 除非要加密的文本确定可被 BlockSize 整除(以位为单位,或 BlockSize/8 以字节为单位),否则您应该指定 PaddingMode 而不是 None。
有关示例代码,请参阅此处的帖子
我将函数更改为:
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 encryptor = aes.CreateEncryptor(key, new byte[16]);
using(var target = new MemoryStream())
using (var cs = new CryptoStream(target, encryptor, CryptoStreamMode.Write))
{
cs.Write(plaintext, 0, plaintext.Length);
return target.ToArray();
}
}
}
从我所经历并解决此问题的情况来看,我错过了加密它所抱怨的字段,我只是在解密它。它正在保存一个纯明文并试图解密它。因此,只需确保首先加密抱怨的字段即可。谢谢
这对PowerShell有效:如果您在不使用 -key 选项的情况下加密密码,则可能会发生这种情况。要修复它,请使用 -key 选项对其进行加密:
ConvertFrom-SecureString -key $key