2012-03-20 7 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()は常にfalseを報告します。私はすでに確認され、これらの事:

  • datadataSignatureは正しく
  • PUBLICKEY_MODPUBLICKEY_EXPが正しい
  • getPublicKey()ある読み込まれ
  • 正しい属性は、秘密鍵と公開鍵は一部でありのPublicKeyを返します同じペアのうちのどれか

ファイルを正しく確認する方法を知っている人はいますか? signatureは正しくインスタンス化されていますか?

+0

ありがとうございます!私はこれらの2つの問題を修正し、それは完全に動作します。ポイントを回答として追加したい場合は、それを解決策としてマークします。 – 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です。

関連する問題