2014-04-26 31 views
0

我需要验证我的数据到数字签名中的数据,我如何在它们之间进行比较。 在此代码中验证由公钥和原始签名解密的签名。如何在数字签名中验证我的数据?

  1. 代公钥和女贞密钥和签名。
  2. 阅读我的数据。
  3. 对此代码进行哈希处理。
  4. 读取签名。
  5. 比较签名和我的数据//我在这一步有问题想要比较我的数据和签名。

    public static void verify() { 
         BufferedReader in = new BufferedReader(new FileReader("EndSignatuer.txt")); 
         FileInputStream keyfis = new FileInputStream("EndSignatuer.txt"); 
         byte[] Signen = new byte[keyfis.available()]; 
         keyfis.read(Signen); 
         keyfis.close(); 
         String signatureString = new String(Signde); 
         System.out.println("SignatureString:" + signatureString); 
         len = Signde.length; 
         X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey); 
         KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN"); 
         PublicKey pubKey = keyFactory.generatePublic(pubKeySpec); 
         Signature sig = Signature.getInstance("SHA1withDSA", "SUN"); 
         sig.initVerify(pubKey); 
    

    }

我需要:

public static void verify (byte[] mydata) { 
........ 
sig.initVerify(mydata); 
} 

回答

0

首先,验证签名不涉及 “通过公共密钥解密”。对于RSA来说,签名和验证确实会使用类似类似的操作来进行加密和解密,这让很多人困惑地描述它们,但实际上它们是不同的。对于这里使用的DSA和ECDSA,差别更大:没有涉及加密或解密的内容,只有签名和验证。另外,与许多加密对象一样,签名实际上是随机字节,而不是有效字符。转换为字符串并尝试显示它最多会产生垃圾,并且可能会弄乱显示。在需要限制为有效字符(如S/MIME和XML)的情况下,通常将其转换为base64或hex,并在需要时转换为二进制。

这就是说,你很近。您可以像使用公钥一样使用publickey调用sig.initVerify。然后你可以用数据调用sig.update,数据可以是单个缓冲区或一系列数据(特别是当你有更多数据而不是一次装入内存时)。最后你用签名值调用sig.verify,它返回true或false。详情请参阅http://docs.oracle.com/javase/7/docs/api/java/security/Signature.html

+0

谢谢,我需要什么 – MohammadTofi