VB, DES и MD5 - PullRequest
       42

VB, DES и MD5

0 голосов
/ 07 октября 2010

Привет, ребята. Я пытаюсь перенести код Java на VB, теперь мне нужно продублировать шифрование DES, но у меня возникли проблемы с этой частью.

Признаюсь, я не шифровал со времен колледжа.

Это зашифровывает ключ с использованием MD5 и отправляет его в функцию для шифрования DES. Кажется, я получил подсказку об ошибке, ключ должен быть 8-значным, а я отправляю ключ длиной 16 *. 1005 *

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

Ответы [ 2 ]

1 голос
/ 08 октября 2010

Я бы проверил использование вами UTF8Encoding.UTF8.GetBytes (llave). Вероятно, преобразование входящего 16-байтового ключа в формат createencryptor не ожидается.

createencryptor ожидает увидеть ключ такого же размеракак BLOCKSIZE, который, согласно документам, составляет 64 БИТА или 8 байт.

Вы передаете ключ длиной 16 байт, потому что этот цикл для каждого b В dataHash sb.Append (b.ToString ("x2"). ToLower ()) Далее

Также обратите внимание, что функция computehash возвращает массив из 16 байтов, а не 8 байтов "Методы ComputeHash класса MD5 возвращают хеш в виде массива16 байт. Обратите внимание, что некоторые реализации MD5 создают 32-символьный хеш в шестнадцатеричном формате. Чтобы взаимодействовать с такими реализациями, отформатируйте возвращаемое значение методов ComputeHash как шестнадцатеричное значение. "

Похоже, вылибо нужно использовать другой хеш, либо использовать только часть 16-байтового хеша.

0 голосов
/ 08 октября 2010

Решение было простым: сначала нам нужно обрезать строку до 8 позиций (8 байтов, которые она может получить), и, наконец, чтобы сделать ее совместимой, добавьте шифродремонт Вот код

   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
...