2012-05-10 4 views
2

У меня есть файл с зашифрованными учетными данными с RC4, Кусок кода, отвечающего писать такие учетные данные в файл выглядит следующим образом:В Perl, в то время как с помощью RC4 я не могу получить обратно зашифрованный текст

sub dummyFunction() { 
    # Useless stuff for the scope of the problem 
    # ... 
    my $dbHost = "localhost"; 
    my $passphrase = "123"; # For example purposes, logic is different. 
    my $cipher = Crypt::RC4->new($passphrase); 
    return unpack('H*',$cipher->RC4($dbHost)); 
} 

так что часть кода возвращает что-то вроде: 3F9FDCE3891C6B8851 , но если я попробовать следующее:

sub anotherDummyFunction() { 
    my $ciphered_text = &dummyFunction(); 
    my $passphrase = "123"; 
    my $cipher = Crypt::RC4->new($passphrase); 
    print $cipher->RC4(pack('H*',$ciphered_text)); 
} 

Я ожидал увидеть localhost, но вместо этого, я получаю кучу байт, так как я получил бы вернуть исходный текст?

Я уже проверил с помощью дешифратора RC4 онлайн, с моей кодовой фразой и моей кодировкой с шестнадцатеричным кодированием, а дешифратор RC4 онлайн возвращает localhost, поэтому я уверен, что зашифрованная строка верна.

Спасибо!

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

+2

Не показывайте нам пример кода, который работает, и сообщите нам, что он не работает в каком-либо другом контексте. Единственное, что мы знаем, это то, что проблема * не * в том, что вы нам показали. – hobbs

+0

Я буду использовать свои умственные навыки отладки, чтобы сказать, что некоторые пробелы попали в '$ ciphered_text' в вашем реальном скрипте. 'pack ('H *', $ ciphered_text)' does ** not ** pack только шестнадцатеричные цифры; он захватывает младшие 4 бита каждого символа в '$ ciphered_text', включая пробельные символы. – cjm

+0

Я уже нашел корень проблемы. Сначала я подумал, что это пробел, но это было не так. Я шифровал другую строку прямо перед этим, но тот был зашифрован правильно. У меня было прозрение, и я подумал, что RC4 может быть кешированием, поэтому я его отменил, и это сработало. – ILikeTacos

ответ

0

Если кто встречает этот раз:

Если у вас есть что-то вроде:


test.pl


#!/usr/bin/perl 
use strict; 
use warnings; 
use Crypt::RC4; 

my $cipher = Crypt::RC4->new("passphrase123"); 
print unpack('H*',$cipher->RC4("encrypt-me"))."\n"; 
print unpack('H*',$cipher->RC4("encrypt-me"))."\n"; 

Вы заметите, что вы будете в конечном с двумя различными закодированными строками:

./test.pl 
25d2aa557cccc3951074 
1e87a5db7830a0b1cabd 

Для того, чтобы избежать такого поведения я сделал:

undef $cipher

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

Если вы попробуете это:

my $cipher = Crypt::RC4->new("passphrase123"); 
print unpack('H*',$cipher->RC4("encrypt-me"))."\n"; 
undef($cipher); 
$cipher = Crypt::RC4->new("passphrase123"); 
print unpack('H*',$cipher->RC4("encrypt-me"))."\n"; 

Вы получите ту же строку:

./test.pl 
25d2aa557cccc3951074 
25d2aa557cccc3951074 

это также может быть завернуты в подпроцедуры, чтобы избежать и удаления определений объекта снова и снова.

sub encryptString() 
{ 
    my ($string,$passphrase) = @_; 
    my $cipher = Crypt::RC4->new($passphrase); 
    return unpack('H*',$cipher->RC4($string)); 
} 
+1

Прочитав это, наткнулся на это. Замечание perl: 'undef ($ cipher);' является ненужным отвлечением. Удалите его, и пример запускается с показанным выше показанием ('25d2aa557cccc3951074' дважды). Второй «новый» вызов создает «чистый» '$ cipher', поэтому он имеет тот же контент/вывод, что и первый. – Ashley

+1

Спасибо @Ashley. Я помню, как публиковал это во второй день работы с Perl. С тех пор я так многому научился! – ILikeTacos