2016-11-11 3 views
3

탄력성을 사용하여 ECDSA 키를 생성하려고합니다. 이 코드는 Java 관점에서 잘 작동하는 것 같습니다. 하지만 파일을 덤프하고 데이터 유효성 검사를 시도 할 때 OpenSSL은 데이터 형식을 좋아하지 않습니다.ECDSA 생성하기 탄력성이있는 개인 키가 공개 키를 반환합니다.

약간의 연구 끝에, 탄력성이 공개 키로 개인 키를 인코딩하고 있다고 생각했습니다. 여기

내 자바 코드 :

public class Test { 
    public static void main(String[] args) { 
     Security.addProvider(new BouncyCastleProvider()); 
     System.out.println("Starting..."); 
     String name = "prime256v1"; 
     try { 
      KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECDSA", BouncyCastleProvider.PROVIDER_NAME); 
      kpg.initialize(new ECGenParameterSpec(name)); 
      KeyPair keyPair = kpg.generateKeyPair();  
      FileOutputStream writer = new FileOutputStream("private.key"); 
      writer.write(keyPair.getPrivate().getEncoded()); 
      writer.close(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

private.key이 유효 DER 형식으로 생성되는 파일; 난은 OpenSSL을 사용하여 ECDSA 키를 생성하려면 다음 명령을 실행하면, 나는 다음과 같은 ASN.1을 얻을, 비교를 위해

$ openssl asn1parse -inform DER -in /my/path/private.key 
    0:d=0 hl=3 l= 147 cons: SEQUENCE   
    3:d=1 hl=2 l= 1 prim: INTEGER   :00 
    6:d=1 hl=2 l= 19 cons: SEQUENCE   
    8:d=2 hl=2 l= 7 prim: OBJECT   :id-ecPublicKey 
    17:d=2 hl=2 l= 8 prim: OBJECT   :prime256v1 
    27:d=1 hl=2 l= 121 prim: OCTET STRING  [HEX DUMP]: <hex data> 

: 나는 다음과 같은 명령을 실행할 때, 키의 ASN.1 구조를 볼 수 있습니다 구조 :

$ openssl ecparam -name prime256v1 -genkey -noout -outform DER -out private.key 
$ openssl asn1parse -inform DER -in private.key 
    0:d=0 hl=2 l= 119 cons: SEQUENCE   
    2:d=1 hl=2 l= 1 prim: INTEGER   :01 
    5:d=1 hl=2 l= 32 prim: OCTET STRING  [HEX DUMP]: <hex data> 
    39:d=1 hl=2 l= 10 cons: cont [ 0 ]   
    41:d=2 hl=2 l= 8 prim: OBJECT   :prime256v1 
    51:d=1 hl=2 l= 68 cons: cont [ 1 ]   
    53:d=2 hl=2 l= 66 prim: BIT STRING   

그래서, 내가 놓친 게 있나요 내 질문

  • 추측?
  • 또는 알려진 버그입니까?
  • 어쨌든 주변을 둘러 볼 수 있습니까?
+0

"OpenSSL은 데이터 형식이 마음에 들지 않습니다." 당신이 정교 할 수 있니? 어떤 조치가 실패합니까? – jay

+0

@ 예,'$ openssl ec -inform DER -in/my/path/private.key'는 실패합니다. – Rodolfo

+2

버그는 없으며 Java가 openssl 명령에서 예상하지 않는 PKCS8 형식을 출력합니다. –

답변

0

Java 출력은 인코딩 된 형식의 키입니다. 시도해보십시오 :

private String getPrivateKeyAsHex(PrivateKey privateKey) { 

    ECPrivateKey ecPrivateKey = (ECPrivateKey) privateKey; 
    byte[] privateKeyBytes = new byte[PRIVATE_KEY_LENGTH]; 
    writeToStream(privateKeyBytes, 0, ecPrivateKey.getS(), PRIVATE_KEY_LENGTH); 

    String hex = Hex.toHexString(privateKeyBytes); 

    logger.debug("Private key bytes: " + Arrays.toString(privateKeyBytes)); 
    logger.debug("Private key hex: " + hex); 

    return hex; 
} 

private String getPublicKeyAsHex(PublicKey publicKey) { 

    ECPublicKey ecPublicKey = (ECPublicKey) publicKey; 
    ECPoint ecPoint = ecPublicKey.getW(); 

    byte[] publicKeyBytes = new byte[PUBLIC_KEY_LENGTH]; 
    writeToStream(publicKeyBytes, 0, ecPoint.getAffineX(), PRIVATE_KEY_LENGTH); 
    writeToStream(publicKeyBytes, PRIVATE_KEY_LENGTH, ecPoint.getAffineY(), PRIVATE_KEY_LENGTH); 

    String hex = Hex.toHexString(publicKeyBytes); 

    logger.debug("Public key bytes: " + Arrays.toString(publicKeyBytes)); 
    logger.debug("Public key hex: " + hex); 

    return hex; 
} 

private void writeToStream(byte[] stream, int start, BigInteger value, int size) { 
    byte[] data = value.toByteArray(); 
    int length = Math.min(size, data.length); 
    int writeStart = start + size - length; 
    int readStart = data.length - length; 
    System.arraycopy(data, readStart, stream, writeStart, length); 
} 
+0

나는 정직하게 이것에 무엇을 해야할지 모르겠다. 나는 그것을 내 코드에 꽂았고 16 진수 (예상했던대로)를 보여 주지만 openssl로는 파싱 할 수 없다. – Rodolfo

관련 문제