2009-02-20 2 views
1

Файл был зашифрован Perl. Первоначальные попытки Ошибка расшифровки и сейчас я пытаюсь выяснить, есть ли hoojoo происходит (некоторые другие параметры, необходимые)Почему C# не может расшифровывать вывод из Perl's Crypt :: Rijndael?

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); 
+0

Возможно ли, что код Perl не устанавливает IV? –

+0

А, хорошо поймать. Он не вызывает set_iv в коде Perl. –

ответ

11

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

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

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

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

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

Спасибо,

+1

Привет, Брайан, Спасибо за сообщение. FYI мы - Windows Server 2008 (и 2003)/.Net Framework 3.5/X64. –

4

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

2

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

4

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

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