我正在尝试将装甲的ECC gpg密钥转换为相应的
java类
ECPrivateKey / EcpublicKey.
ECPrivateKey / EcpublicKey.
要生成我正在使用的密钥对:gpg –expert –full-generate-key
然后选择(9)ECC和ECC(或(10)ECC(仅签名))
然后选择(3)NIST P-256
导致:
-----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWUdzwhMIKoZIzj0DAQcCAwQkAvZC1PIJ8ke1myyKhNny9vN78TIYo2MuAOY+ F38L9S3+Za9cKV/iIHOqfapbMoqdSmSnqDkevwQSr5MF2UOXtCJzaWduZWNjIChF Q0Mgc2lnbiBvbmx5KSA8c3NAc3MuY28+iJAEExMIADgWIQRiC+kefVkjnjKovKy5 XANFl5+n1gUCWUdzwgIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRC5XANF l5+n1mzGAQDsgutymxDTTXPKFfpFFVp4fxacx1MSqxP71gNJYjguXwD8CEXD20Vm aU1WMi2jU7JC6oJn94Y4vWHwTLOU1zmQ19o= =swfS -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PRIVATE KEY BLOCK----- lHcEWUdzwhMIKoZIzj0DAQcCAwQkAvZC1PIJ8ke1myyKhNny9vN78TIYo2MuAOY+ F38L9S3+Za9cKV/iIHOqfapbMoqdSmSnqDkevwQSr5MF2UOXAAD9FhS2HZoWOyIi l9nj+WPa9S1o50jM5bNIRALzcyS8SgoP97Qic2lnbmVjYyAoRUNDIHNpZ24gb25s eSkgPHNzQHNzLmNvPoiQBBMTCAA4FiEEYgvpHn1ZI54yqLysuVwDRZefp9YFAllH c8ICGwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQuVwDRZefp9ZsxgEA7ILr cpsQ001zyhX6RRVaeH8WnMdTEqsT+9YDSWI4Ll8A/AhFw9tFZmlNVjIto1OyQuqC Z/eGOL1h8EyzlNc5kNfa =qHBB -----END PGP PRIVATE KEY BLOCK-----
如何从这种装甲文本格式获得有效的java.security.interfaces.ECPrivateKey和java.security.interfaces.EcpublicKey java类?
我的最终目标是以下列方式签名:
String createSignatureFromJson(String jsonPayload,byte[] privateKey) { Payload payload = new Payload(jsonPayload) def key = privateKeyParse(privateKey) JWSSigner signer = new ECDSASigner((ECPrivateKey)key) JWSHeader header = new JWSHeader.Builder(JWSAlgorithm.ES256).build() JWSObject jwsObject = new JWSObject(header,payload) jwsObject.sign(signer) jwsObject.signature }
解决方法
如果您只是传递’私钥块’,这将提取ECPrivateKey:
private static ECPrivateKey privateKeyParse(byte[] privateKey) throws Exception { InputStream pgpIn = PGPUtil.getDecoderStream(new ByteArrayInputStream(privateKey)); PGPObjectFactory pgpFact = new PGPObjectFactory(pgpIn,new JcaKeyFingerprintCalculator()); PGPSecretKeyRing pgpSecRing = (PGPSecretKeyRing)pgpFact.nextObject(); PGPSecretKey pgpSec = pgpSecRing.getSecretKey(); PGPPrivateKey pgpPriv = pgpSec.extractPrivateKey(null); return (ECPrivateKey)new JcaPGPKeyConverter().getPrivateKey(pgpPriv); }
要回答关于如何获得’privateKey’的评论问题,如果整个:
-----BEGIN PGP PRIVATE KEY BLOCK----- ... -----END PGP PRIVATE KEY BLOCK-----
InputStream fIn = new BufferedInputStream(new FileInputStream(...)); byte[] privateKey = org.bouncycastle.util.io.Streams.readAll(fIn);