AES šifrování souborů - nuly na konci   zodpovězená otázka

VB.NET, Bezpečnost

Zdravím,

potřebuji pomocí AES šifrovat soubory, vzal jsem kód z http://www.obviex.com/samples/Encryption..., upravil si ho aby místo text bral a vyhazoval pole bytů. Funguje dobře, jenom mám problém, že dešifrovaná data nejsou stejná jako ta původní - na konci se objeví několik dalších nulových bajtů - konkrétně nový soubor má 40177, což je taky divný, protože by bajty měli být doplněny na 16, tady 1 přebývá...

Zkoušel jsem všechny možnosti naatavení Padding, ale bez úspěchu. Je nějaké řešení jak tomu zabránit kromě oříznutí konce souboru?

Function Encrypt(ByVal input As Byte(), _
                                   ByVal key As Byte(), _
                                   ByVal iv As Byte()) _
                           As Byte()


        Dim symmetricKey As New Security.Cryptography.AesManaged
        symmetricKey.Mode = Security.Cryptography.CipherMode.CBC
        Dim encryptor As Security.Cryptography.ICryptoTransform
        encryptor = symmetricKey.CreateEncryptor(key, iv)

        ' Define memory stream which will be used to hold encrypted data.
        Dim memoryStream As New IO.MemoryStream
        Dim cryptoStream As New Security.Cryptography.CryptoStream(memoryStream, _
                                        encryptor, _
                                        Security.Cryptography.CryptoStreamMode.Write)
        ' Start encrypting.
        cryptoStream.Write(input, 0, input.Length)

        ' Finish encrypting.
        cryptoStream.FlushFinalBlock()

        ' Convert our encrypted data from a memory stream into a byte array.
        Dim cipherTextBytes As Byte() = memoryStream.ToArray()

        ' Close both streams.
        memoryStream.Close()
        cryptoStream.Close()

        Encrypt = cipherTextBytes
    End Function

    Function Decrypt(ByVal input As Byte(), _
                                   ByVal key As Byte(), _
                                   ByVal iv As Byte()) _
                           As Byte()

        Dim symmetricKey As New Security.Cryptography.AesManaged()
        symmetricKey.Mode = Security.Cryptography.CipherMode.CBC

        ' Generate decryptor from the existing key bytes and initialization 
        ' vector. Key size will be defined based on the number of the key 
        ' bytes.
        Dim decryptor As Security.Cryptography.ICryptoTransform
        decryptor = symmetricKey.CreateDecryptor(key, iv)

        ' Define memory stream which will be used to hold encrypted data.
        Dim memoryStream As New IO.MemoryStream(input)

        ' Define memory stream which will be used to hold encrypted data.
        Dim cryptoStream As New Security.Cryptography.CryptoStream(memoryStream, _
                                        decryptor, _
                                        Security.Cryptography.CryptoStreamMode.Read)

        ' Since at this point we don't know what the size of decrypted data
        ' will be, allocate the buffer long enough to hold ciphertext;
        ' plaintext is never longer than ciphertext.
        Dim plainTextBytes As Byte()
        ReDim plainTextBytes(input.Length)

        ' Start decrypting.
        Dim decryptedByteCount As Integer = cryptoStream.Read(plainTextBytes, _
                                               0, _
                                               plainTextBytes.Length)

        ' Close both streams.
        memoryStream.Close()
        cryptoStream.Close()

       
        Decrypt = plainTextBytes
    End Function
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je v obou případech (šifrování a dešifrování) stejný inicializační vektor?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano.

Klíč i IV jsem vytvářel z funkcemi z hesla, teď jsem to ještě upravil, aby se napřed vytvořilo do proměnné a až potom se předávali šifrovacím funkcím, takže je rozhodně stejný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

* Vyřešeno *

Už to mám, pole plainTextBytes má velikost stejnou velikost jako pole zašifrovaných bytů, ale cryptoStream.Read vrací bytů míň - jako původní soubor, takže zbytek pole jsou nuly. V původním kódu to vyřešili že jenom počet decryptedByteCount převáděli na text, já ale na text nepřevádím, takže jsem zrovna tu část smazal :D Takže stačilo za čtení dešifrovaných dat přidat řádek

ReDim Preserve plaintextbytes(decryptedbytecount - 1)
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravim,

zkousel jsem tvuj priklad, ale i kdyz zadefinuji Imports:

Imports System
Imports System.Text
Imports System.IO
Imports System.Security.Cryptography

stejne mi to vyhodi hlasku:

'Security.Cryptography.AesManaged' is not defined

Co mi jeste chybi, netusis?

(Visual Studio 2010)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pridanú reference na System.Core.dll ? Ak dáte v Object Browser režim My Solution, vidíte tam triedu AesManaged ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diky za napovedu, ale netusim, kde je zamaskovany System.Core.dll :)

Pro projekt pouzivam NET.20, ale v PC mam vsechny verze Frameworku - kdyby to bylo nutne. Asi to bude vyssi verze NET 3,5. Tak jest?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

AesManaged je opravdu k dispozici až od verze .NET 3.5.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback