Aber zum anderen Thema...dein Problem ist nicht ganz trivial. Wie man Software schützt
ist etwas was nicht mal MS so richtig im Griff hat. Aber immerhin, hier ein einfaches
Beispiel mit PW Hash im Program. Den Hash habe ich als Hex ausgegeben
(GenerateHashButton_Click()) und von Hand dann eingefügt.
Das Programm verschlüsselt eine Datei mit diesem Hash als Schlüssel, beim
Einlesen verlangt es dann das Klartext Passwort und prüft es bevor die Daten
eingelesen und entschlüsselt werden.
Das ist natürlich keine ausreichende Lösung. Man könnte z.B. beim Setup einen
Schlüssel pro Benutzer generieren und. verschlüsselt in der Registry ablegen, und den
eingebauten Hash nur als Masterschlüssel verwenden.
Das Problem, dass jemand dein Programm reverse enginiert ist damit nicht gelöst.
Imports System.Security.Cryptography
Imports System.IO
Imports System.Text
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
' Generated from "pw" aber so etwas wie "rTz16p??x79" wäre besser...
Private _pwhash As Byte() = {&H1A, &H91, &HD6, &H2F, &H7C, &HA6, &H73, _
&H99, &H62, &H5A, &H43, &H68, &HA6, &HAB, &H5D, &H4A, &H3B, &HAA, &H60, _
&H73}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
PasswordTextBox.Text = "pw"
WriteDataTextBox.Text = "some data" + vbCrLf + "more data"
End Sub
Private Sub GenerateHashButton_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles GenerateHashButton.Click
Dim h As New SHA1Managed
Dim hash As Byte() = h.ComputeHash(Encoding.UTF8.GetBytes( _
PasswordTextBox.Text))
h.Clear()
hx(hash)
End Sub
Private Sub WriteDataButton_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles WriteDataButton.Click
Dim fs As New FileStream("C:\enc.txt", FileMode.Create, _
FileAccess.Write, FileShare.None)
Dim rm As New RijndaelManaged
rm.GenerateIV()
Dim iv() As Byte = rm.IV
SetRijndaelKey(rm, _pwhash)
fs.Write(iv, 0, iv.Length)
Dim cs As New CryptoStream(fs, rm.CreateEncryptor(), _
CryptoStreamMode.Write)
Dim sw As New StreamWriter(cs, Encoding.UTF8)
sw.Write(WriteDataTextBox.Text)
sw.Close()
rm.Clear()
End Sub
Private Sub ReadDataButton_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles ReadDataButton.Click
If Not checkPassword(PasswordTextBox.Text) Then
MsgBox("Password invalid")
Return
End If
Dim fs As New FileStream("C:\enc.txt", FileMode.Open, FileAccess.Read, _
FileShare.None)
Dim rm As New RijndaelManaged
Dim iv(rm.IV.Length - 1) As Byte
fs.Read(iv, 0, iv.Length)
rm.IV = iv
SetRijndaelKey(rm, _pwhash)
Dim cs As New CryptoStream(fs, rm.CreateDecryptor(), _
CryptoStreamMode.Read)
Dim sr As New StreamReader(cs, Encoding.UTF8)
ReadDataTextBox.Text = sr.ReadToEnd()
sr.Close()
rm.Clear()
End Sub
Private Function checkPassword(ByVal pw As String) As Boolean
Dim h As New SHA1Managed
Dim hash As Byte() = h.ComputeHash(Encoding.UTF8.GetBytes( _
PasswordTextBox.Text))
h.Clear()
For i As Integer = 0 To hash.Length - 1
If _pwhash(i) <> hash(i) Then Return False
Next
Return True
End Function
Private Sub SetRijndaelKey(ByVal rm As Rijndael, ByVal seed As Byte())
Dim key(rm.KeySize / 8 - 1) As Byte
Dim j As Integer
For i As Integer = 0 To key.Length - 1
If j = seed.Length Then j = 0
key(i) = seed(j)
j += 1
Next
rm.Key = key
End Sub
Private Sub hx(ByVal ba() As Byte)
For Each b As Byte In ba
Debug.Write(Hex(b))
Next
Debug.WriteLine("")
End Sub
End Class |