Hej alle.
Mein Freund und ich versuche zwei Verschlüsselungen auf einander abzustimmen. Einmal in VB, einmal in JavaScript. Leider erhalten wir aber nicht die gleiche Ausgabe.
Das ganze basiert auf folgendem System:
Die verwendete Eingabe ist beispielsweise "demo".
Diese wird mit MD5 gehasht, und die ersten 16 Zeichen davon ergeben den IV einer AES-Verschlüsselung.
Bei unserer Fehlersuche haben wir alle Werte überprüft angefangen halt mit dem Hash.
Sein Hash (JS) sieht folgendermaßen aus
Zum Umwandeln in Hex verwende ich dem Fall folgende Funktion:
Aufgerufen mit
Selbes Problem auch mit dem Salt (Jeweils mit SHA256 gehasht):
JS:
VB.NET:
Allerdings fehlen dieses mal nur 0en und alle Buchstaben sind groß.
Interessant ist auch dass sein PBKDF2-Key (bzw Rfc2898) bei einer Size von 32 128 Zeichen lang ist, meiner aber nur 64.
Wie können wir beide Ergebnisse gleich bekommen? Hier nochmal beide Source Codes:
VB.NET
JS
Ich weiß natürlich, dass das schon eine ziemlich spezielle Frage ist, freue mich aber dennoch über jede Antwort.
Danke im Voraus und Grüße
Fabian
Mein Freund und ich versuche zwei Verschlüsselungen auf einander abzustimmen. Einmal in VB, einmal in JavaScript. Leider erhalten wir aber nicht die gleiche Ausgabe.
Das ganze basiert auf folgendem System:
Die verwendete Eingabe ist beispielsweise "demo".
Diese wird mit MD5 gehasht, und die ersten 16 Zeichen davon ergeben den IV einer AES-Verschlüsselung.
VB.NET-Quellcode
- Imports System.Security.Cryptography
- Sub Foo()
- Dim AESProvider As New AesCryptoServiceProvider()
- Dim MD5Provider As New MD5CryptoServiceProvider()
- Dim toCrypt As String = Console.ReadLine()
- Dim toCryptBytes As Byte() = Encoding.Default.GetBytes(toCrypt)
- Dim MD5Hash As Byte() = MD5Provider.ComputeHash(toCryptBytes)
- ReDim Preserve MD5Hash(15)
- AESProvider.IV = MD5Hash
- End Sub
Bei unserer Fehlersuche haben wir alle Werte überprüft angefangen halt mit dem Hash.
Sein Hash (JS) sieht folgendermaßen aus
fe01ce2a7fbac8f
meiner hingegen so FE1CE2A7FBAC8FAFAED7C982A4E229
. Woher dieser Unterschied? Bei meinem fehlt die 0 am Anfang, es sind alles Großbuchstaben und er ist länger. Dabei wird das Array doch gekürzt ReDim Preserve MD5Hash(15)
?Zum Umwandeln in Hex verwende ich dem Fall folgende Funktion:
VB.NET-Quellcode
Aufgerufen mit
Console.WriteLine(StrToHex(Encoding.Default.GetString(MD5Hash)))
.Selbes Problem auch mit dem Salt (Jeweils mit SHA256 gehasht):
JS:
2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea
VB.NET:
2A97516C354B68848CDBD8F54A226AA55B21ED138E27AD6C5CBB9C0AA5AEA
Allerdings fehlen dieses mal nur 0en und alle Buchstaben sind groß.
Interessant ist auch dass sein PBKDF2-Key (bzw Rfc2898) bei einer Size von 32 128 Zeichen lang ist, meiner aber nur 64.
Wie können wir beide Ergebnisse gleich bekommen? Hier nochmal beide Source Codes:
VB.NET-Quellcode
- Imports System.IO
- Imports System.Security.Cryptography
- Imports System.Text
- Sub Main()
- Dim AESProvider As New AesCryptoServiceProvider()
- Dim SHA256Provider As New SHA256CryptoServiceProvider()
- Dim MD5Provider As New MD5CryptoServiceProvider()
- Dim toCrypt As String = Console.ReadLine()
- Dim toCryptBytes As Byte() = Encoding.Default.GetBytes(toCrypt)
- Dim MD5Hash As Byte() = MD5Provider.ComputeHash(toCryptBytes)
- ReDim Preserve MD5Hash(15)
- Dim RfcProvider As New Rfc2898DeriveBytes(toCryptBytes, SHA256Provider.ComputeHash(toCryptBytes), 2)
- AESProvider.IV = MD5Hash
- AESProvider.Key = RfcProvider.GetBytes(32)
- Dim cryptoTransform As ICryptoTransform = AESProvider.CreateEncryptor
- Dim MS As New MemoryStream()
- Dim cryptoStream As New CryptoStream(MS, cryptoTransform, CryptoStreamMode.Write)
- cryptoStream.Write(toCryptBytes, 0, toCryptBytes.Length)
- cryptoStream.FlushFinalBlock()
- Dim toOutputBytes As Byte() = MS.ToArray()
- Dim toOutput As String = Convert.ToBase64String(toOutputBytes)
- Console.WriteLine("> " & toOutput)
- Console.ReadLine()
- End Sub
- Public Function StrToHex(ByRef Data As String) As String
- Dim sVal As String
- Dim sHex As String = ""
- While Data.Length > 0
- sVal = Conversion.Hex(Strings.Asc(Data.Substring(0, 1).ToString()))
- Data = Data.Substring(1, Data.Length - 1)
- sHex = sHex & sVal
- End While
- Return sHex
- End Function
Quellcode
- var salt = CryptoJS.SHA256(input).toString(), iv = CryptoJS.MD5(input).toString().substring(0, 16);
- var key = CryptoJS.PBKDF2(input, CryptoJS.enc.Hex.parse(salt), {keySize: 32, iterations: 2});
- return CryptoJS.AES.encrypt(input, key, {iv: CryptoJS.enc.Hex.parse(iv)}).ciphertext.toString(CryptoJS.enc.Base64);
Ich weiß natürlich, dass das schon eine ziemlich spezielle Frage ist, freue mich aber dennoch über jede Antwort.
Danke im Voraus und Grüße
Fabian