Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

何故変わらないの?

署名について勉強しています。

署名を生成して認証は問題ないのですが、どうしてもgetQ()、getP()、getG()の値が変わりません、getY()については実行毎に変わるので正しいと思うのですがすが?
値が変わらないのはあたりまえなのでしょうか?

/*DSA初期化*/
KeyPairGeneratorkeyGen  = KeyPairGenerator.getInstance("DSA");
keyGen.initialize(1024, new SecureRandom());
KeyPair kp = keyGen.generateKeyPair();
DSAPrivateKey priKey = (DSAPrivateKey)kp.getPrivate();
DSAPublicKey pubKey = (DSAPublicKey)kp.getPublic();

/*DSA keyの生成*/
Signature ds = Signature.getInstance("SHA1withDSA");
ds.initSign(priKey);
DSAParams dsakey = (DSAParams)priKey.getParams();
        
/*署名データの生成 */
String orig = "1234567890123456789";
byte[] data = orig.getBytes();
ds.update(data);
byte[] sign = ds.sign();
        
/*署名データの認証確認 */
ds.initVerify(pubKey);
ds.update(data);
boolean verifies = ds.verify(sign); // true or false
        
/*各keyの入手 */
String keyY=pubKey.getY().toString(16);
String keyG=dsakey.getG().toString(16);
String keyP=dsakey.getP().toString(16);
String keyQ=dsakey.getQ().toString(16);

4

回答

3251

閲覧

4件の回答

評価

0

Javaのセキュリティ関連はあまり分かりませんが。
http://java.sun.com./j2se/1.5.0/ja/docs/ja/guide/security/HowToImplAProvider.html#DefaultKPGParms
にあるように1024ビットで作成した場合は同じ値になるようです。
プライベートキーの値となるprikey.getX()は実行ごとに変化するので
問題はないと思うのですが、独自の値を設定したい場合には
KeyPairGenerator#initialize(AlgorithmParameterSpec)
で設定するようです。

評価

0

crowさんありがとうございます。
KeyXデータを使い、同じ結果になるか試しているため返事が送れ失礼しました。

まだ、Javaを理解しておらず、DSPPrivateKeySpecの実装ができないため、いまだにKeyXが設定できず結果は得られていませんがもう少しトライしてみます。

評価

0

前回のKeyPairで生成した時のKeyX、KeyY、KeyP、KeyG、KeyQ、の値を使い署名したのですが、KeyPairの時の署名データと違います。
また、各Keyは同じなのに実行のたびに署名データが異なります。

署名の際に上記のKey以外は使用しないと思うのですが何故署名データが変わるのでしょうか。
いろいろ調べたのですが、どう調べてもでてきません。

よろしくお願いします

/*--------------------------
    DSA初期化
--------------------------*/
String stx = "43d1cc8eb9408f6c080a8d65b8336c9a29005b69";
String stg = "f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d0782675159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e13c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243bcca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a";
String stp = "fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b76b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c7";
String stq = "9760508f15230bccb292b982a2eb840bf0581cf5";
String sty = "d2c0dd60f7ed8177f9feac19764848dfe3a5ef95b086de29a53ccc9064f97319c8381e2ee2ac0987998629a2119d7ca42d8111f7637991702f8fc6037c694bbd4973ab8c81c3773ba6df15160ecbe4e658ba04bd83edf16845e6867e0bce1e5b496272a3c1a6ea4f3d50b4e3f329496c4ed63e241faa125d92069f98c37e4676";

BigInteger _keyX = new BigInteger(stx, 16);
BigInteger _keyY = new BigInteger(sty, 16);
BigInteger _keyP = new BigInteger(stp, 16);
BigInteger _keyG = new BigInteger(stg, 16);
BigInteger _keyQ = new BigInteger(stq, 16);
    
DSAPrivateKeySpec priKeySpec = new DSAPrivateKeySpec(_keyX, _keyP, _keyQ, _keyG);
DSAPublicKeySpec pubKeySpec = new DSAPublicKeySpec(_keyY, _keyP, _keyQ, _keyG);
        
System.out.println("\nKeyX: " + priKeySpec.getX().toString(16) + "\n" );
            
/*--------------------------
    DSA keyの生成
----------------------------*/
KeyFactory keyFactory = KeyFactory.getInstance("DSA");    //鍵のペアジェネレータオブジェクトの獲得
PrivateKey priKey = keyFactory.generatePrivate(priKeySpec);
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
Signature sha = Signature.getInstance("SHA1withDSA");
sha.initSign(priKey);
        
/*--------------------------
    署名データの生成
---------------------------*/
sha.update(data) ;
byte[] sign = sha.sign() ;
    
System.out.println("\nKeyX: " + priKeySpec.getY().toString(16) + "\n" );
System.out.println("\nKeyY: " + pubKeySpec.getY().toString(16) + "\n" );

評価

0

本当ですね。
同じ鍵とデータでも署名は作成の度に変わるんですね。
署名がそういう仕様になっているとは知りませんでした。

署名の値が毎回変わるのはおそらくSignature#initSignメソッドに
おいて乱数が使用されているからだと思います。
ソースで確認していませんがSecureRandomオブジェクトを引数に
取らない方のSignature#initSignもメソッド内で乱数を生成して
使用していると思います。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。