Почему C# не может расшифровать вывод из Perl's Crypt::Rijndael?
Файл был зашифрован Perl. Первоначальные попытки расшифровки не увенчались успехом, и теперь я пытаюсь выяснить, происходит ли какое-либо hoojoo (требуются некоторые другие настройки)
Дафф код 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 Code должен читать
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);
4 ответа
Я поддерживаю Perl's Crypt::Rijndael. Я не писал оригинальный код, но я пытаюсь заставить его работать, когда он не работает для других людей.
Я получил другой отчет, такой как RT # 27632. Проблема в модуле заключалась в подписанном int, который должен был быть unsigned int. В последней версии Crypt::Rijndael, 1.07, должно быть исправлено. Какую версию вы используете?
Кроме того, некоторые из этих проблем зависят от платформы. Если вы посмотрите в коде rijndael.h в дистрибутиве, вы увидите обручи, через которые я должен перейти, чтобы получить правильный размер шрифта для различных платформ. Я полагаю, что вы на Windows (но не Cygwin). Какую версию Windows вы используете?
Как отмечено в билете RT, первым шагом является шифрование одних и тех же сообщений с одинаковыми векторами инициализации с использованием как Crypt::Rijndael, так и реализации C#. Вы должны получить тот же результат. Если вы не получите тот же криптекст, есть проблема.
Дайте мне знать, как это работает для вас, чтобы я мог отслеживать это как ошибку Crypt::Rijndael, если мне нужно.
Спасибо,
У вас есть те же размеры IV? Я спрашиваю, поскольку у меня были подобные проблемы с преобразованием шифрования Perl в C#, где размер IV был другим в Perl.
Ваш KeySize равен 256 (битам), но ключ, который у вас есть в коде Perl, составляет 3 байта, 12 бит, которые, если я помню, Perl дополняют его пробелом.
Я предполагаю, что вы запускаете это на Windows. Вы имеете дело с двоичными данными, поэтому вы должны принять это во внимание. В Perl вы должны использовать binmode. Я думаю, что вам нужно использовать BinaryReader в C# (но я не программист C#, поэтому я не уверен).
Вы пытались зашифровать / расшифровать простую строку? С этим вы можете убедиться, что в шифровании есть что-то (а не чтение файла).