VB, DES и MD5

Привет, ребята, я пытаюсь перенести код 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.


person Enrique    schedule 07.10.2010    source источник


Ответы (2)


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

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

Вы передаете ключ из 16 байтов из-за этого цикла For Each b In dataHash sb.Append(b.ToString("x2").ToLower()) Next

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

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

person DarinH    schedule 07.10.2010
comment
Хотя я согласен с вашим предложением, метод java возвращает шестнадцатеричный хэш Dim md5Key As String =digestUtils.md5Hex(challenge + password) Вот почему я не могу использовать другой метод хеширования, но спасибо за ваш повтор. - person Enrique; 08.10.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
person Enrique    schedule 08.10.2010