PGP,验证证书上的签名
PGP, verify signature on a certificate
我正在开发一个简单的 Java 代码,它使用 BouncyCastle v1.51 打开 PGP public 密钥并验证其中包含的签名。
目前,我能够加载 public 密钥并遍历所有签名。但是,验证总是 returns "false",即使我使用与生成签名的私钥相对应的 public 密钥测试签名。
这是我的代码:
try {
PGPPublicKey pkey = PGPEncryptionUtils.readPublicKey(new FileInputStream(new File(HOME_DIR + "to_verify")));
Iterator it = pkey.getSignatures();
PGPPublicKey signing_key = PGPEncryptionUtils.readPublicKey(
new FileInputStream(new File(HOME_DIR + "my_public_key")));
while (it.hasNext()) {
PGPSignature sig = (PGPSignature) it.next();
sig.init(new JcaPGPContentVerifierBuilderProvider().setProvider("BC"), signing_key);
// Here I'd expect to see at least a "true".
println(sig.verify());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (PGPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
readPublicKey
的代码取自此处:https://github.com/damico/OpenPgp-BounceCastle-Example/blob/master/src/org/jdamico/bc/openpgp/utils/PgpHelper.java。
我做错了什么?
谢谢!
我没有使用 PGPSignatures
的经验,但是要验证 public 密钥加密中的签名,您需要三件事:
- 签名。
- public键。
- 应该签名的原始邮件。
在您的示例中缺少 original message
,您需要提供通过 PGPSignature.update(byte[])
方法签名的 original message
,因此您的代码必须类似于:
while (it.hasNext()) {
PGPSignature sig = (PGPSignature) it.next();
sig.init(new >JcaPGPContentVerifierBuilderProvider().setProvider("BC"), signing_key);
// here you need the original message
sig.update("signature original message".getBytes());
// now you can try to verify!
println(sig.verify());
}
希望这对您有所帮助,
我正在开发一个简单的 Java 代码,它使用 BouncyCastle v1.51 打开 PGP public 密钥并验证其中包含的签名。 目前,我能够加载 public 密钥并遍历所有签名。但是,验证总是 returns "false",即使我使用与生成签名的私钥相对应的 public 密钥测试签名。
这是我的代码:
try {
PGPPublicKey pkey = PGPEncryptionUtils.readPublicKey(new FileInputStream(new File(HOME_DIR + "to_verify")));
Iterator it = pkey.getSignatures();
PGPPublicKey signing_key = PGPEncryptionUtils.readPublicKey(
new FileInputStream(new File(HOME_DIR + "my_public_key")));
while (it.hasNext()) {
PGPSignature sig = (PGPSignature) it.next();
sig.init(new JcaPGPContentVerifierBuilderProvider().setProvider("BC"), signing_key);
// Here I'd expect to see at least a "true".
println(sig.verify());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (PGPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
readPublicKey
的代码取自此处:https://github.com/damico/OpenPgp-BounceCastle-Example/blob/master/src/org/jdamico/bc/openpgp/utils/PgpHelper.java。
我做错了什么? 谢谢!
我没有使用 PGPSignatures
的经验,但是要验证 public 密钥加密中的签名,您需要三件事:
- 签名。
- public键。
- 应该签名的原始邮件。
在您的示例中缺少 original message
,您需要提供通过 PGPSignature.update(byte[])
方法签名的 original message
,因此您的代码必须类似于:
while (it.hasNext()) {
PGPSignature sig = (PGPSignature) it.next();
sig.init(new >JcaPGPContentVerifierBuilderProvider().setProvider("BC"), signing_key);
// here you need the original message
sig.update("signature original message".getBytes());
// now you can try to verify!
println(sig.verify());
}
希望这对您有所帮助,