Java ECC encoded Key too large

后端 未结 2 481
我寻月下人不归
我寻月下人不归 2021-01-14 19:25

I am new to the EC-encryption and have some struggle with it. I am using Java 8 and the BouncyCatle provider. The Question I have now is: when I generate an EC-KeyPair with

2条回答
  •  说谎
    说谎 (楼主)
    2021-01-14 20:03

    The code (modified from BouncyCastle) below can work with any public key (not only secp521r1)

    
    import org.bouncycastle.asn1.ASN1ObjectIdentifier;
    import org.bouncycastle.asn1.DERNull;
    import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
    import org.bouncycastle.asn1.x9.X962Parameters;
    import org.bouncycastle.asn1.x9.X9ECParameters;
    import org.bouncycastle.asn1.x9.X9ECPoint;
    import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
    import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
    import org.bouncycastle.jcajce.provider.asymmetric.util.EC5Util;
    import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
    import org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import org.bouncycastle.jce.spec.ECNamedCurveSpec;
    import org.bouncycastle.math.ec.ECCurve;
    
    import java.math.BigInteger;
    import java.security.KeyFactory;
    import java.security.Security;
    import java.security.spec.ECParameterSpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.Base64;
    
    public class TestCompressionEncoded {
    
        static X962Parameters getDomainParametersFromName(ECParameterSpec ecSpec, boolean compress) {
            X962Parameters x962Param;
            if (ecSpec instanceof ECNamedCurveSpec) {
                ASN1ObjectIdentifier var3 = ECUtil.getNamedCurveOid(((ECNamedCurveSpec)ecSpec).getName());
                if (var3 == null) {
                    var3 = new ASN1ObjectIdentifier(((ECNamedCurveSpec)ecSpec).getName());
                }
    
                x962Param = new X962Parameters(var3);
            } else if (ecSpec == null) {
                x962Param = new X962Parameters(DERNull.INSTANCE);
            } else {
                ECCurve var5 = EC5Util.convertCurve(ecSpec.getCurve());
                X9ECParameters var4 = new X9ECParameters(var5, new X9ECPoint(EC5Util.convertPoint(var5, ecSpec.getGenerator()), compress), ecSpec.getOrder(), BigInteger.valueOf((long)ecSpec.getCofactor()), ecSpec.getCurve().getSeed());
                x962Param = new X962Parameters(var4);
            }
            return x962Param;
        }
    
        static byte[] encodeKeyWithCompression(BCECPublicKey x) throws Exception {
            AlgorithmIdentifier var1 = new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, getDomainParametersFromName(x.getParams(), true));
            byte[] var2 = x.getQ().getEncoded(true);
            return KeyUtil.getEncodedSubjectPublicKeyInfo(var1, var2);
        }
    
        public static void main(String...args) throws Exception {
            Security.addProvider(new BouncyCastleProvider());
            String publicKey = "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELPqrW2JAXKTbjfh9M3X3b85Uje7T0r2gu7qKPmmyagGFnfckwVFpKg10+S2ttJYVUB4q+kPpnJg/YHV5xMnSLA==";
            KeyFactory fact = KeyFactory.getInstance("ECDSA", "BC");
            BCECPublicKey bcePubKey = (BCECPublicKey) fact.generatePublic(new X509EncodedKeySpec( Base64.getDecoder().decode(publicKey)));
    
            System.out.println("Uncompressed encoded value: " + publicKey);
            System.out.println("Compressed encoded value: " + Base64.getEncoder().encodeToString(encodeKeyWithCompression(bcePubKey)));
        }
    }
    
    

    The output (for prime256v1)

    Uncompressed encoded value: MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELPqrW2JAXKTbjfh9M3X3b85Uje7T0r2gu7qKPmmyagGFnfckwVFpKg10+S2ttJYVUB4q+kPpnJg/YHV5xMnSLA==
    Compressed encoded value: MDYwEAYHKoZIzj0CAQYFK4EEAAoDIgACLPqrW2JAXKTbjfh9M3X3b85Uje7T0r2gu7qKPmmyagE=
    
    

提交回复
热议问题