AES decrypt "Dane wejściowe nie są kompletnym blokiem"

0

A więc chcę zrobić program który będzie szyfrował (AES) za pomocą textboxa wpisuję frazę do zaszyfrowania, zaszyfrowaną frazę zapisuję do pliku o rozszerzeniu .txt, następnie wczytuję ten plik i następuje deszyfracja. O ile z szyfrowaniem nie mam problemu, to z deszyfrowaniem jest problem. zwraca mi błąd "Dane wejściowe nie są kompletnym blokiem" pod sam koniec w

 plaintext = srDecrypt.ReadToEnd();

tworzenie Keya oraz IV

            using (Aes myAes = Aes.Create())
            {
                Key = myAes.Key;
                IV = myAes.IV;
            }
public string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            // Declare the string used to hold
            // the decrypted text.
            string plaintext = null;

            // Create an Aes object
            // with the specified key and IV.
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decryptor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for decryption.
                using (MemoryStream msDecrypt = new MemoryStream(cipherText))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {

                            // Read the decrypted bytes from the decrypting stream
                            // and place them in a string.
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }

            }
            return plaintext;
        }

Byłbym wdzięczny za pomoc w rozwiązaniu mojego problemu ;/

0

Jak masz skonfigurowany AES do szyfrowania? Wszystko robisz z defaulta czy próbowałeś to jakoś po swojemu konfigurować? Na pierwszy rzut oka ten kod to jest Ctrl-C + Ctrl-V stąd - mam rację?

Wrzuć jeszcze fragment kodu, którym szyfrujesz dane i manipulujesz nimi w jakikolwiek sposób (np. zapis/odczyt z pliku), to może być spowodowane np.:

  • rozjazdem między rozmiarami bloków zdefiniowanymi dla odczytu i zapisu
  • dodawaniem jakiegoś zbędnego lub nadmiarowego paddingu, przez który dane nie dopełniają się do pełnego bloku
  • jakimś błędem przy odczycie / zapisie pliku np. z jakiegoś powodu możesz nie wiem, gubić ostatni bajt czy coś w ten deseń. Upewnij się, że dane przed i po zapisie są identyczne.
0

Tak, z tamtej strony. kod jest ogólnie pod konsolę zrobiony, a ja po prostu go na okienkową aplikacje przerabiam.

paddingu nie dodaję, nie ucina bajta przy szyfrowaniu i zapisaniu.
błąd jest przy wczytywaniu, nie wczytuje pewne znaki, przy zapisie jak plik ma rozmiar** [64] bit** to przy wczytywaniu i odszyfrowaniu ma już różnie, ale nigdy taka sama wartość/większa
musiałbym zmienić chyba metodę wczytywania z pliku, ale co do tego użyć?

 private void Save_Click(object sender, RoutedEventArgs e)
        {
            string encrypt;
            SaveFileDialog sfd = new SaveFileDialog
            {
                Filter = "txt | *.txt",
            };
            sfd.ShowDialog();
            if (sfd.FileName != "")
            {
                StreamWriter sw = new StreamWriter(sfd.FileName);
                    encrypt = Encoding.UTF8.GetString(aes.EncryptStringToBytes_Aes(SaveFile.Text, Key, IV));
                    sw.WriteLine(encrypt, 0, encrypt.Length);
                sw.Close();
            }
        }
private void Load_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog
            {
                Filter = "txt | *.txt"
            };
            ofd.ShowDialog();
            StreamReader sr = new StreamReader(ofd.FileName);

                LoadFile.Text = aes.DecryptStringFromBytes_Aes(Encoding.UTF8.GetBytes(sr.ReadLine()), Key, IV);
            
            sr.Close();
        }
1

Podejrzewam, że coś się może babrać, bo zapisujesz/czytasz dane binarne (zaszyfrowany tekst) stosując kodowanie UTF-8. Zamiast tego przy odczycie/zapisie powinieneś traktować te dane jako binarne - bajt po bajcie, bez żadnego kodowania. W dodatku używasz np. WriteLine, którzy dorzuca tam pewnie znaki nowej linii.

0

Dzięki za poruszenie u mnie tych martwych szarych komórek, zapisałem plik w postaci .BIN zamiast kodować na UTF8 i wszystko działa.

przy zapisie zastosowałem

File.WriteAllBytes("decrypted.bin", aes.EncryptStringToBytes_Aes(SaveFile.Text, Key, IV)); 

a przy odczycie zastosowałem

            var encrypting = File.ReadAllBytes("decrypted.bin");
            var decypted = aes.DecryptStringFromBytes_Aes(encrypting, Key, IV);
            LoadFile.Text = decypted;

śmiga ładnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1