如何使用 Bouncycastle 验证 PGP 分离签名
How to verify PGP detached signature using Bouncycastle
我想使用 Bouncycastle 解析和验证 OpenPGP 分离签名。签名将是这样的:
-----BEGIN PGP SIGNATURE-----
Version: fast-openpgp
wsBcBAABCAAQBQJfRm9jCRDzeoZuOgUYnQAAVkoIAEReZ6Pp3SimYKbH+JHzwW8q
LiWeQIPNatFwDQHgD4ipT9aXMaObnXXl83KUQ5lPx8Bw77BxParpUbtCRNTrWoU5
XZ1ikfqzmeVEJrk4YsNKDiBpvjbyF86F8KSkXhwdLWSm1e6yemnXKcTHg2L13AiS
6TIqXXbcRmFF7RTO4DQrjira2YYlW8eHPIcCmOq0YjR4Qpz+R/+3BlfV2TAcL/sd
SeKAczgvdP6CS6be1rPA0nlgw9T853BpgqplQVM30pUhVlni7ga1YRzENm6Qic5A
uEbmPyunim2WHytPuLQq+BQvAq+Wrr2kiM7DhyvYFihDNdFWW67Y+fSlgPxOi/8=
=QKpc
-----END PGP SIGNATURE-----
下面是我尝试在 Kotlin 中创建 CMSSignedData 的方法:
fun verifyDetached(signatureString: String, dataString: String): Boolean {
val dataBytes = dataString.toByteArray()
val signatureBytes = signatureString.toByteArray()
val processableDataBytes = CMSProcessableByteArray(dataBytes)
val ci = ContentInfo.getInstance(ASN1Sequence.fromByteArray(signatureBytes))
val cms = CMSSignedData(processableDataBytes, ci)
...
}
当我将整个签名块传递给函数(包括 -----BEGIN PGP SIGNATURE-----)时,我得到 java.io.IOException: unknown tag 13 encountered
。
当我删除签名包装器并将签名内容传入函数时,我得到 java.io.IOException: Extra data detected in stream at org.bouncycastle.asn1.ASN1Primitive.fromByteArray
。
当我直接将 signatureBytes
传递给 CMSSignedData 构造函数时,我得到 java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DLApplicationSpecific
.
我应该如何使用 Bouncycastle 验证这种签名?
CMS 与 PGP 完全不同且无关。对于 PGP,请使用 bcpg 中 PGP 的 BouncyCastle 实现,而不是 bcpkix 中的 CMS 实现。参见例如 and .
我想使用 Bouncycastle 解析和验证 OpenPGP 分离签名。签名将是这样的:
-----BEGIN PGP SIGNATURE-----
Version: fast-openpgp
wsBcBAABCAAQBQJfRm9jCRDzeoZuOgUYnQAAVkoIAEReZ6Pp3SimYKbH+JHzwW8q
LiWeQIPNatFwDQHgD4ipT9aXMaObnXXl83KUQ5lPx8Bw77BxParpUbtCRNTrWoU5
XZ1ikfqzmeVEJrk4YsNKDiBpvjbyF86F8KSkXhwdLWSm1e6yemnXKcTHg2L13AiS
6TIqXXbcRmFF7RTO4DQrjira2YYlW8eHPIcCmOq0YjR4Qpz+R/+3BlfV2TAcL/sd
SeKAczgvdP6CS6be1rPA0nlgw9T853BpgqplQVM30pUhVlni7ga1YRzENm6Qic5A
uEbmPyunim2WHytPuLQq+BQvAq+Wrr2kiM7DhyvYFihDNdFWW67Y+fSlgPxOi/8=
=QKpc
-----END PGP SIGNATURE-----
下面是我尝试在 Kotlin 中创建 CMSSignedData 的方法:
fun verifyDetached(signatureString: String, dataString: String): Boolean {
val dataBytes = dataString.toByteArray()
val signatureBytes = signatureString.toByteArray()
val processableDataBytes = CMSProcessableByteArray(dataBytes)
val ci = ContentInfo.getInstance(ASN1Sequence.fromByteArray(signatureBytes))
val cms = CMSSignedData(processableDataBytes, ci)
...
}
当我将整个签名块传递给函数(包括 -----BEGIN PGP SIGNATURE-----)时,我得到 java.io.IOException: unknown tag 13 encountered
。
当我删除签名包装器并将签名内容传入函数时,我得到 java.io.IOException: Extra data detected in stream at org.bouncycastle.asn1.ASN1Primitive.fromByteArray
。
当我直接将 signatureBytes
传递给 CMSSignedData 构造函数时,我得到 java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DLApplicationSpecific
.
我应该如何使用 Bouncycastle 验证这种签名?
CMS 与 PGP 完全不同且无关。对于 PGP,请使用 bcpg 中 PGP 的 BouncyCastle 实现,而不是 bcpkix 中的 CMS 实现。参见例如