2014-12-14 3 views
0

Программа в Perl шифрует штраф, но дешифрование выдает все 0. Почему это происходит? Я использовал тот же метод для шифрования/расшифровки строки.Мое дешифрование в Perl выходит все 0's

$string = "This is an encryption program";  # any length 
$keystr = "948D5E5";        # length <= 8 

print "original : ", $string, "\n"; 

$enc = hexcrypt($string, $keystr); 
print "encrypted : ", $enc, "\n"; 

$dec = hexcrypt($enc, $keystr); 
print "decrypted : ", $dec, "\n"; 

sub hexcrypt { 
    my (@pac, $pacstr, $l, $pac, $pacenc, $format, $pacencstr); 

    my @string = split(//, @_[0]);    # the string to encrypt 
    my $keystr = @_[1];       # the key 
    my $key  = hex($keystr);     # the key in binary 
    my $keylength = length($keystr); 
    my $encstr = "";        # accumulator for returned string 

    do { 
    @pac  = splice(@string, 0, $keylength); # take out a packet of digits (or less at end) 
    $pacstr = join("", @pac);     # into a string 
    $l   = length($pacstr); 
    $pac  = hex($pacstr);     # convert to a 32-bit integer 
    $pacenc = $pac^($key >> ($keylength * 4 - 4 * $l)); # shift key right if $l < $keylength, and XOR 
    $format = "%0" . sprintf("%.d", $l) . "X"; # we want the leading zeros 
    $pacencstr = sprintf($format, $pacenc);  # back into a string 

    $encstr .= $pacencstr;      # add to encrypted string 
    } while scalar @string > 0; 

    return $encstr; 
} 
+0

@Beth; Вы уверены, что вы дешифруете, это похоже на второй проход шифрования. И что сказал Артджом, в строках 4 и 6. есть некоторые проблемы с цитированием и интервалом. –

+0

Это была еще одна опечатка в строках 4 и 6. Если это второй пропуск шифрования, зачем ему приходилось все 0. – Beth

+0

'$ format ="% 0 ". sprintf ("% .d", $ l). «X»; '- не должно быть' $ l * 2'? – tobyink

ответ

1

переменная $pacstr представляет собой кусок строки, подлежащий кодированию, с длиной, равной или меньшей, чем длина ключа.

Здесь ваш ключ 948D5E5, который имеет длину семь символов, поэтому первое значение $pacstr это первые семь символов $string, который является This is.

Так что ваше утверждение

$pac = hex($pacstr) 

делает

$pax = hex('This is') 

который возвращает ноль, потому что нет никаких веских шестнадцатеричных цифр в строке.

Конечно, вы должны встретить призывы use strict и use warnings в начале каждый программы Perl? Если вы следовали этим советам здесь вы увидели бы следующее

Illegal hexadecimal digit 'T' ignored at E:\Perl\source\xmls.pl line 33. 
Illegal hexadecimal digit ' ' ignored at E:\Perl\source\xmls.pl line 33. 
Illegal hexadecimal digit 'r' ignored at E:\Perl\source\xmls.pl line 33. 
Illegal hexadecimal digit ' ' ignored at E:\Perl\source\xmls.pl line 33. 
Illegal hexadecimal digit 'm' ignored at E:\Perl\source\xmls.pl line 33. 

который является большого ключом к проблеме.

 Смежные вопросы

  • Нет связанных вопросов^_^