2016-11-11 26 views
3

ECDSA鍵を生成するためにbouncy castleを使用しようとしています。コードはJavaの観点からはうまくいくようです。しかし、ファイルをダンプしてデータを検証しようとすると、OpenSSLはデータのフォーマットが気に入らない。ECDSAを生成するbouncy castleで秘密鍵を返すと公開鍵が返される

調査の結果、弾力のある城が秘密鍵を公開鍵としてエンコードしていると考えました。ここで

は私のJavaコードです:

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

@jayはい、 '$ openssl ec -inform DER -in/my/path/private.key'は失敗します。 – Rodolfo

+2

バグはありません。それはJavaが出力するPKCS8形式で、あなたのopensslコマンドでは期待されていません。 –

答えて

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

関連する問題