Imports System
Imports System.Drawing ' Verweis einbinden!
Imports System.IO
Namespace VernamVerschlüsselung
Public Class Program
Public Shared Sub Main()
' Bild von Datei einlesen:
Dim originalImage As Image = Image.FromFile("TestBild.jpg")
' Bild verschlüsseln:
EncryptImage(originalImage, "TestBild_verschlüsselt.jpg", "Schlüssel.dat")
' Bild entschlüsseln:
Dim newImage As Image = DecryptImage("TestBild_verschlüsselt.jpg", "Schlüssel.dat")
' Bild in Datei speichern:
newImage.Save("TestBild_entschlüsselt.jpg")
End Sub
'---------------------------------------------------------------------
''' <summary>
''' Verschlüsselt ein Bild nach Vernam
''' </summary>
''' <param name="img">
''' zu verschlüsselndes Bild
''' </param>
''' <param name="encryptedFile">
''' Dateiname in dem das verschlüsselte Bild geschrieben wird
''' </param>
''' <param name="keyFile">
''' Dateiname in dem der Schlüssel geschrieben wird
''' </param>
Private Shared Sub EncryptImage(ByVal img As Image, ByVal encryptedFile As String, ByVal keyFile As String)
' Byte-Array aus dem Bild erstellen (könnte auch über
' ImageConverter geschehen - bekomme ich aber in VB.net nicht hin)
Dim originalBytes As Byte()
Using ms As New MemoryStream()
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
originalBytes = ms.ToArray()
End Using
' Schlüssel erzeugen. Hier wird ein Zufallsschlüssel verwendet:
Dim keyBytes As Byte() = New Byte(originalBytes.Length - 1) {}
Dim rnd As New Random()
rnd.NextBytes(keyBytes)
' Schlüssel speichern:
Using fs As New FileStream(keyFile, FileMode.Create)
fs.Write(keyBytes, 0, keyBytes.Length)
End Using
' Bild mit Vernam-Algorithmus verschlüsseln (XOR).
' Die Schlüssellänge entspricht der Originallänge da der
' Schlüssel so erzeug worden ist.
Dim encryptedBytes As Byte() = New Byte(originalBytes.Length - 1) {}
Vernam(originalBytes, keyBytes, encryptedBytes)
' Speichern des verschlüsselten Bildes. Da die Information
' im byte-Array kein gültiges Image darstellt kann es nicht
' als Image behandelt werden.
Using fs As New FileStream("TestBild_verschlüsselt.jpg", FileMode.Create)
fs.Write(encryptedBytes, 0, encryptedBytes.Length)
End Using
End Sub
'---------------------------------------------------------------------
''' <summary>
''' Entschlüsselt ein Bild nach Vernam
''' </summary>
''' <param name="encryptedFile">
''' Dateiname der verschlüsselten Datei
''' </param>
''' <param name="keyFile">
''' Dateiname der Schlüsseldatei (muss den gleichen Inhalt haben wie
''' die Datei die beim Verschlüsseln erstellt wurde)
''' </param>
''' <returns>
''' entschlüsseltes Bild
''' </returns>
Private Shared Function DecryptImage(ByVal encryptedFile As String, ByVal keyFile As String) As Image
' Einlesen der verschlüsselten Bytes:
Dim encryptedBytes As Byte()
Using fs As New FileStream(encryptedFile, FileMode.Open)
encryptedBytes = New Byte(fs.Length - 1) {}
fs.Read(encryptedBytes, 0, CInt(fs.Length))
End Using
' Einlesen des Schlüssels:
Dim keyBytes As Byte()
Using fs As New FileStream(keyFile, FileMode.Open)
keyBytes = New Byte(fs.Length - 1) {}
fs.Read(keyBytes, 0, CInt(fs.Length))
End Using
' Entschlüsseln:
Dim originalBytes As Byte() = New Byte(encryptedBytes.Length - 1) {}
Vernam(encryptedBytes, keyBytes, originalBytes)
' Image aus dem Byte-Array erzeugen:
Dim ic As New ImageConverter()
Return TryCast(ic.ConvertFrom(originalBytes), Image)
End Function
'---------------------------------------------------------------------
''' <summary>
''' Führt die Vernam-Verschlüsselung durch
''' </summary>
''' <param name="inBytes"></param>
''' <param name="keyBytes"></param>
''' <param name="outBytes"></param>
Private Shared Sub Vernam(ByVal inBytes As Byte(), ByVal keyBytes As Byte(), ByRef outBytes As Byte())
' Prüfen der Argumente:
If (inBytes.Length <> keyBytes.Length) OrElse (keyBytes.Length <> outBytes.Length) Then
Throw New ArgumentException("Ungleiche Länge")
End If
For i As Integer = 0 To inBytes.Length - 1
' XOR:
outBytes(i) = CByte((inBytes(i) Xor keyBytes(i)))
Next
End Sub
End Class
End Namespace