У меня проблема, я сам пытался ее исправить, но не могу. Моя программа ищет также файлы .txt из каталога. Затем он читает файлы, шифрует каждый файл и перезаписывает старый файл. Это нормально работает. Теперь я хочу расшифровать файлы txt, происходит следующее:

Здесь вы можете увидеть зашифрованный текст и расшифрованный текст

Итак, проблема в том, что файл .txt становится зашифрованным, и расшифровка тоже работает, но когда я расшифровываю, исходный текст не появляется. Это видно на картинке, идут только зашитые буквы. Не понимаю почему, я использую ту же соль и тот же пароль.

Вот мой код:

Первые 3 фрагмента предназначены для шифрования, остальные 3 - для расшифровки.

foreach (var file in d2.GetFiles("*.txt"))
{
    Console.WriteLine(file.FullName, file.Name);
    string temppfad = file.FullName;
    StreamReader sr = new StreamReader(temppfad);
    string Inhalt = sr.ReadToEnd();
    Console.WriteLine(Inhalt + "\n");
    string Verschlüsselterinhalt = Verschlüsseln(Password, Inhalt);
    sr.Close();
    File.WriteAllText(temppfad, Verschlüsselterinhalt);
}

Эта часть все еще работает, просто загрузите ее, чтобы лучше понять.

Части шифрования:

static string Verschlüsseln(string PW, string original)
{
    using (RijndaelManaged myRijndael = new RijndaelManaged())
    {
        myRijndael.GenerateKey();
        myRijndael.GenerateIV();

        byte[] salt = Encoding.ASCII.GetBytes("0PQUX76U0adfaDADFexA888887Dz3J3X");
        Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(PW, salt);
        myRijndael.Key = key.GetBytes(myRijndael.KeySize / 8);
        myRijndael.IV = key.GetBytes(myRijndael.BlockSize / 8);

        // Encrypt the string to an array of bytes.
        byte[] encrypted = EncryptStringToBytes(original, myRijndael.Key, myRijndael.IV);

        StringBuilder s = new StringBuilder();
        foreach (byte item in encrypted)
        {
            s.Append(item.ToString("X2") + " ");
        }
        Console.WriteLine("Encrypted:   " + s + "\n\n");
        return s.ToString();
    }
}

static byte[] EncryptStringToBytes(string plainText, byte[] Key, byte[] IV)
{
    // Check arguments.
    if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");
    if (Key == null || Key.Length <= 0)
        throw new ArgumentNullException("Key");
    if (IV == null || IV.Length <= 0)
        throw new ArgumentNullException("Key");
    byte[] encrypted;
    // Create an RijndaelManaged object
    // with the specified key and IV.
    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        rijAlg.Key = Key;
        rijAlg.IV = IV;
        rijAlg.Mode = CipherMode.CBC;
        rijAlg.Padding = PaddingMode.Zeros;

        // Create a decrytor to perform the stream transform.
        ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);

        // Create the streams used for encryption.
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {

                    //Write all data to the stream.
                    swEncrypt.Write(plainText);
                }
                encrypted = msEncrypt.ToArray();
            }
        }
    }
    // Return the encrypted bytes from the memory stream.
    return encrypted;
}

Думаю, на этом этапе все в порядке, сейчас я отправлю расшифровку.

foreach (var file in d2.GetFiles("*.txt"))
{
    Console.WriteLine(file.FullName, file.Name);
    string temppfad = file.FullName;
    StreamReader sr = new StreamReader(temppfad);
    string Inhalt = sr.ReadToEnd();
    Console.WriteLine("Inhalt: " + Inhalt + "\n");
    string Entschlüsselterinhalt = Entschlüsseln(Password, Inhalt);
    sr.Close();
    File.WriteAllText(temppfad, Entschlüsselterinhalt);
}

static string Entschlüsseln(string PW, string original)
{
    using (RijndaelManaged myRijndael = new RijndaelManaged())
    {
        myRijndael.GenerateKey();
        myRijndael.GenerateIV();

        byte[] salt = Encoding.ASCII.GetBytes("0PQUX76U0adfaDADFexA888887Dz3J3X");
        Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(PW, salt);
        myRijndael.Key = key.GetBytes(myRijndael.KeySize / 8);
        myRijndael.IV = key.GetBytes(myRijndael.BlockSize / 8);

        // Decrypt the bytes to a string.
        byte[] originalbytes = Encoding.ASCII.GetBytes(original);
        string decrypted = DecryptStringFromBytes(originalbytes, myRijndael.Key, myRijndael.IV);

        //Display the original data and the decrypted data.
        Console.WriteLine("Decrypted:    " + decrypted);
        return decrypted;
    }
}

static string DecryptStringFromBytes(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("Key");

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

    // Create an RijndaelManaged object
    // with the specified key and IV.
    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        rijAlg.Key = Key;
        rijAlg.IV = IV;
        rijAlg.Mode = CipherMode.CBC;
        rijAlg.Padding = PaddingMode.Zeros;

        // Create a decrytor to perform the stream transform.
        ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.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;
}

