質問: 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);
回答: 前回の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" );