Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试加密密钥时,输入数据不是完整的块_C#_.net_Encryption_.net Core_Asp.net Core Webapi - Fatal编程技术网

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确实不安全

哪一行抛出错误?