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.
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!