我需要在数字签名中验证我的数据到数据,我如何比较它们。 在此代码中验证签名,该签名由公钥和原始签名解密。
签名和我的数据之间的比较//我在这个步骤中遇到问题我想比较我的数据和签名。
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 :(得分:0)
首先,验证签名不涉及“通过公钥解密”。对于RSA,签名和验证确实使用类似的加密和解密操作,这使许多人混淆了这种方式,但实际上它们是不同的。对于你在这里使用的DSA和ECDSA,差别更大:没有涉及加密或解密的内容,只有签名和验证。
此外,与许多加密对象一样,签名实际上是随机字节,而不是有效字符。转换为String并尝试显示它最多会产生垃圾,并可能弄乱您的显示器。在需要限制为有效字符(如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。