• Beta
    • Open Source

    Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Vainamo V.

      Sieht mir soweit richtig aus.
      Dennoch weitere Kritikpunkte:
      1. Implementiere zwei Properties für die Schlüssel, statt diese beide in einer Funktion zurückzugeben. Das ist einfacher für die Benutzung.
      2. Dir fehlt die Implementierung von IDisposable.
      3. Bei Encrypt muss ich auch den Schlüssel mit angeben.
      4. Rufe im Konstruktor bereits ToXmlString(True) auf. Der RSACryptoServiceProvider verwendet afaik Lazy-Initialisierung und somit generierst Du das Schlüsselpaar direkt beim Erstellen einer Instanz und nicht erst in der Funktion für die Schlüsselrückgabe. Ich bin mir aber noch nicht mal sicher, ob man das dann, so wie es aktuell ist, direkt verwenden kann, wenn die Schlüssel noch nicht generiert wurden. Also bleibt fraglich, ob das dann geht. Funktioniert das?
      5. Gib' Rückgabewerte der Signierungs- und Verifizierungsfunktionen direkt zurück, statt eine lokale Variable anzulegen. (Auch bei den anderen Funktionen, wenn möglich.
      6. Statt den Stream beim Verifizieren in ein Byte-Array umzuwandeln:

        VB.NET-Quellcode

        1. Dim hash As HashAlgorithm = DirectCast(CryptoConfig.CreateFromName(DirectCast(Algorithm, String)), HashAlgorithm)
        2. Dim hashVal As Byte() = hash.ComputeHash(Data)
        3. Return RSACSP.VerifyHash(hashVal, DirectCast(Algorithm, String), Signature)

      7. Benenne Data beim Stream in stream um. Die Daten werden da erst rausgelesen.
      8. Naming Conventions beachten!
      Ich hoffe, ich habe jetzt nichts vergessen, aber das sollte es sein.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Hej @Trade.

      Vielen Dank für deine Hilfe. Ich nehme mal ein bisschen Stellung zu..
      1. Wird gemacht. Erledigt ^^ .
      2. Wird auch gemacht. Erledigt ^^ .
      3. Hatte ich beim Umstellen vergessen rauszunehmen > Erledigt.
      4. So wie es jetzt ist funktioniert es auch ohne ToXmlString().
      5. Die lokalen Variablen sind noch Überbleibsel (weil ich ja .Disposen musste, konnte ich nicht gleich die Rückgabewerte zurückgeben). > In RSA erledigt, die anderen kommen jetzt mit der Umstellung weg.
      6. Geändert ^^ .
      7. Ich bin immer vorsichtig mit Variablen die wie Klassen heißen.
      8. In wiefern?

      Grüße
      Väinämö

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Vainamo V“ ()

      Zu 4: Mach das trotzdem so, ist besser.
      Zu 7: Ja gut, ist ja VB.NET. Dann halt dataStream oder so. :P
      Zu 8: RSACSP ist z. B. nicht guidelinekonform. msdn.microsoft.com/en-us/library/ms229002(v=vs.110).aspx

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Update



      • Die Klassen, die Verschlüsselungen bereitstellen, wurden auf non-shared umgestellt. Die Umstellung der HashServiceProvider kommt noch.
      • Alle umgestellten Klassen implementieren jetzt IDisposable.
      • Die RSAServiceProvider.Verify hat jetzt Original As IO.Stream statt wie zuvor Original As Byte() als Parameter und wird umbenannt in Validate.

      Update im Startpost.

      Grüße
      Väinämö

      Felder haben die Naming Convention PascalCase, sehe ich gerade. Da muss ich mich nochmal verbessern, denn in der Regel würde ich dafür LowerCammelCase benutzen: serviceProvider oder besser sogar _serviceProvider, um (hier) globale Variablen von lokalen zu unterscheiden. Das ist aber das Einzige, sonst passt alles. Da kannste aber nichts dafür, hast ja die Conventions befolgt. Daher entscheide Du das, wie Du willst. Imho hat hier Microsoft halt Unsinn gemacht (die beachten ihre Guidelines eh nicht selbst).^^

      Nur Parameter würde ich klein schreiben, das ist eigentlich normal so.
      Aber gut, ich will daran jetzt nicht unbedingt rummeckern, weil grundsätzlich passt's ja.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Hej @Trade

      LowerCamelCase nehm ich eigentlich nur für C# oder Java.
      Und die _-Schreibweise behalte ich mir für BackingFields vor.
      Die Parameter könnte ich eigentlich wirklich klein schreiben. Mal schauen wann ich dazu komme :P .

      Grüße
      Väinämö
      Mal ein kleines

      Update
      • Überall wo es sinnvoll erschien, sind die Klassen nun auf non-Shared umgestellt.
      • MD5 wurde als Hash hinzugefügt.
      • Anfragen für besondere Algorithmen (z.B. XOR usw.) könnt ihr auch gerne als Include-Issue auf GitHub stellen.

      Update im Startpost oder hier.



      Grüße
      Väinämö

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Vainamo V“ ()

      Hallo Väinämö

      Hab kurz deine Dll getestet. Irgendetwas stimmt nicht mit der Descryptionfunktion.
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Sub Main()
      2. Dim sEnc, sDec As String
      3. Dim bEnc(), bDec() As Byte
      4. Dim iv As Types.IVKeyData = Nothing
      5. Dim sText As String = "The quick brown fox jumps over the lazy dog"
      6. 'String Variante
      7. Using aesSP As New AESServiceProvider
      8. iv = aesSP.Parameters()
      9. sEnc = aesSP.Encrypt(sText)
      10. sDec = aesSP.Decrypt(sEnc)
      11. End Using
      12. Using aesSP As New AESServiceProvider(iv)
      13. sDec = aesSP.Decrypt(sEnc)
      14. End Using
      15. 'Byte Variante
      16. iv = Nothing
      17. Dim bText() As Byte = Encoding.UTF8.GetBytes(sText)
      18. Using aesSP As New AESServiceProvider
      19. iv = aesSP.Parameters()
      20. bEnc = aesSP.Encrypt(bText)
      21. bDec = aesSP.Decrypt(bEnc)
      22. Dim s As String = Encoding.UTF8.GetString(bDec)
      23. End Using
      24. Using aesSP As New AESServiceProvider(iv)
      25. bDec = aesSP.Decrypt(bEnc)
      26. Dim s As String = Encoding.UTF8.GetString(bDec)
      27. End Using
      28. End Sub



      Spoiler anzeigen

      Sollte das nicht in etwa so aussehen

      VB.NET-Quellcode

      1. #Region "Public Function"
      2. ''' <summary>
      3. ''' Verschlüsselt einen String mit Aes.
      4. ''' </summary>
      5. ''' <param name="Data">Zu verschlüsselnder String.</param>
      6. ''' <returns></returns>
      7. Public Function Encrypt(ByVal Data As String) As String
      8. Using AesCryptoTransform As ICryptoTransform = Me.ServiceProvider.CreateEncryptor()
      9. Using MS As New MemoryStream
      10. Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Write)
      11. Using SW As New StreamWriter(CS)
      12. SW.Write(Data)
      13. End Using
      14. End Using
      15. Return Convert.ToBase64String(MS.ToArray)
      16. End Using
      17. End Using
      18. End Function
      19. ''' <summary>
      20. ''' Verschlüsselt ein Byte-Array mit Aes.
      21. ''' </summary>
      22. ''' <param name="Data">Zu verschlüsselndes Byte-Array.</param>
      23. ''' <returns></returns>
      24. Public Function Encrypt(ByVal Data As Byte()) As Byte()
      25. Using AesCryptoTransform As ICryptoTransform = Me.ServiceProvider.CreateEncryptor()
      26. Using MS As New MemoryStream
      27. Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Write)
      28. Using BW As New BinaryWriter(CS)
      29. BW.Write(Data)
      30. End Using
      31. End Using
      32. Return MS.ToArray
      33. End Using
      34. End Using
      35. End Function
      36. ''' <summary>
      37. ''' Entschlüsselt einen String mit Aes.
      38. ''' </summary>
      39. ''' <param name="Data">Zu entschlüsselnder String.</param>
      40. ''' <returns></returns>
      41. Public Function Decrypt(ByVal Data As String) As String
      42. Using AesCryptoTransform As ICryptoTransform = Me.ServiceProvider.CreateDecryptor()
      43. Using MS As New MemoryStream(Convert.FromBase64String(Data))
      44. Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Read)
      45. Using SR As New StreamReader(CS)
      46. Return SR.ReadToEnd
      47. End Using
      48. End Using
      49. End Using
      50. End Using
      51. End Function
      52. ''' <summary>
      53. ''' Entschlüsselt ein Byte-Array mit Aes.
      54. ''' </summary>
      55. ''' <param name="Data">Zu entschlüsselndes Byte-Array.</param>
      56. ''' <returns></returns>
      57. Public Function Decrypt(ByVal Data As Byte()) As Byte()
      58. Using AesCryptoTransform As ICryptoTransform = Me.ServiceProvider.CreateDecryptor()
      59. Using MS As New MemoryStream(Data)
      60. Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Read)
      61. Using SR As New StreamReader(CS)
      62. Return Encoding.UTF8.GetBytes(SR.ReadToEnd)
      63. End Using
      64. End Using
      65. End Using
      66. End Using
      67. End Function
      68. #End Region




      Edit: UUUUUHHHHHHHAAAHHHHH da hab ich nur den Code kopiert und nicht studiert :whistling: Übel, übel. Ist auf jedenfall besser hier AES Byte-Array Decryption schlägt fehl


      Freundliche Grüsse

      exc-jdbi

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

      Hej @exc-jdbi.

      Ich hab jetzt erstmal die überflüssigen Instanziierungen entfernt. Die Decrypt As String funktioniert nun einwandfrei. Lediglich die Decrypt As Byte() wirft eine Exception, dass die Zeichenabstände ungültig seien und nicht entfernt werden könnten. Mal schauen woran es liegt.

      Danke für den Hinweis.

      Edit: Zu dem Problem mit der Decryption As Byte() gibt es nun sowohl einen Thread im VBP (AES Byte-Array Decryption schlägt fehl), als auch einen GitHub Issue.

      Grüße
      Väinämö

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Vainamo V“ ()