X9.62 좌표의 압축을 푸는 방법

Nov 17 2020

내 메서드에 byte []를 전달하고 pubKey를 생성하려고합니다. 오류 모양을 보면 pubKey를 생성하기 전에 먼저 압축을 풀어야하는 것처럼 보입니다.

압축 된 좌표를 어떻게 디코딩 할 수 있습니까?

private static PublicKey getPublicKeyFromBytes(byte[] pubKey) throws NoSuchAlgorithmException, InvalidKeySpecException 
{
       
        ECPoint point = new ECPoint(new BigInteger(pubKey), BigInteger.ZERO);
        ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
        KeyFactory kf = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());
        ECNamedCurveSpec params = new ECNamedCurveSpec("prime256v1", spec.getCurve(), spec.getG(), spec.getN());
        ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(point, params);
        ECPublicKey pk = (ECPublicKey) kf.generatePublic(pubKeySpec);
        return pk;
}

에러 메시지:

Exception in thread "main" java.security.spec.InvalidKeySpecException: invalid KeySpec: x value invalid for SecP256R1FieldElement
    at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi.engineGeneratePublic(Unknown Source)

답변

1 RasmusFaber Nov 17 2020 at 17:04

당신이 경우 pubKey인 X9.62 압축 또는 압축되지 않은 점은 당신이 사용할 수있는 decodePoint()온 -method를 ECCurve:

ECPoint point = spec.getCurve().decodePoint(pubKey);