C# 尝试加密密钥时,输入数据不是完整的块
我正在尝试加密一些密钥及其密码C# 尝试加密密钥时,输入数据不是完整的块,c#,.net,encryption,.net-core,asp.net-core-webapi,C#,.net,Encryption,.net Core,Asp.net Core Webapi,我正在尝试加密一些密钥及其密码 输入数据不是完整的块。我在stackoverflow上尝试了一些答案,但似乎都不起作用 代码如下: public static string Encrypt(string value) { string EncryptionKey = "THISISSOMEENCRYPTIONKEY"; byte[] clearBytes = Encoding.UTF8.GetBytes(value);
输入数据不是完整的块
。我在stackoverflow上尝试了一些答案,但似乎都不起作用
代码如下:
public static string Encrypt(string value)
{
string EncryptionKey = "THISISSOMEENCRYPTIONKEY";
byte[] clearBytes = Encoding.UTF8.GetBytes(value);
using (Aes encryptor = Aes.Create())
{
encryptor.BlockSize = 128;
encryptor.Mode = CipherMode.ECB;
encryptor.Padding = PaddingMode.None;
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close(); //the input data is not a complete block
}
value = Convert.ToBase64String(ms.ToArray());
}
}
return value;
}
p、 我在ASP.NET Core 1.0 MVC上的一些旧项目上有相同的代码,并且它工作正常,而这一个是.NET Core 2.2(库)API,它向我抛出了那个错误 看看下面几行
Aes encryptor = Aes.Create()
encryptor.BlockSize = 128;
encryptor.Mode = CipherMode.ECB;
encryptor.Padding = PaddingMode.None;
AES密码是一种对称分组密码,要求输入与块大小完全匹配。如果输入长度与块大小不匹配,则使用(对于对称密码,通常为PKCS#7)将输入扩展到所需长度
在代码填充模式下。未指定任何内容,因此输入长度必须与块大小匹配
要加密较长的输入(块大小的乘数),请使用不同的加密方法。对于您选择的参数,输入长度需要是块大小的倍数(16字节)
请注意,某些模式可以有效地创建流密码,并且不需要填充(CFB、OFB、CTR)
让我们试试:
encryptor.Mode = CipherMode.CBC;
encryptor.Padding = PaddingMode.PKCS7
我在ASP.NET Core 1.0 MVC上的一些旧项目上有相同的代码,并且它工作正常
那么,我们只能假设输入长度是块大小的倍数
其他安全注意事项:
- 尽可能避免ECB(操作模式见链接)
- 其他模式需要唯一IV(CBC模式需要不可预测/随机IV)。为多个输入导出(相同)键和IV确实不安全
哪一行抛出错误?