2012-03-20 90 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()始终报告虚假。我已经检查了这些东西:

  • datadataSignature是正确读取
  • PUBLICKEY_MODPUBLICKEY_EXP是正确的
  • getPublicKey()回报具有正确的属性
  • 私钥和公钥是一部分的公钥同一对

有谁知道如何正确验证文件? signature是否正确实例化?

+0

非常感谢!我解决了这两个问题,它完美地工作。如果您想将您的观点作为答案添加,我会将其标记为解决方案。 – SecStone 2012-03-21 13:01:03

+0

你能指出你做了什么来获得SHA-256为PERL工作,有[这个其他问题](http://stackoverflow.com/questions/12142381/is-there-a-perl-implementation-of-sha256withrsa )... – 2012-08-27 18:23:59

回答

2

你的第一个线索可能是错误的是你永远不会告诉Perl什么哈希函数使用,但你告诉Java使用SHA256。在Perl方面你有很多工作要做。此外,Crypt :: RSA的默认填充方案似乎是PSS,而对于Java,它是PKCSv1.0

相关问题