2010-10-07 86 views
0

大家好我正在尝试将Java代码迁移到VB,现在我需要复制DES加密,但我在这部分中遇到了问题。VB,DES和MD5

我承认我从大学以来就没有加密过。

这使用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

回答

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字节散列的一部分。

+0

虽然我与你的主张一致,Java方法返回一个十六进制哈希 昏暗md5Key的String = digestUtils.md5Hex(挑战+密码) 这就是为什么我不能使用其他哈希方法,但感谢您的重播。 – Enrique 2010-10-07 21:33:44

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