大家好我正在尝试将Java代码迁移到VB,现在我需要复制DES加密,但是我遇到了这部分问题。
我承认自大学以来我没有加密。
这使用MD5加密密钥,并将其发送到DES加密函数,似乎我得到了错误的线索,密钥必须是8位密钥,我发送16长度密钥。
Dim MD5 As New MD5CryptoServiceProvider()
Dim dataHash() As Byte = MD5.ComputeHash(Encoding.UTF8.GetBytes(challenge + password))
Dim sb As New StringBuilder
Dim b As Byte
For Each b In dataHash
sb.Append(b.ToString("x2").ToLower())
Next
Dim md5Key As String = sb.ToString
''Dim md5Key As String = digestUtils.md5Hex(challenge + password)
Dim geoEncrypt As New GeoEncriptamiento
Dim challengeAnswer As String = geoEncrypt.EncryptFile(challenge, md5Key)
这是执行加密的代码
Function EncryptFile(ByVal esquema As String, ByVal llave As String) As String
Dim DES As New DESCryptoServiceProvider()
'Establecer la clave secreta para el algoritmo DES.
'Se necesita una clave de 64 bits y IV para este proveedor
DES.Key = UTF8Encoding.UTF8.GetBytes(llave)
DES.IV = UTF8Encoding.UTF8.GetBytes(llave)
Try
Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(esquema)
Dim ms As New MemoryStream
Dim cs As New CryptoStream(MS, DES.CreateEncryptor(DES.Key, DES.IV), CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Return Convert.ToBase64String(ms.ToArray())
Catch ex As Exception
Return "Error"
End Try
End Function
错误是当我尝试将MD5解析为DES.Key
时答案 0 :(得分:1)
我会检查你对UTF8Encoding.UTF8.GetBytes(llave)的使用 这可能会将传入的16字节密钥转换为createencryptor不期望的格式。
createencryptor希望看到一个与BLOCKSIZE大小相同的密钥,根据文档,它是64位或8字节。
由于此循环,您传入了16个字节的密钥 对于每个b在dataHash中 sb.Append(b.ToString( “X2”)。ToLower将()) 下一步
另请注意,computehash函数返回一个16字节的数组,而不是8字节 “MD5类的ComputeHash方法将哈希返回为16个字节的数组。请注意,某些MD5实现会生成32个字符,十六进制格式的哈希。要与此类实现进行互操作,请将ComputeHash方法的返回值格式化为十六进制值。“
看起来你要么需要使用不同的哈希,要么只使用16字节哈希的一部分。
答案 1 :(得分:0)
解决方案很简单,首先我们需要将字符串剪切到8个位置(它可以获得8个字节),最后使其兼容添加cyphermode。这是代码
Function EncryptFile(ByVal esquema As String, ByVal llave As String) As String
Dim DES As New DESCryptoServiceProvider()
DES.Mode = CipherMode.ECB
Dim md5 As New MD5CryptoServiceProvider()
DES.Key = UTF8Encoding.UTF8.GetBytes(llave.Substring(0, 8))
DES.IV = UTF8Encoding.UTF8.GetBytes(llave.Substring(0, 8))
Try
Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(esquema)
Dim ms As New MemoryStream
Dim cs As New CryptoStream(ms, DES.CreateEncryptor(DES.Key, DES.IV), CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Return Convert.ToBase64String(ms.ToArray())
Catch ex As Exception
Return "Error"
End Try
End Function