private void writeObject( ObjectOutputStream out) throws IOException { out.defaultWriteObject(); out.writeObject(this.getEncoded()); } }
private DERBitString getPublicKeyDetails(BCECPublicKey pub) { try { SubjectPublicKeyInfo info = SubjectPublicKeyInfo.getInstance(ASN1Primitive.fromByteArray(pub.getEncoded())); return info.getPublicKeyData(); } catch (IOException e) { // should never happen return null; } }
/** * 将ECC公钥对象转换为X509标准的字节流 * * @param pubKey * @return */ public static byte[] convertECPublicKeyToX509(ECPublicKeyParameters pubKey) { ECDomainParameters domainParams = pubKey.getParameters(); ECParameterSpec spec = new ECParameterSpec(domainParams.getCurve(), domainParams.getG(), domainParams.getN(), domainParams.getH()); BCECPublicKey publicKey = new BCECPublicKey(ALGO_NAME_EC, pubKey, spec, BouncyCastleProvider.CONFIGURATION); return publicKey.getEncoded(); }
@Test public void valuesFromGenerator() throws Exception { String dataForSigningStr = "BD6OAA=="; byte[] dataForSigning = Base64.decodeBase64(dataForSigningStr); logger.info("dataForSigning length : " + dataForSigning.length); KeyPair keyPair = KeyCodec.getKeyPair(); BCECPrivateKey priv = (BCECPrivateKey) keyPair.getPrivate(); BCECPublicKey pub = (BCECPublicKey) keyPair.getPublic(); byte[] pubByte = pub.getEncoded(); byte[] privByte = priv.getEncoded(); pub = (BCECPublicKey) KeyCodec.getPubKey(pubByte); priv = (BCECPrivateKey) KeyCodec.getPrivKey(privByte); logger.info("pubByte : " + pubByte.length + " privByte : " + privByte.length); BigInteger[] signatureGen = NamedCurve.signAndFromatToRS(priv, dataForSigning); logger.info("Signature : " + signatureGen); byte[] signatureGenAsn1 = Asn1.getEncoded(signatureGen); logger.info("signatureGenAsn1 length : " + signatureGenAsn1.length + " = " + Base64.encodeBase64URLSafeString(signatureGenAsn1)); byte[] r = signatureGen[0].toByteArray(); byte[] s = signatureGen[1].toByteArray(); logger.info("s length : " + s.length + " r length : " + r.length); String signatureStr = "PAM5wG8-yVfZtE3LhK8WEDCEQCgFIZSK2AxQ0KGBRIzGyzcre6R6SrWlobsW_W_mYGYMJlU-3Y0JOeNTGuNOng=="; byte[] signature = Base64.decodeBase64(signatureStr); logger.info("Signature length : " + signature.length); signatureGen = Asn1.decodeToBigIntegerArray(signatureGenAsn1); assertTrue(NamedCurve.verify(KeyCodec.getKeyAsRawBytes(pub), dataForSigning, signatureGen)); }