0

こんにちは、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 に解析しようとしたときに発生します。

4

2 に答える 2

1

UTF8Encoding.UTF8.GetBytes(llave) の使用を確認します。受信した 16 バイト キーを createencryptor が想定していない形式に変換している可能性があります。

createencryptor は、ドキュメントによると、BLOCKSIZE と同じサイズのキーが 64 BITS または 8 バイトであることを期待しています。

このループ For Each b In dataHash sb.Append(b.ToString("x2").ToLower()) Next のため、16 バイトのキーを渡しています。

また、computehash 関数は 8 バイトではなく 16 バイトの配列を返すことに注意してください "MD5 クラスの ComputeHash メソッドは、16 バイトの配列としてハッシュを返します。一部の MD5 実装では、32 文字の 16 進形式のハッシュが生成されることに注意してください。このような実装と相互運用するには、ComputeHash メソッドの戻り値を 16 進数値としてフォーマットします。」

別のハッシュを使用するか、16 バイトのハッシュの一部のみを使用する必要があるようです。

于 2010-10-07T21:12:51.207 に答える
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
于 2010-10-08T17:52:06.473 に答える