Feedback

VB - Diffie Hellman Verschlüsselung

Veröffentlicht von am 4/10/2016
(1 Bewertungen)
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

 

Logge dich ein, um hier zu kommentieren!