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
だから、私は私の質問は
- あると思いますが、私が行方不明です何がありますか?
- これは既知のバグですか?
- とにかく周りを回ることはありますか?
"OpenSSLはデータのフォーマットが嫌いです。"あなたは精緻化できますか?アクションは失敗しますか? – jay
@jayはい、 '$ openssl ec -inform DER -in/my/path/private.key'は失敗します。 – Rodolfo
バグはありません。それはJavaが出力するPKCS8形式で、あなたのopensslコマンドでは期待されていません。 –