Почему C # не может расшифровать выходные данные из Perl Crypt::Rijndael?

StackOverflow https://stackoverflow.com/questions/569871

Вопрос

Файл был зашифрован с помощью Perl.Первоначальные попытки расшифровки не увенчались успехом, и теперь я пытаюсь выяснить, происходит ли какой-либо сбой (требуются некоторые другие настройки)

Код Duff Perl:

use strict;

use Crypt::Rijndael;

my $key ='...';

my $rcipher = Crypt::Rijndael->new ($key, Crypt::Rijndael::MODE_CBC());

undef $/;
my $encrypted = <>;

print $rcipher->decrypt($encrypted);

Реализация дешифрования на C#

        CryptoStream decryptor = null;
        StreamReader srDecrypt = null;
        FileStream fsIn = null;
        RijndaelManaged rijndaelCipher = null;
        string fileContents;
        try
        {
            rijndaelCipher = new RijndaelManaged();
            rijndaelCipher.Mode = CipherMode.CBC;
            rijndaelCipher.Key = Encoding.UTF8.GetBytes(Password);
            rijndaelCipher.IV = Encoding.UTF8.GetBytes(Password);
            rijndaelCipher.Padding = PaddingMode.None;

            fsIn = new FileStream(FilePath, FileMode.Open);
            decryptor = new CryptoStream(fsIn, rijndaelCipher.CreateDecryptor(), CryptoStreamMode.Read);
            srDecrypt = new StreamReader(decryptor);
            fileContents = srDecrypt.ReadToEnd();
        }
        finally
        {
            if (decryptor != null)
                decryptor.Close();
            if (fsIn != null)
                fsIn.Close();
            if (srDecrypt != null)
                srDecrypt.Close();

            if (rijndaelCipher != null)
                rijndaelCipher.Clear();
        }

Как должен читаться код Perl

binmode OUTF;

my $key ="..."; # Your secret key

my $rcipher = Crypt::Rijndael->new ($key, Crypt::Rijndael::MODE_CBC());

$rcipher->set_iv($key); # You may wish this IV to be something different from the Secret Key

my $plaintext = "Please encrypt me"; # Your string to be encrypted

if(length($plaintext) % 16 != 0 ) {

$plaintext .= ' ' x (16 - (length($plaintext) % 16)); } 

my $rencrypted = $rcipher->encrypt($plaintext);
Это было полезно?

Решение

Я являюсь сопровождающим Perl's Склеп::Рейндаэль.Я не писал исходный код, но я стараюсь заставить его работать, когда у других людей он терпит неудачу.

Я получил еще один подобный отчет в качестве RT #27632.Проблема в модуле заключалась в подписанном int, который должен был быть беззнаковым int.Последняя версия Склеп::Рейндаэль, 1.07, должно быть исправлено.Какую версию вы используете?

Кроме того, некоторые из этих проблем зависят от платформы.Если вы заглянете в код rijndael.h в дистрибутиве, вы увидите обручи, через которые я должен пройти, чтобы получить правильные размеры шрифта для различных платформ.Я полагаю, вы используете Windows (но не Cygwin).Какую версию Windows вы используете?

Как отмечено в тикете RT, первым шагом является шифрование одних и тех же сообщений одинаковыми векторами инициализации с использованием обоих Склеп::Рейндаэль и реализация на C #.Вы должны получить тот же результат.Если вы не получаете тот же криптотекст, возникает проблема.

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

Спасибо,

Другие советы

Я предполагаю, что вы запускаете это в Windows.Вы имеете дело с двоичными данными, поэтому вам нужно принять это во внимание.В Perl вы должны использовать binmode ( бинмод ).Я думаю, вам нужно использовать BinaryReader в C # (но я не программист на C #, поэтому не уверен).

У вас одинаковые размеры капельниц?Я спрашиваю, поскольку у меня были похожие проблемы с преобразованием шифрования Perl в C #, где размер IV в Perl отличался.

Ваш размер ключа равен 256 (битам), но ключ, который у вас есть в коде Perl, равен 3 байтам, 12 битам, которые, если я помню, Perl заполняет пробелом.

Вы пробовали зашифровать / расшифровать простую строку?С помощью этого вы могли бы убедиться, что в шифровании есть что-то из (а не при чтении файла).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top