2016-12-12 6 views
1

Java Cardで使用するためにこれらの192-ECDSAカーブパラメータをどのように変換できますか?JavaカードのECDSAカーブパラメータを変換する方法

p = 6277101735386680763835789423207666416083908700390324961279 
n = 6277101735386680763835789423176059013767194773182842284081 
SEED = 3045ae6f c8422f64 ed579528 d38120ea e12196d5 
c = 3099d2bb bfcb2538 542dcd5f b078b6ef 5f3d6fe2 c745de65 
b = 64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1 
Gx = 188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012 
Gy = 07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811 
+0

スタックオーバーフローへようこそ!最初に[ツアー](http://stackoverflow.com/tour)にアクセスし、[よくある質問をする方法](http://stackoverflow.com/help/how-to-ask)を学んで[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例を参照してください。私たちがあなたを助けてくれるのは簡単です。あなたは何をしていますか? –

+0

ECカーブの名前を教えてください。それは 'Prime192v1'ですか?これらの値はどこで見つかりましたか? – vojta

答えて

3

値をJava Cardのパラメータにマップする必要があります。これは、命名規則が不足していると思われるよりも困難です。さらに、パラメータの一部は小数ですが、Java Cardの場合は16進数にする必要があります。

はあなたのパラメータを指定してinitをしたいのは、JavaカードECKeyためのステップにより、このステップを解決してみましょう:

フィールドプライムp

は、キーのkey.setFieldFPに対応しています。あなたの値は10進数ですが、あなたはそれが16進数である必要があります。

private final static byte[] fp = new byte[] { 
     (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFE, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF 
    }; 

注文n

は、キーのkey.setRに対応しています。あなたの値は10進数ですが、あなたはそれが16進数である必要があります。

private final static byte[] r = new byte[] { 
     (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x99, (byte)0xDE, (byte)0xF8, (byte)0x36, (byte)0x14, (byte)0x6B, (byte)0xC9, (byte)0xB1, (byte)0xB4, (byte)0xD2, (byte)0x28, (byte)0x31 
    }; 

係数a

効果prime192v1で計算を行うために-3(モジュロp)に設定されています。これはあなたが知る必要がある事実です。 16進数、それは次のとおりです。

private final static byte[] a = new byte[] { 
     (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFE, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFC 
    }; 

係数b

それは、Javaカードでkey.setBあるので、簡単です。あなたは、両方の座標を連結非圧縮形式に変換して付加する必要があるため、

private final static byte[] b = new byte[] { 
     (byte)0x64, (byte)0x21, (byte)0x05, (byte)0x19, (byte)0xE5, (byte)0x9C, (byte)0x80, (byte)0xE7, (byte)0x0F, (byte)0xA7, (byte)0xE9, (byte)0xAB, (byte)0x72, (byte)0x24, (byte)0x30, (byte)0x49, (byte)0xFE, (byte)0xB8, (byte)0xDE, (byte)0xEC, (byte)0xC1, (byte)0x46, (byte)0xB9, (byte)0xB1 
    }; 

ジェネレータポイントG

はトリッキーです:あなたは16進文字列=不要変換としてそれを持っていますプレフィックス04(非圧縮形式のインジケータ)。一部のカードは、他のフォーマットをサポートしていますが、それは保証されませんので、uncompressed form.があなたの座標は=すでに必要は変換進数ではない使用することが賢明である:

private final static byte[] g = new byte[] { 
     (byte)0x04, (byte)0x18, (byte)0x8D, (byte)0xA8, (byte)0x0E, (byte)0xB0, (byte)0x30, (byte)0x90, (byte)0xF6, (byte)0x7C, (byte)0xBF, (byte)0x20, (byte)0xEB, (byte)0x43, (byte)0xA1, (byte)0x88, (byte)0x00, (byte)0xF4, (byte)0xFF, (byte)0x0A, (byte)0xFD, (byte)0x82, (byte)0xFF, (byte)0x10, (byte)0x12, (byte)0x07, (byte)0x19, (byte)0x2B, (byte)0x95, (byte)0xFF, (byte)0xC8, (byte)0xDA, (byte)0x78, (byte)0x63, (byte)0x10, (byte)0x11, (byte)0xED, (byte)0x6B, (byte)0x24, (byte)0xCD, (byte)0xD5, (byte)0x73, (byte)0xF9, (byte)0x77, (byte)0xA1, (byte)0x1E, (byte)0x79, (byte)0x48, (byte)0x11 
    }; 

補因子H

はのkey.setKに対応しますキー。通常、このパラメータは省略され、デフォルト値1が使用されます。

キー初期化

:上記のように

提供はあなたがあなたのECkeyこのようinitにすることができ、private static final byte配列などのパラメータを宣言した:あなたが疑問に思うかもしれ

key.setFieldFP(fp, (short)0, (short)fp.length); 
key.setR(r, (short)0, (short)r.length); 
key.setA(a, (short)0, (short)a.length); 
key.setB(b, (short)0, (short)b.length); 
key.setG(g, (short)0, (short)g.length); 

を何SEEDし、 cの値は、Java Cardのパラメータをまったく計算するために使用していないため、値とは何ですか?

SEEDは、他のパラメータを生成するために使用されるランダムな値です。 SHA-1ハッシュはSEEDから計算されました。あなたの表記ではcです。値aおよびbは、cに由来した。

全体EC暗号の最も問題のポイントです:NISTが真にランダムとしてシードを選んだのですか?​​。結果的に得られるカーブが何らかの形で「簡単」になる可能性があるため、復号化や署名偽造のために利点を得るために選択した可能性があります。

+0

@OrangeDog Java Cardの 'BigInteger'は保証されていません...' byte'と 'short'はすべて使用できます。 – vojta

+2

@OrangeDog Java CardとJavaは、2つの異なる言語です。構文は多かれ少なかれ同じですが、ライブラリは異なります。あなたがNISTを信頼していない場合は – vojta

+2

... [javadocツール](https://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacard/security/package-summary.html)を見てください曲線は、脳プールは、Javaカードを効率的に働く良い代替案です –

関連する問題