Я был бы очень рад, если бы мне кто-нибудь помог.

< Сильный > ОБНОВЛЕНИЕ !!!

Я отредактировал сейчас свой код, теперь он выглядит так:

                foreach (var file in d2.GetFiles("*.txt"))
                {
                    Console.WriteLine(file.FullName, file.Name);
                    string temppfad = file.FullName;
                    StreamReader sr = new StreamReader(temppfad);
                    string Inhalt = sr.ReadToEnd();
                    Console.WriteLine(Inhalt + "\n");
                    byte[] Verschlüsselterinhalt = Verschlüsseln(Password, Inhalt);
                    sr.Close();
                    File.WriteAllBytes(temppfad, Verschlüsselterinhalt);
                }



    static byte[] Verschlüsseln(string PW, string original)
    {
        using (RijndaelManaged myRijndael = new RijndaelManaged())
        {

            byte[] salt = Encoding.ASCII.GetBytes("0PQUX76U0adfaDADFexA888887Dz3J3X");
            Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(PW, salt);
            myRijndael.Key = key.GetBytes(myRijndael.KeySize / 8);
            myRijndael.IV = key.GetBytes(myRijndael.BlockSize / 8);

            // Encrypt the string to an array of bytes.
            byte[] encrypted = EncryptStringToBytes(original, myRijndael.Key, myRijndael.IV);
            return encrypted;
        }
    }

Я думаю, что с этой частью все в порядке, теперь при расшифровке я получаю ошибку

                foreach (var file in d2.GetFiles("*.txt"))
                {
                    Console.WriteLine(file.FullName, file.Name);
                    string temppfad = file.FullName;
                    StreamReader sr = new StreamReader(temppfad);
                    string Inhalt = sr.ReadToEnd();
                    Console.WriteLine("Inhalt: " + Inhalt + "\n");
                    string Entschlüsselterinhalt = Entschlüsseln(Password, Inhalt);
                    sr.Close();
                    File.WriteAllText(temppfad, Entschlüsselterinhalt);
                }

   static string Entschlüsseln(string PW, string original)
    {
        using (RijndaelManaged myRijndael = new RijndaelManaged())
        {

            byte[] salt = Encoding.ASCII.GetBytes("0PQUX76U0adfaDADFexA888887Dz3J3X");
            Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(PW, salt);
            myRijndael.Key = key.GetBytes(myRijndael.KeySize / 8);
            myRijndael.IV = key.GetBytes(myRijndael.BlockSize / 8);

            // Decrypt the bytes to a string.
            byte[] originalbytes = Encoding.ASCII.GetBytes(original);
            string decrypted = DecryptStringFromBytes(originalbytes, myRijndael.Key, myRijndael.IV);

            //Display the original data and the decrypted data.
            Console.WriteLine("Decrypted:    " + decrypted);
            return decrypted;
        }
    }

Здесь возникает ошибка:

Сообщение об ошибке

Вот полный код:

static string DecryptStringFromBytes(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("Key");

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

        // Create an RijndaelManaged object
        // with the specified key and IV.
        using (RijndaelManaged rijAlg = new RijndaelManaged())
        {
            rijAlg.Key = Key;
            rijAlg.IV = IV;
            rijAlg.Mode = CipherMode.CBC;
            rijAlg.Padding = PaddingMode.Zeros;

            // Create a decrytor to perform the stream transform.
            ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.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;
    }

Приветствую

0
Paul 18 Сен 2018 в 16:36

2 ответа

Лучший ответ

Проблема в том, что вы путаетесь с зашифрованным текстом, делая это

StringBuilder s = new StringBuilder();
foreach (byte item in encrypted)
{
    s.Append(item.ToString("X2") + " ");
}

Как упоминал Дэмиен, вы должны вернуть массив байтов из static string Verschlüsseln(string PW, string original) и использовать File.WriteAllBytes для записи его в файл. Затем вы можете использовать File.ReadAllBytes, чтобы прочитать его из файла и передать byte [] в метод дешифрования, и вам не нужно ничего делать с кодированием.

1
Dave 18 Сен 2018 в 14:19

< Сильный > решаемые

Спасибо за вашу помощь, моя последняя ошибка была довольно простой, просто небольшая ошибка, вот решение той части, где была ошибка:

                    foreach (var file in d2.GetFiles("*.txt"))
                {
                    Console.WriteLine(file.FullName, file.Name);
                    string temppfad = file.FullName;
                    byte[] Inhaltsbyte = File.ReadAllBytes(temppfad);
                    string Entschlüsselterinhalt = Entschlüsseln(Password, Inhaltsbyte);
                    File.WriteAllText(temppfad, Entschlüsselterinhalt);
                }
0
Paul 19 Сен 2018 в 07:48