AES Byte-Array Decryption schlägt fehl

  • VB.NET
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    AES Byte-Array Decryption schlägt fehl

    Hej.

    Wie vielleicht manche mitbekommen haben, probiere ich mich ja zur Zeit an einer Art Klassenbibliothek / Framework-Wrapper alias . Problem ist nur, dass meine AES Decryption bei Byte-Arrays nicht so richtig will, wie ich will.

    Code der Decryption-Funktion:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Entschlüsselt ein Byte-Array mit Aes.
    3. ''' </summary>
    4. ''' <param name="Data">Zu entschlüsselndes Byte-Array.</param>
    5. ''' <returns></returns>
    6. Public Function Decrypt(ByVal Data As Byte()) As Byte()
    7. Dim AesCryptoTransform As ICryptoTransform = ServiceProvider.CreateDecryptor()
    8. Dim tReturn As Byte()
    9. Using MS As New MemoryStream(Data)
    10. Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Read)
    11. Using SR As New StreamReader(CS)
    12. tReturn = Text.Encoding.UTF8.GetBytes(SR.ReadToEnd)
    13. End Using
    14. End Using
    15. End Using
    16. Return tReturn
    17. End Function


    Aufgerufen wird das ganze im Beispiel so:

    VB.NET-Quellcode

    1. Dim Original As Byte() = Text.Encoding.UTF8.GetBytes("FESTIVAL")
    2. Dim ServiceProvider As New Vae.AESServiceProvider()
    3. Dim Encrypted As Byte() = ServiceProvider.Encrypt(Original)
    4. Dim Decrypted As Byte() = ServiceProvider.Decrypt(Encrypted)
    5. Dim Output As String = Text.Encoding.UTF8.GetString(Decrypted)


    Jetzt wirft er mir bei der Entschlüsselung:



    Das ganze gibts auch noch mal bei GitHub als Issue: github.com/vainamov/Vae/issues/4.
    Praktisch für euch, weil ihr dann, wenn ihr wollt, einfach nur nen Pull-Request machen müsst.

    Wenn ich übrigens vor dem Using SR As New StreamReader(CS) ein CS.FlushFinalBlock() reinhaue (wurde manchmal im Web vorgeschlagen), gibt die Funktion exceptionlos ein leeres Byte-Array zurück.

    Grüße
    Väinämö
    Ich würde sagen, dass dein Fehler bei der Encrypt-Funktion liegt:

    VB.NET-Quellcode

    1. Public Function Encrypt(ByVal Data As Byte()) As Byte()
    2. Dim ServiceProvider As New AesCryptoServiceProvider 'hier
    3. Dim AesCryptoTransform As ICryptoTransform = ServiceProvider.CreateEncryptor()
    4. Dim MS As New MemoryStream
    5. Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Write)
    6. Using BW As New BinaryWriter(CS)
    7. BW.Write(Data)
    8. End Using
    9. End Using
    10. Return MS.ToArray
    11. End Function


    Dadurch, dass du eine neue Instanz erstellst gehen Key und Salt verloren, womit du eben es auch nicht wieder entschlüsseln kannst. Außerdem würde ich dir umbedingt raten die Bytes als das zu behandeln, was sie sind. Es sind Bytes und keine Strings, also raus mit dem StreamReader und dem Encoding. Außerdem schreibst du nicht in den CryptoStream hinein, dadurch bekommst du sowieso kein Ergebnis, also:

    Vainamo V schrieb:

    Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Read)

    machst du zu

    VB.NET-Quellcode

    1. Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Write)

    Dann musst du noch die Bytes in den CryptoStream reinschreiben und dir vom MemoryStream die Bytes holen.
    Übrigens würde ich an deiner Stelle den TransForm in ein Using packen, er implementiert nämlich IDisposable ;)


    LG

    Edit: Habs dir noch kurz umgeschrieben, ich hoffe das sollte so richig sein:
    Encrypt

    VB.NET-Quellcode

    1. Public Function Encrypt(ByVal Data As Byte()) As Byte()
    2. Dim AesCryptoTransform As ICryptoTransform = ServiceProvider.CreateEncryptor()
    3. Dim tReturn As Byte()
    4. Using MS As New MemoryStream
    5. Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Write)
    6. CS.Write(Data, 0, Data.Length)
    7. CS.FlushFinalBlock()
    8. End Using
    9. tReturn = MS.ToArray
    10. End Using
    11. AesCryptoTransform.Dispose()
    12. Return tReturn
    13. End Function


    Decrypt

    VB.NET-Quellcode

    1. Public Function Decrypt(ByVal Data As Byte()) As Byte()
    2. Dim AesCryptoTransform As ICryptoTransform = ServiceProvider.CreateDecryptor()
    3. Dim tReturn As Byte()
    4. Using MS As New MemoryStream()
    5. Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Write)
    6. CS.Write(Data, 0, Data.Length)
    7. CS.FlushFinalBlock()
    8. End Using
    9. tReturn = MS.ToArray
    10. End Using
    11. AesCryptoTransform.Dispose()
    12. Return tReturn
    13. End Function

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

    Hej @ChOoSeMyNaMe.

    Danke erstmal. Ich hab die redundante Instanziierung in der Encrypt-Funktion entfernt und die Decrypt-Funktion soweit geändert.
    Er gibt allerdings noch immer ein leeres Byte-Array zurück.

    VB.NET-Quellcode

    1. Public Function Decrypt(ByVal Data As Byte()) As Byte()
    2. Dim tReturn As Byte()
    3. Using AesCryptoTransform As ICryptoTransform = ServiceProvider.CreateDecryptor()
    4. Using MS As New MemoryStream
    5. Using CS As New CryptoStream(MS, AesCryptoTransform, CryptoStreamMode.Write)
    6. CS.FlushFinalBlock()
    7. Using BW As New BinaryWriter(CS)
    8. BW.Write(Data)
    9. tReturn = MS.ToArray
    10. End Using
    11. End Using
    12. End Using
    13. End Using
    14. Return tReturn
    15. End Function


    Edit: Mit den umgeschriebenen Funktionen funktioniert es einwandfrei. Danke dir :love: .

    Grüße
    Väinämö
    Spar Dir die Streams, wenn Du direkt Byte-Arrays ver- und entschlüsselst:

    VB.NET-Quellcode

    1. Public Function Decrypt(ByVal Data As Byte()) As Byte()
    2. Using AesCryptoTransform = ServiceProvider.CreateDecryptor()
    3. Return AesCryptoTransform.TransformFinalBlock(Data, 0, Data.Length)
    4. End Using
    5. End Function
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hej @Niko Ortner.

    Hatte ich ausprobiert, nachdem ich es in deinem anderen Beitrag gelesen hatte. Lief aber auf den gleichen Issue #2 hinaus.

    Grüße
    Väinämö
    Also CryptographicException mit der Meldung über ungültiges Padding fliegt? Muss ich mal ausprobieren.

    Edit: Ok, ich hab ein ganz simples Beispielprogramm geschrieben:

    VB.NET-Quellcode

    1. Dim RNG As New System.Security.Cryptography.RNGCryptoServiceProvider
    2. Do
    3. Using Provider As New System.Security.Cryptography.AesCryptoServiceProvider
    4. Provider.BlockSize = 128
    5. Provider.KeySize = 128
    6. Provider.IV = New Byte(16 - 1) {}
    7. RNG.GetBytes(Provider.IV)
    8. Provider.Key = New Byte(16 - 1) {}
    9. RNG.GetBytes(Provider.Key)
    10. Provider.Mode = Security.Cryptography.CipherMode.CBC
    11. Provider.Padding = Security.Cryptography.PaddingMode.PKCS7
    12. Using Enc = Provider.CreateEncryptor, Dec = Provider.CreateDecryptor
    13. Dim Data = New Byte(16 - 1) {}
    14. RNG.GetBytes(Data)
    15. Dim Encrypted = Enc.TransformFinalBlock(Data, 0, Data.Length)
    16. Dim Decrypted = Dec.TransformFinalBlock(Encrypted, 0, Encrypted.Length)
    17. Dim IsEqual = Data.SequenceEqual(Decrypted)
    18. If Not IsEqual Then
    19. Throw New NopeException
    20. End If
    21. End Using
    22. End Using
    23. Loop

    Das läuft schon eine Weile und hat noch keine Exception geworfen. Also ich bin mir nicht ganz sicher, wo da jetzt das Problem liegt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()