Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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
Vb.net 解密AES时出错。输入数据不是一个完整的块。运动模拟_Vb.net_Aes - Fatal编程技术网

Vb.net 解密AES时出错。输入数据不是一个完整的块。运动模拟

Vb.net 解密AES时出错。输入数据不是一个完整的块。运动模拟,vb.net,aes,Vb.net,Aes,你好。 我使用AES加密文本,然后将加密的字节保存到txt文件中 - 格式1.frm中的btnencrypt代码 - 表单2.frm中的btnDecrypt代码 - 如果单击“解密”按钮,我会收到一条错误消息,说明输入数据不是完整的块 我好像做错了什么?我想你忘了给swEncrypt.FlushFinalBlock打电话了。我没有太多的VB经验,但这个错误意味着加密数据没有填充到完整的块大小。我的C代码看起来和你的类似,只是我在写字节,然后调用FlushFinalBlock 请参见C中的示例:

你好。 我使用AES加密文本,然后将加密的字节保存到txt文件中

-

格式1.frm中的btnencrypt代码 -

表单2.frm中的btnDecrypt代码 - 如果单击“解密”按钮,我会收到一条错误消息,说明输入数据不是完整的块
我好像做错了什么?

我想你忘了给swEncrypt.FlushFinalBlock打电话了。我没有太多的VB经验,但这个错误意味着加密数据没有填充到完整的块大小。我的C代码看起来和你的类似,只是我在写字节,然后调用FlushFinalBlock

请参见C中的示例:

private IEncryptionResponse Encrypt(byte[] data, IKey key)
{
    try
    { 
        using (var symmetricAlgorithm = new AesCryptoServiceProvider())
        {
            symmetricAlgorithm.GenerateIV();
            byte[] iv = symmetricAlgorithm.IV;

            using (var msEncrypt = new MemoryStream())
            {
                using (var encryptor = symmetricAlgorithm.CreateEncryptor(key.RawKey, iv))
                {
                    using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        try
                        {
                            csEncrypt.Write(data, 0, data.Length);
                            csEncrypt.FlushFinalBlock();
                            var encryptedBytes = msEncrypt.ToArray();

                            return Convert.ToBase64String(iv.Add(encryptedBytes));
                        }
                        finally
                        {
                           symmetricAlgorithm.Clear();
                        }
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        throw new EncryptionException("Encryption error", e);
    }

}

我认为这里还有其他错误。您应该将msEncrypt作为第一个参数传递给CryptoStream构造函数,因为否则msEncrypt永远不会写入任何内容。我也看不到该文件作为截断文件打开。如果已经存在,数据将被追加到文件末尾。使用file.ReadAllBytes而不是file.WriteAllBytes似乎有点不对称。但是首先要检查的是你认为你写了多少字节,读了多少字节。FWIW,正确答案将是16的倍数。使用时,资源应自动关闭。如果自动关闭,则应自动冲洗。如果它是自动刷新的,我会假设作为结果调用了FlushFinalBlock。问题中使用的StreamReader构造函数会导致在StreamReader被刷新时处理加密流,因此FlushFinalBlock已经被隐式调用。aka@MaartenBodewes是正确的
Dim aes_CryptoTransform As ICryptoTransform = AesCryptoServiceProvider.Create.CreateEncryptor(aesKeySet.Key, aesKeySet.IV)

Dim textBytesToDecrypt() As Byte = File.readAllBytes("C:\encryptText.text")
dim plainText as string = nothing

using msEncrypt As New MemoryStream(textBytesToDecrypt)
     using csEncrypt As New CryptoStream(textBytes, aes_CryptoTransform, CryptoStreamMode.read)
          using textStream as New StreamReader(csEncrypt) 
              plainText = textStream.readToEnd()
          End Using
          csEncrypt.close()
     End Using
End Using
private IEncryptionResponse Encrypt(byte[] data, IKey key)
{
    try
    { 
        using (var symmetricAlgorithm = new AesCryptoServiceProvider())
        {
            symmetricAlgorithm.GenerateIV();
            byte[] iv = symmetricAlgorithm.IV;

            using (var msEncrypt = new MemoryStream())
            {
                using (var encryptor = symmetricAlgorithm.CreateEncryptor(key.RawKey, iv))
                {
                    using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        try
                        {
                            csEncrypt.Write(data, 0, data.Length);
                            csEncrypt.FlushFinalBlock();
                            var encryptedBytes = msEncrypt.ToArray();

                            return Convert.ToBase64String(iv.Add(encryptedBytes));
                        }
                        finally
                        {
                           symmetricAlgorithm.Clear();
                        }
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        throw new EncryptionException("Encryption error", e);
    }