Feedback

VB - Verschlüsslung von Dateien mit Vernam

Veröffentlicht von am 27.09.2008
(2 Bewertungen)
In diesem Beispiel zeige ich wie Dateien (im Beispiel eine Bilddatei) mit dem Vernam-Algorithmus verschlüsselt werden können.

Dieses Verfahren ist sehr effizient und sehr sicher (solange der Schlüssel geheim bleibt).

Die Verschlüsselung bei Vernam ist eine einfache XOR-Verschlüsselung.
GFU-Schulungen  [Anzeige]

VB.NET 2017/2015/2013 Einführung

Das Seminar befähigt Sie zur eigenständigen Entwicklung von anwenderorientierten Programmen in VB.NET, worin auch der Einsatz von Datenbanken enthalten ist.

C# 2017/2015/2013 Grundlagen

Nach Abschluss des Kurses sind Ihnen die Datentypen und Klassenbibliotheken von C# bekannt. Außerdem sind Sie in der Lage, mit Variablen umzugehen und deren Typen zu konvertieren. Sie definieren Namespaces und setzen diese ein, Sie erstellen eigene Klassen  und bauen Trouble Shooting ein.

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

Abgelegt unter Bild, Verschlüsselung, Sicherheit, Vernam, XOR.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!