Re: Text verschlüsseln
- From: "Peter Götz" <gssg_nospam@xxxxxxxxxxx>
- Date: Wed, 8 Oct 2008 17:34:47 +0200
Hallo Andi,
wenn ich eine Funktion habe, welche mir einen
Text verschlüsselt und eine Funktion welche mir
diesen wieder entschlüsselt, wo bringe ich diese
Funktion am besten unter?
Eine Funktion zum Ver- und Entschlüsseln wird man
normalerweise so gestalten, dass ihr neben den
zu ver- oder entschlüsselnden Daten auch ein Schlüssel
(Key) übergeben wird, mit dem die Funktion dann erst
in die Lage versetzt wird, richtig zu ver- und entschlüsseln.
So gesehen ist es also erst weniger bedeutend wo
diese Funktion untergebracht ist, sondern mehr, wo
der Schlüssel untergebracht und wie/wo er übergeben
wird.
Wenn diese Funktion in einer Dll ist, kann sich jeder
die DLL in ein Projekt einbinden und z.B. auf die
Funktion zum entschlüsseln zugreifen.
Ohne den passenden Schlüssel (Key) hätte das erst
mal wenig Sinn.
Was ist, wenn diese Funktion in dem Exe sich befindet?
Dann kann sie auch nur richtige Ergebnisse liefern,
wenn ihr der passende Schlüssel übergeben wird.
Ich meine es ist mir klar das alles gehackt werden
kann. Es sollte aber nicht allzu einfach gehen.
Wie einfach oder weniger einfach es geht, hängt
dabei in erster Linie davon ab, wie der Schlüssel
übergeben wird und wo er herkommt.
Ist diese Funktion im Exe "relativ" sicher?
Die Funktion ist so sicher oder unsicher wie der
gesamte übrige Code. Aber hier geht es ja mehr
um die Sicherheit des Schlüssels.
Oder gibts da mit vernünftigen Aufwand andere
Lösungsansätze? Wie realisiert ihr sowas?
Hier mal ein Beispiel für ein Klassenmodul zum
Ver- und Entschlüsseln mit einem frei wählbaren Key.
' /// Code in einem Klassenmodul "clsCrypt.vb"
Imports System.Text.Encoding
Imports System.Security.Cryptography
Imports System.IO
Public NotInheritable Class clsCrypt
Private TripleDes As New TripleDESCryptoServiceProvider
''' <summary>
''' Erstellt eine neue Instanz der Klasse clsCrypt
''' mit dem in "key" übergebenen Schlüssel.
''' </summary>
''' <param name="key"></param>
''' <remarks></remarks>
Public Sub New(ByVal key As String)
TripleDes.Key = _
TruncateHash(key, TripleDes.KeySize \ 8)
TripleDes.IV = _
TruncateHash("", TripleDes.BlockSize \ 8)
End Sub
Private Function TruncateHash _
(ByVal Key As String, _
ByVal Length As Integer _
) As Byte()
Dim SHA1 As New SHA1CryptoServiceProvider
Dim Hash() As Byte
Dim KeyBytes() As Byte
KeyBytes = Unicode.GetBytes(Key)
Hash = SHA1.ComputeHash(KeyBytes)
ReDim Preserve Hash(Length - 1)
Return Hash
End Function
''' <summary>
''' Verschlüsselt die in PlainText enthaltenen Daten.
''' </summary>
''' <param name="PlainText"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function EncryptData _
(ByVal PlainText As String) As String
Dim PlaintextBytes() As Byte
Dim MemStream As New MemoryStream
Dim EncStream As CryptoStream
PlaintextBytes = Unicode.GetBytes(PlainText)
EncStream = New CryptoStream _
(MemStream, _
TripleDes.CreateEncryptor(),
_
CryptoStreamMode.Write)
With EncStream
.Write(PlaintextBytes, 0, PlaintextBytes.Length)
.FlushFinalBlock()
End With
Return _
System.Convert.ToBase64String _
(MemStream.ToArray)
End Function
''' <summary>
''' Entschlüsselt die in EncryptedText enthaltenen Daten
''' </summary>
''' <param name="EncryptedText"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function DecryptData _
(ByVal EncryptedText As String) As String
Dim EncBytes() As Byte
Dim MemStream As MemoryStream
Dim DecStream As CryptoStream
Try
EncBytes = _
System.Convert.FromBase64String _
(EncryptedText)
MemStream = New System.IO.MemoryStream
DecStream = _
New CryptoStream _
(MemStream, _
TripleDes.CreateDecryptor(), _
CryptoStreamMode.Write)
With DecStream
.Write(EncBytes, 0, EncBytes.Length)
.FlushFinalBlock()
End With
Return _
System.Text.Encoding.Unicode.GetString _
(MemStream.ToArray)
Catch ex As Exception
' im Fehlerfall (z.B encryptedText = "" oder
' falsche Länge) einen Leerstring ("") zurückgeben.
Return ""
End Try
End Function
End Class
' \\\
Und so wendest Du die Klasse an:
' /// Code in einem Form-Modul
Private Sub Form1_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.Click
Dim strPlain As String = "Mäuseklavier"
Dim strEnCrypt As String
Dim strDeCrypt As String
Dim Key As String = "wzrlbrmpf4711tk"
MsgBox("Klartext: " & strPlain, vbInformation)
Dim CC As New clsCrypt(Key)
strEnCrypt = CC.EncryptData(strPlain)
MsgBox("Verschlüsselt: " & strEnCrypt, _
MsgBoxStyle.Information)
strDeCrypt = CC.DecryptData(strEnCrypt)
MsgBox("Enschlüsselt: " & strDeCrypt, _
MsgBoxStyle.Information)
End Sub
Der Key sollte natürlich nicht wie hier so offen
in Deinem Code herumliegen.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
.
- References:
- Text verschlüsseln
- From: andi rickenbach
- Text verschlüsseln
- Prev by Date: Frage zu Controls
- Next by Date: Re: GPS Daten (Longitude / Langitude)
- Previous by thread: Re: Text verschlüsseln
- Next by thread: Geschwindigkeit VB6 <--> VB.NET
- Index(es):
Relevant Pages
|