2012-03-20 2 views
0

Я хотел бы подписать файл с помощью пары ключей RSA. Для этого у меня быть_наст этот скрипт на Perl:Взаимодействие между Crypt :: RSA (Perl) и java.security.Signature (Java)

#!/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() возвращает ОткрытыйКлюч, который имеет правильные атрибуты
  • закрытый ключ и открытый ключ являются частью той же пары

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

+0

Большое спасибо! Я исправил эти два вопроса, и он работает отлично. Если вы хотите добавить свои баллы в качестве ответа, я буду отмечать его как решение. – SecStone

+0

Не могли бы вы указать, что вы сделали, чтобы заставить SHA-256 работать в PERL, есть [этот другой вопрос] (http://stackoverflow.com/questions/12142381/is-there-a-perl-implementation-of-sha256withrsa) ... –

ответ

2

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