2017-04-05 10 views
1

브라우저에 웹 푸시 알림을 보내려고하는데 성공적으로 구독 할 수 있습니다. 나는 "타원 곡선 Diffie-Hellman 공개 키 P-256 곡선"으로 구독 객체를 얻습니다.P-256 DH java 문자열을 java PublicKey로 변환하십시오.

이 문자열을 Java의 공개 키로 변환하려고하지만 잘못된 키 형식 예외가 계속 발생합니다.

String publicK = "BBoN_OkTfE_0uObues82qHr96z8x3nepYoUwCBoftFDS_Vgx2MUHN1vAFxc1eDiyDrvmZ2bQ4sJq3F8Qz71RWI0="; 
    byte[] publicBytes = publicK.getBytes(); 
    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes); 
    KeyFactory keyFactory = KeyFactory.getInstance("DiffieHellman"); 
    PublicKey pubKey = keyFactory.generatePublic(keySpec); 

누군가가 이것 좀 도와 줘요 수 :

여기에 내가 노력하고있어 코드는? 여기에 암호화 멍청한 놈 :/

답변

0

내 코드의 경우, 내가 자바 1.7BouncyCastle 라이브러리를 사용했다.

<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() 메서드를 통해 얻은 Gn과 같은 매개 변수를 가지고 있으며 ECNamedCurveTable.getParameterSpec()을 사용하여 얻을 수있는 "표준 미리 정의 된"커브 (P-256과 같은)가 있다는 것을 알고 있습니다.

  • 원하는 경우 math details을 모두 볼 수 있습니다. list of different standard curves도 있으며 보안 수준이 높은 것으로 간주됩니다.

  • ECPublicKeyPublicKey를 확장, 그래서 당신은 단지 PublicKey

+0

덕분에 많은처럼 사용할 수 있습니다. 그게 효과가 있었지만 간단한 이론적 설명 만하면 될까요? – aayush456

+0

반갑습니다. 저는 수학/암호 전문가는 아니지만 대답에 몇 가지 의견을 추가했습니다. 더 많은 정보가 필요하면 알려주세요. –