Что не так с моей тройной оболочкой DES? - PullRequest
2 голосов
/ 30 марта 2010

кажется, что мой код добавляет 6 байт в файл результатов после вызова функции шифрования и расшифровки. я пробую это на файле MKV .. пожалуйста помогите

вот мой код

class TripleDESCryptoService : IEncryptor, IDecryptor
{
    public void Encrypt(string inputFileName, string outputFileName, string key)
    {
        EncryptFile(inputFileName, outputFileName, key);
    }

    public void Decrypt(string inputFileName, string outputFileName, string key)
    {
        DecryptFile(inputFileName, outputFileName, key);
    }

    static void EncryptFile(string inputFileName, string outputFileName, string sKey)
    {
        var outFile = new FileStream(outputFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);

        // The chryptographic service provider we're going to use
        var cryptoAlgorithm = new TripleDESCryptoServiceProvider();
        SetKeys(cryptoAlgorithm, sKey);

        // This object links data streams to cryptographic values
        var cryptoStream = new CryptoStream(outFile, cryptoAlgorithm.CreateEncryptor(), CryptoStreamMode.Write);

        // This stream writer will write the new file
        var encryptionStream = new BinaryWriter(cryptoStream);

        // This stream reader will read the file to encrypt
        var inFile = new FileStream(inputFileName, FileMode.Open, FileAccess.Read);
        var readwe = new BinaryReader(inFile);

        // Loop through the file to encrypt, line by line
        var date = readwe.ReadBytes((int)readwe.BaseStream.Length);


        // Write to the encryption stream
        encryptionStream.Write(date);


        // Wrap things up
        inFile.Close();
        encryptionStream.Flush();
        encryptionStream.Close();
    }

    private static void SetKeys(SymmetricAlgorithm algorithm, string key)
    {
        var keyAsBytes = Encoding.ASCII.GetBytes(key);
        algorithm.IV = keyAsBytes.Take(algorithm.IV.Length).ToArray();
        algorithm.Key = keyAsBytes.Take(algorithm.Key.Length).ToArray();
    }

    static void DecryptFile(string inputFilename, string outputFilename, string sKey)
    {
        // The encrypted file
        var inFile = File.OpenRead(inputFilename);

        // The decrypted file
        var outFile = new FileStream(outputFilename, FileMode.OpenOrCreate, FileAccess.ReadWrite);

        // Prepare the encryption algorithm and read the key from the key file
        var cryptAlgorithm = new TripleDESCryptoServiceProvider();

        SetKeys(cryptAlgorithm, sKey);

        // The cryptographic stream takes in the encrypted file
        var encryptionStream = new CryptoStream(inFile, cryptAlgorithm.CreateDecryptor(), CryptoStreamMode.Read);

        // Write the new unecrypted file
        var cleanStreamReader = new BinaryReader(encryptionStream);
        var cleanStreamWriter = new BinaryWriter(outFile);
        cleanStreamWriter.Write(cleanStreamReader.ReadBytes((int)inFile.Length));
        cleanStreamWriter.Close();
        outFile.Close();
        cleanStreamReader.Close();
    }
}

Ответы [ 4 ]

2 голосов
/ 30 марта 2010

Ваш код не добавляет шесть байтов, 3DES округляется до полного размера блока. Вот как работают блочные шифры. Вы увидите это только в зашифрованном тексте, но не в дешифрованном открытом тексте.

Опять же, не нужно беспокоиться, блочные шифры должны дополнить ваш открытый текст до следующего размера блока, прежде чем он сможет зашифровать открытый текст. Когда вы расшифровываете зашифрованный текст, отступы удаляются.

Кроме того, я сделал быструю проверку кода, и у вас есть ошибка в коде - вы используете один и тот же ключ для IV и ключ, и вам действительно следует использовать разные данные. Поэтому я бы добавил еще один аргумент в DecryptFile (), EncryptFile () и SetKeys (), чтобы учесть другой IV.

0 голосов
/ 30 марта 2010

Tiple-DES - это 64-битный блочный шифр. Не анализируя ваш код, я предполагаю, что ваши данные не выровнены по 64-битному формату и дополнены режимом PKCS7 по умолчанию .

0 голосов
/ 30 марта 2010

Я не знаю, какой режим шифрования вы используете, но режимы ECB и CBC добавляют биты заполнения в конце последнего блока, чтобы увеличить его размер до 64 бит. Может быть, отсюда и твои байты?

0 голосов
/ 30 марта 2010

Я просмотрел код и не нашел никаких проблем, но я не очень знаком с классами, которые вы использовали, поэтому я вполне могу ошибаться. Вместо этого я дам несколько общих советов, касающихся любой ошибки:

Попробуй выследить проблему. Трудно найти ошибку во многих строках кода. Создайте кратчайший код, отображающий некорректное поведение.

Например, попробуйте записать строку в выходной поток. Размер правильный?

  • Если нет, то вы почти обнаружили проблему - что-то не так с записью файла, шифрование не имеет никакого отношения к проблеме.
  • Если да, продолжайте добавлять функциональность небольшими шагами, пока не обнаружите проблему.

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

Кроме того, старайтесь всегда иметь чистые начальные условия, т.е. убедитесь, что записанный файл был удален. Попробуйте свой код на разных входах и посмотрите, не будет ли каждый раз получаться один и тот же результат или есть различия.

Edit:

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

Тогда вы можете спросить: «Почему TripeDES добавляет до 7 байтов к входу?» что было бы гораздо более ясным вопросом, чем "Что не так с моей тройной оболочкой DES?" - и вы наверняка получите ответ на этот простой вопрос менее чем за минуту!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...