Hallo liebes VBP-Forum,
ich habe ein Problem mit einer AES-Klasse.
Und zwar, wenn ich einen String verschlüsseln möchte, spuckt mir VS immer folgende Meldung aus:
Fehlermeldung
Ich habe folgenden Code verwendet:
Quellcode
Ich habe schon recherchiert, finde aber keine Lösung.
ich habe ein Problem mit einer AES-Klasse.
Und zwar, wenn ich einen String verschlüsseln möchte, spuckt mir VS immer folgende Meldung aus:
Quellcode
- System.ArgumentNullException wurde nicht behandelt.
- Message=Der Zeichenfolgenverweis ist nicht auf einen Zeichenfolgeninstanz festgelegt.
- Parametername: s
- ParamName=s
- Source=mscorlib
- StackTrace:
- bei System.Text.Encoding.GetBytes(String s)
- bei JSHS.functions.Crypt(Int32 AESKeySize, String sString, String Password) in C:\KURZ-BACKUP\JSHS\...\functions.vb:Zeile 51.
- bei JSHS.Form1.WriteSettings() in C:\KURZ-BACKUP\JSHS\...\Form1.vb:Zeile 186.
- bei JSHS.Form1.SimpleButton3_Click(Object sender, EventArgs e) in C:\KURZ-BACKUP\JSHS\...\Form1.vb:Zeile 366.
- bei System.Windows.Forms.Control.OnClick(EventArgs e)
- bei DevExpress.XtraEditors.BaseButton.OnClick(EventArgs e)
- bei DevExpress.XtraEditors.BaseButton.OnMouseUp(MouseEventArgs e)
- bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
- bei System.Windows.Forms.Control.WndProc(Message& m)
- bei DevExpress.Utils.Controls.ControlBase.WndProc(Message& m)
- bei DevExpress.XtraEditors.BaseControl.WndProc(Message& msg)
- bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
- bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
- bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
- bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
- bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
- bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
- bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
- bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
- bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
- bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
- bei JSHS.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
- bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
- bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
- bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
- bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
- bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
- bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
- bei System.Threading.ThreadHelper.ThreadStart()
Ich habe folgenden Code verwendet:
VB.NET-Quellcode
- ' Verschlüsseln
- Public Sub Crypt(ByVal AESKeySize As Int32, ByVal sString As String, ByVal Password As String)
- ' Der Salt-Wert ist eine zufällig gewählte Zeichenfolge,
- ' wenn man so will ein zweites Passwort.
- ' Nur wer den Salt-Wert und das Passwort kennt,
- ' kann entschlüsseln.
- ' Durch Verwendung eines Salt-Wertes ist es deutlich
- ' schwerer das Passwort zu knacken.
- ' Wird das Passwort selber zur Erstellung des Salt-Wertes
- ' verwendet, muss dieses mindestens 8 Zeichen haben.
- Dim Salt() As Byte
- Salt = System.Text.Encoding.UTF8.GetBytes( _
- "test1234")
- ' Mit Hilfe des Passwortes und des Salt wird ein Key (Hash-Wert)
- ' generiert, der später zur Initialisierung des
- ' AES-Algorithmus verwendt wird.
- Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)
- ' Instanzierung des AES-Algorithmus-Objekts mit 256-bit
- ' oder 128-bit Schlüssel und 128-bit Block-Size
- Dim AES As New AesManaged
- AES.KeySize = AESKeySize ' möglich sind 256 oder 128 bit
- AES.BlockSize = 128
- ' Algorithmus initialisieren:
- AES.Key = GenerierterKey.GetBytes(AES.KeySize \ 8)
- AES.IV = GenerierterKey.GetBytes(AES.BlockSize \ 8)
- ' Memory-Stream und Crypto-Stream erzeugen -> CreateEncryptor()
- Dim ms As New IO.MemoryStream
- Dim cs As New CryptoStream(ms, AES.CreateEncryptor(), _
- CryptoStreamMode.Write)
- ' Daten verschlüsseln:
- Dim Data() As Byte
- Data = System.Text.Encoding.UTF8.GetBytes(DecryptedString)
- cs.Write(Data, 0, Data.Length)
- cs.FlushFinalBlock()
- cs.Close()
- ' Verschlüsselte Daten als String ausgeben:
- EncryptedString_ = Convert.ToBase64String(ms.ToArray)
- ms.Close()
- AES.Clear()
- End Sub
- ' Entschlüsseln
- Public Sub Decrypt(ByVal AESKeySize As Int32, _
- ByVal sString As String, _
- ByVal Password As String)
- ' Der Salt-Wert und das Passwort müssen mit dem übereinstimmen,
- ' das bei der Verschlüsselung verwendet wurde:
- Dim Salt() As Byte
- Salt = System.Text.Encoding.UTF8.GetBytes( _
- "test1234")
- Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)
- ' Instanzierung des AES-Algorithmus-Objekts:
- Dim AES As New AesManaged
- ' Ein mit 256 bit verschlüsselter String kann
- ' auch nur mit 256 bit entschlüsselt werden!
- AES.KeySize = AESKeySize ' möglich sind 256 oder 128 bit
- AES.BlockSize = 128
- ' Algorithmus initialisieren:
- AES.Key = GenerierterKey.GetBytes(AES.KeySize \ 8)
- AES.IV = GenerierterKey.GetBytes(AES.BlockSize \ 8)
- ' Memory-Stream und Crypto-Stream erzeugen -> CreateDecryptor()
- Dim ms As New IO.MemoryStream
- Dim cs As New CryptoStream(ms, AES.CreateDecryptor(), _
- CryptoStreamMode.Write)
- Try ' Daten entschlüsseln:
- Dim Data() As Byte
- Data = Convert.FromBase64String(EncryptedString)
- cs.Write(Data, 0, Data.Length)
- cs.FlushFinalBlock()
- cs.Close()
- ' Die entschlüsselten Daten als String ausgeben:
- DecryptedString_ = System.Text.Encoding.UTF8.GetString(ms.ToArray)
- ms.Close()
- AES.Clear()
- Catch ex As Exception
- DecryptedString_ = "Ungültiges Passwort!"
- End Try
- End Sub
Ich habe schon recherchiert, finde aber keine Lösung.