JAVA中的验证签名问题
我已经实现了一个示例代码来生成哈希、签名和验证签名,如下所示: 但是,当我试图验证签名时,它抛出了一个错误。它无法验证签名 我是否遵循了正确的程序。请确实提出建议 我需要的实际场景是我想计算一个文件的散列,对散列签名并解密签名,这样我就可以得到可以用原始散列验证的散列 你能给我推荐一下要使用的API吗?如果可能的话,请给我一个示例程序JAVA中的验证签名问题,java,Java,我已经实现了一个示例代码来生成哈希、签名和验证签名,如下所示: 但是,当我试图验证签名时,它抛出了一个错误。它无法验证签名 我是否遵循了正确的程序。请确实提出建议 我需要的实际场景是我想计算一个文件的散列,对散列签名并解密签名,这样我就可以得到可以用原始散列验证的散列 你能给我推荐一下要使用的API吗?如果可能的话,请给我一个示例程序 public class Temp { public static void main(String args[]) throws NoSuchAlgor
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
。通过这种方式,您可以知道算法的哪个部分有故障您从未告诉签名
使用签名密钥
或签名私钥
?你用什么密钥签名?