2010-10-07 73 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