我正在尝试进行有关加密和解密的练习。我已经有了以下加密工作代码(我知道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))
但它不起作用,因为我收到错误“要解密的数据长度无效”。我已经尝试过很多关于堆栈溢出的解决方案,但是没有人工作。有人可以帮我解决这个问题吗?提前谢谢!
答案 0 :(得分:0)
您尝试解密的内容与实际加密的内容并不完全相同:
在加密中,使用Convert.ToBase64String
您需要将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))