JAVA中的VerifySignature问题

时间:2011-08-23 11:53:08

标签: java

我已经实现了一个示例代码来生成Hash并签名和验证签名,如下所示: 但是当我试图验证签名时,它会让我误报。它无法验证签名。

我是否遵循了正确的程序。请做好建议

我需要的实际场景是我想计算文件的哈希值,签名哈希并解密签名,这样我就可以获得可以用原始哈希验证的哈希值。

请您建议我使用API​​S,如果可能的话,请提供样本程序。

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);
        ...

1 个答案:

答案 0 :(得分:2)

据我所知,您需要初始化一个签名对象,以指定您使用私钥进行签名。截至目前,您正在使用公钥进行验证,但未使用私有密钥进行验证,这会在尝试验证时向您发出错误信息。

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。此外,当试图找出代码的哪个部分有问题时,throw所有异常都不是一个好主意。最好抓住它们并让每个人生成不同的println。通过这种方式,您可以判断算法的哪个部分存在错误