Взаимодействие между Crypt :: RSA (Perl) и java.security.Signature (Java) - PullRequest
0 голосов
/ 21 марта 2012

Я хочу подписать файл с помощью пары ключей RSA.Для этого у меня есть этот Perl-скрипт:

#!/usr/bin/perl

use Crypt::RSA;

my $data = ... # File contents

my $rsa = new Crypt::RSA; 
my $key = new Crypt::RSA::Key::Private(Filename => "stackoverflow.priv", Password => "*****");
my $signature = $rsa->sign(Message => $data, Key => $key, Armour => 0);

# Write signature to file

На стороне клиента я бы хотел использовать следующую функцию Java для проверки файла:

private static final String PUBLICKEY_MOD = "190343051422614110006523776876348493...";
private static String PUBLICKEY_EXP = "65537";

public boolean check() {
     byte[] data = ... // Data
     byte[] dataSignature = ... // Signature (as calculated in the Perl script)

     Signature signature = Signature.getInstance("SHA256withRSA");

     signature.initVerify(getPublicKey());
     signature.update(data);
     return signature.verify(dataSignature);
}

private PublicKey getPublicKey() {
    RSAPublicKeySpec spec = new RSAPublicKeySpec(new BigInteger(PUBLICKEY_MOD), new BigInteger(PUBLICKEY_EXP));
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePublic(spec);
}

Однако, check() всегда сообщает ложь.Эти вещи, которые я уже проверил:

  • data и dataSignature правильно прочитаны
  • PUBLICKEY_MOD и PUBLICKEY_EXP верны
  • getPublicKey() возвратPublicKey, который имеет правильные атрибуты
  • , закрытый ключ и открытый ключ являются частью одной пары

Кто-нибудь знает, как правильно проверить файл?signature правильно инстанцируется?

1 Ответ

2 голосов
/ 22 марта 2012

Ваш первый признак того, что что-то может быть не так, заключается в том, что вы никогда не говорите Perl, какую хеш-функцию использовать, но вы указываете Java использовать SHA256. У вас много работы на стороне Perl. Кроме того, схема дополнения по умолчанию для Crypt :: RSA выглядит как PSS, тогда как для Java это PKCSv1.5

...