Re: Text verschlüsseln

Tech-Archive recommends: Fix windows errors by optimizing your registry



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)


.



Relevant Pages

  • Probleme mit Key bei Triple DES Crypto
    ... Private key As New TripleDESCryptoServiceProvider() ... Der Einstieg in meine Mini-Demo ist die Funktion "PWDHandlingEncrypt", da wird ein String verschlüsselt und dann gleich wieder entschlüsselt. ... Dim ms As New MemoryStream ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Probleme mit Datum-Format
    ... Dim SQLString As String ... Dim command As New OleDbCommand ... End While ... Wie der Name ja schon sagt, ist Dein SQL-String ein String. ...
    (microsoft.public.de.german.entwickler.dotnet.datenbank)
  • Problem mit Webservice per WDSL/SOAP/Comserver
    ... Dim lcSQL As String ... Dim lcxmlbytesstream As New MemoryStream ... DECLARE INTEGER CRYIni_InitializeEx IN INTEGER Mode, ...
    (microsoft.public.de.german.entwickler.dotnet.asp)
  • Problem mit Webservice per WSDL/SOAP Comserver
    ... Dim lcSQL As String ... Dim lcxmlbytesstream As New MemoryStream ... DECLARE INTEGER CRYIni_InitializeEx IN INTEGER Mode, ...
    (microsoft.public.de.fox)
  • Re: XSLT mit VB.NET?
    ... Function transform(ByVal XML As String, ByVal XSL As String) As String ... Dim XSLT As New XslTransform ...
    (microsoft.public.de.german.entwickler.dotnet.vb)