내 코드의 경우, 내가 자바 1.7 및 BouncyCastle 라이브러리를 사용했다.
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
또는 BouncyCastle 사이트의 항아리를 다운로드 : 당신이 받는다는을 사용하는 경우, 당신의 의 pom.xml에 추가 할 수 있습니다. 이것은 유용한 정보 (타원 곡선 키를 처리하는 클래스 포함)가 많은 Java 용 암호화 API입니다.
공개 키를 읽고 객체로 변환하는 코드는 다음과 같습니다
는
import java.security.KeyFactory;
import java.security.Security;
import java.security.interfaces.ECPublicKey;
import java.security.spec.ECPoint;
import java.security.spec.ECPublicKeySpec;
import org.bouncycastle.jce.ECNamedCurveTable;
import org.bouncycastle.jce.ECPointUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
import org.bouncycastle.jce.spec.ECNamedCurveSpec;
import org.bouncycastle.util.encoders.Base64;
// you need to add the BouncyCastle provider to use its functionalities
Security.addProvider(new BouncyCastleProvider());
String publicK = "BBoN_OkTfE_0uObues82qHr96z8x3nepYoUwCBoftFDS_Vgx2MUHN1vAFxc1eDiyDrvmZ2bQ4sJq3F8Qz71RWI0=";
// publicK is encoded in base64, so you need to decode it first
byte[] publicBytes = Base64.decode(publicK.getBytes());
// spec for P-256 curve
ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
// create a KeyFactory with ECDSA (Elliptic Curve Diffie-Hellman) algorithm and use BouncyCastle as the provider
KeyFactory kf = KeyFactory.getInstance("ECDSA", BouncyCastleProvider.PROVIDER_NAME);
// code below just creates the public key from the bytes contained in publicK
// using the curve parameters (spec variable)
ECNamedCurveSpec params = new ECNamedCurveSpec("prime256v1", spec.getCurve(), spec.getG(), spec.getN());
ECPoint point = ECPointUtil.decodePoint(params.getCurve(), publicBytes);
ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(point, params);
ECPublicKey pk = (ECPublicKey) kf.generatePublic(pubKeySpec);
System.out.println(pk.toString());
출력 :
EC Public Key
X: 1a0d00e9137c4034b8e6ee7acf36a87afdeb3f31de77a9628530081a1fb450d2
Y: 15831d8c507375bc01717357838b20ebbe66766d0e2c26adc5f10cfbd51588d
주 :
내가 ' 엠 타원 곡선 키 뒤에있는 모든 수학을 인식하지 못합니다. 단지 기본 개념입니다. 커브는 getG()
과 getN()
메서드를 통해 얻은 G
과 n
과 같은 매개 변수를 가지고 있으며 ECNamedCurveTable.getParameterSpec()
을 사용하여 얻을 수있는 "표준 미리 정의 된"커브 (P-256과 같은)가 있다는 것을 알고 있습니다.
원하는 경우 math details을 모두 볼 수 있습니다. list of different standard curves도 있으며 보안 수준이 높은 것으로 간주됩니다.
ECPublicKey
는 PublicKey
를 확장, 그래서 당신은 단지 PublicKey
덕분에 많은처럼 사용할 수 있습니다. 그게 효과가 있었지만 간단한 이론적 설명 만하면 될까요? – aayush456
반갑습니다. 저는 수학/암호 전문가는 아니지만 대답에 몇 가지 의견을 추가했습니다. 더 많은 정보가 필요하면 알려주세요. –