Hier ist mal meine Klasse womit ihr das Diffie Hellman Verfahren durchführen könnt. Ein Kleines Beispiel:
'Alice und Bob wollen jetzt Kommunizieren, dafür müssen sie gegenseitig ihren PublicKey austauschen
Dim alice As New Diffie_Hellman_Encryption
Dim bob As New Diffie_Hellman_Encryption
Dim MITM As New Diffie_Hellman_Encryption
'Alice hat den PublicKey von Bob erhalten, nun erstellt sie heraus einen AES Key.
Dim PublicKey_von_Bob As Byte() = bob.PublicKey
Dim Key_von_Bob As Byte() = alice.CreateKey(PublicKey_von_Bob, ECDiffieHellmanKeyDerivationFunction.Hmac)
'--------------------------------------------------------------
'Nun verschlüsselt sie eine Nachricht für Bob,
'die Rückgabewerte sind einmal die Verschlüsselten Daten und der IV der aus dem Key von Bob erstellt wird
Dim Encrypted As Byte() = alice.Encrypt.EncryptData(System.Text.UTF8Encoding.UTF8.GetBytes("Hallo Bob"), Key_von_Bob)
Dim IV As Byte() = alice.Encrypt.iv
'Jetzt schickt Alice die verschlüsselt Nachricht an Bob.
'--------------------------------------------------------------
'Bob Hat die Nachricht enthalten und muss diese mit dem PublicKey von Alice entschlüsseln, zuvor hatte Bob schon den PublicKey von Alice
'Erst einmal muss ein Key von dem PublicKey von Alice erstellt werden
Dim PublicKey_von_Alice As Byte() = alice.PublicKey
Dim Key_von_Alice As Byte() = bob.CreateKey(PublicKey_von_Alice, ECDiffieHellmanKeyDerivationFunction.Hmac)
'Jetzt wird entschlüsselt
Dim Decrypt As Byte() = bob.Decrypt.DecryptData(Encrypted, Key_von_Alice, IV)
'Nun Schauen wir was Alice Geschrieben hat
MsgBox(System.Text.UTF8Encoding.UTF8.GetChars(Decrypt))
Imports System.Security.Cryptography
Imports System.IO
Imports System.Text
Public Class Diffie_Hellman_Encryption
Private CreateCng As New ECDiffieHellmanCng(CngKey.Create(CngAlgorithm.ECDiffieHellmanP521, Nothing, New CngKeyCreationParameters() With {.ExportPolicy = CngExportPolicies.AllowPlaintextExport}))
Friend PrivateKey As Byte() = CreateCng.Key.Export(CngKeyBlobFormat.EccPrivateBlob)
Friend PublicKey As Byte() = CreateCng.PublicKey.ToByteArray
Friend Function LoadPrivateKey(ByVal PrivateKey As Byte())
CngKey.Import(PrivateKey, CngKeyBlobFormat.EccPrivateBlob)
End Function
''' <summary>
''' Erstellt einen Key von dem PublicKey des Partners
''' </summary>
''' <param name="PublicKey">Der PublicKey des Partners</param>
''' <returns></returns>
''' <remarks></remarks>
Friend Function CreateKey(ByVal PublicKey As Byte(), Optional ByVal KeyDerivationFunction As ECDiffieHellmanKeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash) As Byte()
CreateCng.KeyDerivationFunction = KeyDerivationFunction
CreateCng.HashAlgorithm = CngAlgorithm.Sha256
Return CreateCng.DeriveKeyMaterial(CngKey.Import(PublicKey, CngKeyBlobFormat.EccPublicBlob))
End Function
Public Class Encrypt
Friend Shared iv As Byte() = Nothing
''' <summary>
''' Verschlüsselt Daten in AES, hierzu wird der Key von dem PublicKey des Partners benötigt.
''' </summary>
''' <param name="Data">Die Daten die verschlüsselt werden sollen</param>
''' <param name="Key">Der Key von dem PublicKey des Partners</param>
''' <returns>Die Rückgabe ist Verschlüsselt aus den Daten</returns>
''' <remarks></remarks>
Friend Shared Function EncryptData(ByVal Data As Byte(), ByVal Key As Byte()) As Byte()
Using aes As New AesCryptoServiceProvider()
aes.Key = Key
iv = aes.IV
Using ciphertext As New MemoryStream()
Using cs As New CryptoStream(ciphertext, aes.CreateEncryptor(), CryptoStreamMode.Write)
cs.Write(Data, 0, Data.Length)
cs.Close()
Return ciphertext.ToArray()
End Using
End Using
End Using
End Function
End Class
Public Class Decrypt
''' <summary>
''' Die Verschlüsselten Daten werden entschlüsselt.
''' </summary>
''' <param name="Data">Hier kommen die Verschlüsselten Daten hin</param>
''' <param name="Key">Hier kommt der Key vom PublicKey des Partners hin</param>
''' <param name="IV">Hier kommt der IV von den Verschlüsselten Daten hin. Der IV hat der Nutzer der die Daten verschlüsselt hat.</param>
''' <returns></returns>
''' <remarks></remarks>
Friend Shared Function DecryptData(ByVal Data As Byte(), ByVal Key As Byte(), ByVal IV As Byte()) As Byte()
Using aes As New AesCryptoServiceProvider()
aes.Key = Key
aes.IV = IV
Using plaintext As New MemoryStream()
Using cs As New CryptoStream(plaintext, aes.CreateDecryptor(), CryptoStreamMode.Write)
cs.Write(Data, 0, Data.Length)
cs.Close()
Return plaintext.ToArray()
End Using
End Using
End Using
End Function
End Class
End Class
Kommentare zum Snippet