Я хотел бы подписать файл с помощью пары ключей 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
?
Большое спасибо! Я исправил эти два вопроса, и он работает отлично. Если вы хотите добавить свои баллы в качестве ответа, я буду отмечать его как решение. – SecStone
Не могли бы вы указать, что вы сделали, чтобы заставить SHA-256 работать в PERL, есть [этот другой вопрос] (http://stackoverflow.com/questions/12142381/is-there-a-perl-implementation-of-sha256withrsa) ... –