解密AES时出错.输入数据不是一个完整的块.vb.net



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

--

表1.frm中的btnencrypt代码

Dim aes_CryptoTransform As ICryptoTransform = AesCryptoServiceProvider.Create.CreateEncryptor(aesKeySet.Key, aesKeySet.IV)
Dim textBytes() As Byte = System.Text.Encoding.ASCII.GetBytes(rtb_plaintext.Text)
Dim encrypted() As Byte
using msEncrypt As New MemoryStream()
using csEncrypt As New CryptoStream(textBytes, aes_CryptoTransform, CryptoStreamMode.write)
using textStream as New StreamWriter(csEncrypt) 
swEncrypt.Write(plainText)
End Using
encrypted = msEncrypt.ToArray()
csEncrypt.close()
End Using
End Using
dim textDirectoryPath as String = "C:encryptText.text"
using textFilestream as new Filestream(textDirectoryPath, filemode.create)
textFilestream.write(encrypted, 0, encrypted.length)
textFilestream.close()
end using

--

btnCrypt在form2.frm中的代码

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

--如果我点击解密按钮,我会收到一条错误消息,说"输入数据不是一个完整的块"我好像做错了什么?

我想您忘记调用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);
}

}

相关内容

最新更新