【发布时间】:2015-06-16 20:13:30
【问题描述】:
我知道有关此问题的其他线程 (AES decryption error " The input data is not a complete block." Error vb.net),但我要么没有正确实施那里提供的解决方案,要么这些解决方案未涵盖有关我此问题的特定变体的某些内容。无论如何,我从以下代码中得到了不完整的块错误
Private GD As System.Security.Cryptography.Aes = System.Security.Cryptography.Aes.Create
Private PDB As New System.Security.Cryptography.Rfc2898DeriveBytes(EK, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, &H65, &H64, &H76, &H65, &H64, &H65, &H76})
Public Function Decrypt(ByVal val As String) As String
Dim ret As String = Nothing
Dim TTB As New System.Text.UTF8Encoding
Try
Dim input() As Byte = TTB.GetBytes(val)
Using ms As New System.IO.MemoryStream(input)
Using cs As New System.Security.Cryptography.CryptoStream(ms, GD.CreateDecryptor(PDB.GetBytes(32), PDB.GetBytes(16)), Security.Cryptography.CryptoStreamMode.Read)
Using sr As New System.IO.StreamReader(cs)
ret = sr.ReadToEnd()
End Using
End Using
End Using
input = nothing
Catch ex As Exception
EL.AddErr("Encountered an error while decrypting the provided text for " & FName & ". Error Details: " & ex.Message, path)
End Try
Return ret
End Function
EK 是我的密钥,我不会包括在内。不过它只是一个字符串,没什么特别的。
根据 MSDN 站点、DreamInCode 等上的指导,我尝试了其他几种解密方法。没有一个有效,但它们都有不同的问题(通常返回一个空白字符串)。鉴于此版本的代码与我的加密代码非常相似,我想坚持使用它(或者至少在仍然具有功能代码的情况下尽可能接近)。
【问题讨论】:
-
如果您的
val包含十六进制编码的加密结果,那么我将首先将TTB.GetBytes(val)替换为适当的StringToByteArray()函数(例如,查看this answer)。如果仅此一项没有帮助,请将您的 crypticGD或PDB更改为一些更详细的标识符,因为阅读您的代码并因此很难诊断它。 -
val 是要加密的原始字符串。 GD 和 PDB 的定义包含在函数本身之前。如果有帮助,我可以将它们在线移动,但不会有新信息。
-
你的意思是“被解密”?无论如何,我不明白:
val和ret都是文本字符串,但您将它们视为原始字节 - 您首先采用val的 UTF-8 表示,最后推送 CryptoStream 的输出(纯二进制)到 StreamReader,然后到ret。这没有任何意义。特别是,您的 CryptoStream 期望它的输入被正确填充(默认为 PKCS7),input可能不满足。 -
'val' 被视为字符串,因此通过
TTB.GetBytes(val)转换为其字节(相信来自CodeProject)。如果StringToByteArray()是更好的选择,我会切换。ret也应该像字符串一样对待。如果ret = sr.ReadToEnd()使用ret作为 byte(),那不是本意(来自 MSDN msdn.microsoft.com/en-us/library/…)。该功能的整个架构是该文章的抄本。在这一点上,您能否提供一个很好的例子让我开始,因为我没有好的参考资料? -
问题是很难理解你到底想完成什么:
Encrypt()函数的输入是什么(在你的例子中省略了),它的输出是什么;Decrypt()函数的输入是什么(应该与 Encrypt 的输出相同,但谁知道呢?)以及它预期返回的内容是什么?我的意思是你应该提供你测试的确切数据,即。 e.val的值和您期望的值ret应该在末尾。
标签: vb.net encryption cryptography aes