AES Ver-/Entschlüsselung

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von julian2704.

    AES Ver-/Entschlüsselung

    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

    Quellcode

    1. System.ArgumentNullException wurde nicht behandelt.
    2. Message=Der Zeichenfolgenverweis ist nicht auf einen Zeichenfolgeninstanz festgelegt.
    3. Parametername: s
    4. ParamName=s
    5. Source=mscorlib
    6. StackTrace:
    7. bei System.Text.Encoding.GetBytes(String s)
    8. bei JSHS.functions.Crypt(Int32 AESKeySize, String sString, String Password) in C:\KURZ-BACKUP\JSHS\...\functions.vb:Zeile 51.
    9. bei JSHS.Form1.WriteSettings() in C:\KURZ-BACKUP\JSHS\...\Form1.vb:Zeile 186.
    10. bei JSHS.Form1.SimpleButton3_Click(Object sender, EventArgs e) in C:\KURZ-BACKUP\JSHS\...\Form1.vb:Zeile 366.
    11. bei System.Windows.Forms.Control.OnClick(EventArgs e)
    12. bei DevExpress.XtraEditors.BaseButton.OnClick(EventArgs e)
    13. bei DevExpress.XtraEditors.BaseButton.OnMouseUp(MouseEventArgs e)
    14. bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    15. bei System.Windows.Forms.Control.WndProc(Message& m)
    16. bei DevExpress.Utils.Controls.ControlBase.WndProc(Message& m)
    17. bei DevExpress.XtraEditors.BaseControl.WndProc(Message& msg)
    18. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    19. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    20. bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    21. bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    22. bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    23. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    24. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    25. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    26. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    27. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    28. bei JSHS.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
    29. bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    30. bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    31. bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    32. bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    33. bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
    34. bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    35. bei System.Threading.ThreadHelper.ThreadStart()

    Ich habe folgenden Code verwendet:
    Quellcode

    VB.NET-Quellcode

    1. ' Verschlüsseln
    2. Public Sub Crypt(ByVal AESKeySize As Int32, ByVal sString As String, ByVal Password As String)
    3. ' Der Salt-Wert ist eine zufällig gewählte Zeichenfolge,
    4. ' wenn man so will ein zweites Passwort.
    5. ' Nur wer den Salt-Wert und das Passwort kennt,
    6. ' kann entschlüsseln.
    7. ' Durch Verwendung eines Salt-Wertes ist es deutlich
    8. ' schwerer das Passwort zu knacken.
    9. ' Wird das Passwort selber zur Erstellung des Salt-Wertes
    10. ' verwendet, muss dieses mindestens 8 Zeichen haben.
    11. Dim Salt() As Byte
    12. Salt = System.Text.Encoding.UTF8.GetBytes( _
    13. "test1234")
    14. ' Mit Hilfe des Passwortes und des Salt wird ein Key (Hash-Wert)
    15. ' generiert, der später zur Initialisierung des
    16. ' AES-Algorithmus verwendt wird.
    17. Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)
    18. ' Instanzierung des AES-Algorithmus-Objekts mit 256-bit
    19. ' oder 128-bit Schlüssel und 128-bit Block-Size
    20. Dim AES As New AesManaged
    21. AES.KeySize = AESKeySize ' möglich sind 256 oder 128 bit
    22. AES.BlockSize = 128
    23. ' Algorithmus initialisieren:
    24. AES.Key = GenerierterKey.GetBytes(AES.KeySize \ 8)
    25. AES.IV = GenerierterKey.GetBytes(AES.BlockSize \ 8)
    26. ' Memory-Stream und Crypto-Stream erzeugen -> CreateEncryptor()
    27. Dim ms As New IO.MemoryStream
    28. Dim cs As New CryptoStream(ms, AES.CreateEncryptor(), _
    29. CryptoStreamMode.Write)
    30. ' Daten verschlüsseln:
    31. Dim Data() As Byte
    32. Data = System.Text.Encoding.UTF8.GetBytes(DecryptedString)
    33. cs.Write(Data, 0, Data.Length)
    34. cs.FlushFinalBlock()
    35. cs.Close()
    36. ' Verschlüsselte Daten als String ausgeben:
    37. EncryptedString_ = Convert.ToBase64String(ms.ToArray)
    38. ms.Close()
    39. AES.Clear()
    40. End Sub
    41. ' Entschlüsseln
    42. Public Sub Decrypt(ByVal AESKeySize As Int32, _
    43. ByVal sString As String, _
    44. ByVal Password As String)
    45. ' Der Salt-Wert und das Passwort müssen mit dem übereinstimmen,
    46. ' das bei der Verschlüsselung verwendet wurde:
    47. Dim Salt() As Byte
    48. Salt = System.Text.Encoding.UTF8.GetBytes( _
    49. "test1234")
    50. Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)
    51. ' Instanzierung des AES-Algorithmus-Objekts:
    52. Dim AES As New AesManaged
    53. ' Ein mit 256 bit verschlüsselter String kann
    54. ' auch nur mit 256 bit entschlüsselt werden!
    55. AES.KeySize = AESKeySize ' möglich sind 256 oder 128 bit
    56. AES.BlockSize = 128
    57. ' Algorithmus initialisieren:
    58. AES.Key = GenerierterKey.GetBytes(AES.KeySize \ 8)
    59. AES.IV = GenerierterKey.GetBytes(AES.BlockSize \ 8)
    60. ' Memory-Stream und Crypto-Stream erzeugen -> CreateDecryptor()
    61. Dim ms As New IO.MemoryStream
    62. Dim cs As New CryptoStream(ms, AES.CreateDecryptor(), _
    63. CryptoStreamMode.Write)
    64. Try ' Daten entschlüsseln:
    65. Dim Data() As Byte
    66. Data = Convert.FromBase64String(EncryptedString)
    67. cs.Write(Data, 0, Data.Length)
    68. cs.FlushFinalBlock()
    69. cs.Close()
    70. ' Die entschlüsselten Daten als String ausgeben:
    71. DecryptedString_ = System.Text.Encoding.UTF8.GetString(ms.ToArray)
    72. ms.Close()
    73. AES.Clear()
    74. Catch ex As Exception
    75. DecryptedString_ = "Ungültiges Passwort!"
    76. End Try
    77. End Sub


    Ich habe schon recherchiert, finde aber keine Lösung. :thumbdown:
    Ich vermute, dass sowohl bei Encrypten als auch beim decrypten, der zu ver/entschlüsselnde String als Parameter (sString) übergeben werden soll.

    VB.NET-Quellcode

    1. Daher:
    2. Data = System.Text.Encoding.UTF8.GetBytes(DecryptedString) '<-- was ist DecryptedString? vermutlich soll hier sString rein.


    Analog bei Encryption.

    Oder ist DecryptedString global definiert und mit einem String zum Verschlüsseln befüllt?
    Das ist meine Signatur und sie wird wunderbar sein!
    Richtig kopieren will schon gelernt sein.



    Die Methoden Signaturen enthalten, wie ich vermutet habe:

    VB.NET-Quellcode

    1. Public Sub Encrypt(ByVal AESKeySize As Int32, _
    2. ByVal DecryptedString As String, _
    3. ByVal Password As String)


    Wenn du dort DecryptedString mit sString ersetzt... nunja :D
    Das ist meine Signatur und sie wird wunderbar sein!