Java数字签名 - 不一致的签名

时间:2013-04-07 18:24:04

标签: java security digital-signature dsa

我一直在使用Java安全API,并且正在遵循有关如何生成数字签名的教程:http://docs.oracle.com/javase/tutorial/security/apisign/gensig.html

问题是当我运行代码时,即使私钥和要签名的数据保持不变,输出签名也总是不同的。我提供了以下代码,我曾经运行过。 “priv”是一个保存私钥的文件,用于对数据进行签名:“hello”。

基本上两个输出显示相同的数据:“hello”用相同的键签名但它给出了不同的输出。我期待得到相同的输出。此外,当我再次运行程序时,签名数据与初始运行再次不同。任何帮助将非常感激。提前致谢

public static void main(String[] args) {
   try {
      FileInputStream privfis;
      privfis = new FileInputStream("priv");
      byte[] encKey = new byte[privfis.available()];
      // obtain the encoded key in the file
      privfis.read(encKey);
      privfis.close();
      PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec( encKey);
      KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
      PrivateKey priv = keyFactory.generatePrivate(privKeySpec);
      Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
      dsa.initSign(priv);
      String message = "hello";
      System.out.println(getHexString(message.getBytes()));
      dsa.update(message.getBytes());
      byte[] realSig = dsa.sign();
      System.out.println(getHexString(realSig));
      dsa.update(message.getBytes()); 
      System.out.println(getHexString(message.getBytes()));
      byte[] realSig2 = dsa.sign();
      System.out.println(getHexString(realSig2));
      } catch (Exception e) {
         System.err.println("Caught exception " + e.toString());
         e.printStackTrace();
      }
   }

   private static String getHexString(byte[] b) {
      String result = "";
      for (int i = 0; i < b.length; i++) {
         result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
      }
      return result;
   }        
}

0 个答案:

没有答案