VB .NET - 要解密的数据长度无效

时间:2013-12-06 11:01:21

标签: vb.net encryption

我正在尝试进行有关加密和解密的练习。我已经有了以下加密工作代码(我知道ECB很糟糕,我不会在现实生活中使用它,我保证):

Dim hashmd5 As MD5CryptoServiceProvider
Dim des As TripleDESCryptoServiceProvider
Dim keyhash As Byte()
Dim buff As Byte()

Try

   hashmd5 = New MD5CryptoServiceProvider
   keyhash = hashmd5.ComputeHash(ASCIIEncoding.ASCII.GetBytes("exe67rci89"))

   des = New TripleDESCryptoServiceProvider
   des.Mode = CipherMode.ECB
   des.Key = keyhash
   buff = ASCIIEncoding.ASCII.GetBytes(Me.txtPwd.Text)

   Me.txtPwd.Text = Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buff, 0, buff.Length))

Catch ex As System.Exception
   Throw ex
End Try

现在我正在尝试解密此函数的输出。我尝试使用相同的代码,只需用加密代替:

Me.txtPwd.Text = Convert.ToBase64String(des.CreateDecryptor().TransformFinalBlock(buff, 0, buff.Length))

但它不起作用,因为我收到错误“要解密的数据长度无效”。我已经尝试过很多关于堆栈溢出的解决方案,但是没有人工作。有人可以帮我解决这个问题吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

您尝试解密的内容与实际加密的内容并不完全相同:

在加密中,使用Convert.ToBase64String

将加密字节转换为基本64字符串

您需要将txtPwd字段中的字符串转换回原始加密结果的字节数组。请参阅匹配的Convert.FromBase64String方法。

如果您拆分原始加密线,您可以更好地查看我的意思:

dim encBytes = des.CreateEncryptor().TransformFinalBlock(buff, 0, buff.Length)
Me.txtPwd.Text = Convert.ToBase64String(encBytes)

通过这种方式,您可以查看实际的加密结果,并验证传入的内容是否相同。

答案 1 :(得分:0)

你没有足够的逆转。现在txtPwd中的内容是base-64字符串,而不是使用ASCII编码转换的普通字符串。相反,你在解密中生成的是字节,应该被解释为ASCII字符。

所以你想要的是:

buff = Convert.FromBase64String(Me.txtPwd.Text)

Me.txtPwd.Text = ASCIIEncoding.ASCII.GetString(des.CreateDecryptor().TransformFinalBlock(buff, 0, buff.Length))