Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA中的验证签名问题_Java - Fatal编程技术网

JAVA中的验证签名问题

JAVA中的验证签名问题,java,Java,我已经实现了一个示例代码来生成哈希、签名和验证签名,如下所示: 但是,当我试图验证签名时,它抛出了一个错误。它无法验证签名 我是否遵循了正确的程序。请确实提出建议 我需要的实际场景是我想计算一个文件的散列,对散列签名并解密签名,这样我就可以得到可以用原始散列验证的散列 你能给我推荐一下要使用的API吗?如果可能的话,请给我一个示例程序 public class Temp { public static void main(String args[]) throws NoSuchAlgor

我已经实现了一个示例代码来生成哈希、签名和验证签名,如下所示: 但是,当我试图验证签名时,它抛出了一个错误。它无法验证签名

我是否遵循了正确的程序。请确实提出建议

我需要的实际场景是我想计算一个文件的散列,对散列签名并解密签名,这样我就可以得到可以用原始散列验证的散列

你能给我推荐一下要使用的API吗?如果可能的话,请给我一个示例程序

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

据我所知,您需要初始化signingobject以指定您正在使用私钥进行签名。到目前为止,您正在使用公钥进行验证,但没有使用私钥进行签名,这将在尝试验证时抛出一个false

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

这应该是真的。另外,当试图找出代码的哪一部分出错时,抛出所有异常也不是一个好主意。最好捕获它们并让它们生成不同的
println
。通过这种方式,您可以知道算法的哪个部分有故障

您从未告诉
签名
使用
签名密钥
签名私钥
?你用什么密钥签名?