Расшифровка RSA выходит назад, Javascript -> Perl - PullRequest
1 голос
/ 02 марта 2011

Я пытаюсь взять пароль из формы, зашифровать его с помощью RSA в сценарии java и отправить форму.

Когда форма получена с помощью кода Perl, она расшифровывает пароль. Я смог получить java-скрипт и Perl, используя один и тот же ключ RSA, и я могу расшифровать сообщения, зашифрованные в java-скрипте с помощью java-скрипта, и сообщения, зашифрованные в Perl с помощью Perl.

Следующим шагом является шифрование в java-скрипте и дешифрование в Perl. После многих разочарований я почти на месте, но расшифрованная строка возвращается назад:

Clear Text Here!

Зашифровывается в Javascript и отправляется по почте. Затем Perl пытается расшифровать, и создается следующее

������������������������������������������������ereh txet raelC

Как видите, все наоборот. Странные символы - результат того, что библиотека javascript дополняет строку нулями.

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

Я использую пакет perl Crypt :: OpenSSL :: RSA; И javascript rsa и связанные математические библиотеки, написанные Дейвом Шапиро, найдены здесь: http://ohdave.com/rsa/

Библиотека javascript RSA возвращает свое значение в виде десятичного представления двоичного файла. Я передаю это в объект Crypt :: OpenSSL :: Bignum, чтобы преобразовать его обратно в двоичный код для использования в perl-коде.

Код шифрования:

function doEncryption(key, ptextID, ctextID) {
  $(ctextID).val("Encrypting...");
  $(ctextID).val(encryptedString(key, $(ptextID).val()));
}

И расшифровочный код:

sub java_decrypt {
  my $message = shift;
  my $rsa = shift;

    $rsa->use_no_padding();
    my @blocks = split ' ', $message;
    my $decmessage = "";
    foreach my $block (@blocks) {
      my $bitz = Crypt::OpenSSL::Bignum->new_from_decimal($block);
      $decmessage .= $rsa->decrypt($bitz->to_bin());
    }
    $rsa->use_pkcs1_oaep_padding();
    #$decmessage = reverse $decmessage;
    #$decmessage =~ s/\0//g;
    return($decmessage);
}

Две строки, закомментированные в конце, исправят проблемы с расшифровкой в ​​обратном направлении и дополнением, но я не знаю, доверяю ли я этому. Если он зашифрован в perl, он получается правильным способом, поэтому, если есть лучший способ решить эту проблему (переключить порядковый номер двоичной строки?), Я бы предпочел это.

Я пытался обменять порядок байтов с пакетом, но это только вознаградило меня бредом. И только в случае, если его спросят, конкатенация строк дешифрованного сообщения не вступает в игру, так как сообщение в настоящее время находится в одном 64-байтовом блоке.

1 Ответ

1 голос
/ 02 марта 2011

У вас есть веская причина не просто использовать простой алгоритм хеширования, такой как sha256, для шифрования всего сеанса через TLS (SSL), вместо того, чтобы пытаться сделать что-то слишком сложное с RSA на этом уровне?

Кроме того, у меня есть только мимолетное знакомство с Javascript, но я уверен, что он возвращает шестнадцатеричное значение, а не десятичное. Вы абсолютно уверены, что это десятичное число?

...