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]

ASP.NET Core - Der Einstieg

In nur 3 Tagen lernen Sie, wie man mit ASP.NET Core und den Technologien MVC, Entity Framework, WebAPI und Razor professionelle Web-Anwendungs-Architekturen aufbaut. Diese Schulung ist der perfekte Einstieg, um datengetriebene und präsentations-orientierte Applikationen auf Basis der ASP.NET Core Plattform zu erstellen.

ASP.NET 2.0 und 3.5

Dieser Kurs vermittelt Ihnen alle Erweiterungen von Microsoft ASP.NET 2.0. Zu diesen zählen u. a. Data Bindung, Master Pages, und Security.

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!