Perché C # non possono decodificare l'output del Perl Crypt :: Rijndael?
-
05-09-2019 - |
Domanda
Un file è stato crittografato da Perl. tentativi Decrypt iniziale è stata respinta e sto ora cercando di accertare se vi sia una hoojoo succedendo (alcune altre impostazioni richieste)
Duff codice 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 # decrittografia Attuazione
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();
}
Come codice Perl dovrebbe leggere
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);
Soluzione
Sono il manutentore di Perl Crypt :: Rijndael . Non ho scritto il codice originale, ma cerco di farlo funzionare quando non riesce per gli altri.
Ho ricevuto un altro rapporto come questo come RT # 27632 . Il problema nel modulo era un int firmato che avrebbe dovuto essere un unsigned int. L'ultima versione di Crypt :: Rijndael , 1,07, dovrebbe avere la correzione. Quale versione stai usando?
Inoltre, alcuni di questi problemi sono dipendente dalla piattaforma. Se si guarda nel codice rijndael.h nella distribuzione, vedrete i cerchi devo saltare attraverso per ottenere le dimensioni giusto tipo per varie piattaforme. Immagino che siete su Windows (ma non Cygwin). Quale versione di Windows stai usando?
Come indicato nel biglietto RT, il primo passaggio è quello di crittografare gli stessi messaggi con gli stessi vettori di inizializzazione utilizzando sia Cripta :: Rijndael e l'implementazione C #. Si dovrebbe ottenere lo stesso risultato. Se non si ottiene lo stesso crypttext, c'è un problema.
Fammi sapere come questo funziona per voi in modo da poter tenere traccia di come un Crypt :: Rijndael bug se ne ho bisogno.
Grazie,
Altri suggerimenti
Sto assumendo si esegue questo su Windows. Hai a che fare con dati binari, quindi è necessario tenerne conto. In Perl, è necessario utilizzare binmode . Penso che è necessario utilizzare BinaryReader in C # (ma io non sono un programmatore C #, quindi non sono sicuro).
Avete ottenuto lo stesso IV della misura? Mi sto chiedendo come ho avuto problemi simili con Perl per C # di conversione di crittografia, in cui la dimensione IV era diverso in Perl.
Il tuo KeySize è di 256 (bit), ma la chiave che avete in codice Perl è 3 byte, 12 bit, che se non ricordo Perl pastiglie con lo spazio bianco.
Hai provato a codificare / decodificare una semplice stringa? Con che si potrebbe verificare che la ci sia qualcosa da nella crittografia (e non con la lettura del file).