2011-08-23 52 views
0

我已经实现了一个示例代码来生成哈希和签名并验证签名,如下所示: 但是,当iam尝试验证签名时,它抛出false,它无法验证签名。JAVA验证签名问题

我是遵照正确的程序。请不要建议

实际情况我需要的是我要计算一个文件的哈希,签署哈希和解密签名,这样我就可以得到哈希从而可以用原始散列验证。

你可以请建议我APIS使用,如果可能的话,一个示例程序来做到这一点。

public class Temp { 
    public static void main(String args[]) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, SignatureException{ 

     KeyPairGenerator signkeygen = KeyPairGenerator.getInstance("RSA"); 
     signkeygen.initialize(2048);//The argument specifies the length of the key in bits 
     KeyPair signkey = signkeygen.generateKeyPair(); 
     PublicKey sign_publicKey = signkey.getPublic(); 
     PrivateKey sign_privateKey = signkey.getPrivate(); 

     String test = "hai"; 

     Signature mysign = Signature.getInstance("SHA1withRSA"); 
     mysign.update(test.getBytes()); 
     byte[] byteSignedData = mysign.sign(); 
     Signature vSign = Signature.getInstance("SHA1withRSA"); 
     vSign.initVerify(sign_publicKey); 
     vSign.update(byteSignedData); 

     boolean signStatus = vSign.verify(byteSignedData); 
     System.out.println(signStatus); 
     ... 
+0

您从不告诉'Signature'使用'signkey'或'sign_privateKey'?你与什么关键签约? –

回答

2

据我所知,你需要初始化一个signingobject指定你与你的私有密钥签名。到目前为止,您正在使用公钥进行验证,但未使用私钥进行签名,这会在尝试验证时导致您错误。

public class Temp { 
    public static void main(String args[]) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, SignatureException{ 

    KeyPairGenerator signkeygen = KeyPairGenerator.getInstance("RSA"); 
    signkeygen.initialize(2048);//The argument specifies the length of the key in bits 
    KeyPair signkey = signkeygen.generateKeyPair(); 
    PublicKey sign_publicKey = signkey.getPublic(); 
    PrivateKey sign_privateKey = signkey.getPrivate(); 



    Signature mysign = Signature.getInstance("SHA1withRSA"); 
    mysign.initSign(sign_privateKey); //Added this line 
    byte[] byteSignedData = mysign.sign(); 
    Signature vSign = Signature.getInstance("SHA1withRSA"); 
    vSign.initVerify(sign_publicKey); 


    boolean signStatus = vSign.verify(byteSignedData); 
    System.out.println(signStatus); 

这应该返回true。另外,当试图找出哪部分代码有问题时,对所有例外情况都不是个好主意。最好赶上他们,并让每个人产生不同的println。通过这种方式,您可以知道算法的哪部分出现故障