//特定于算法的,用于生成公钥和私钥对
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
keyGen.initialize(1024);
KeyPair key = keyGen.generateKeyPair();
// 将生成的密钥对序列化到文件
byte[] buffer = key.getPrivate().getEncoded();
buffer = Base64.encodeBase64(buffer);
FileOutputStream out = new FileOutputStream("d:/private_test");
out.write(buffer);
out.close();
out = new FileOutputStream("d:/public_test");
buffer = key.getPublic().getEncoded();
buffer = Base64.encodeBase64(buffer);
out.write(buffer);
out.close();
数字签名的验证:
byte[] encodestr = str.getBytes();
//为应用程序提供数字签名算法功能,数字签名用来保证数字数据的真实性和完整性
在所有算法当中,数字签名可以是 NIST 标准的 DSA,它使用 DSA 和 SHA-1。可以将使用 SHA-1 消息摘要算法的 DSA 算法可指定为 SHA1withDSA。如果使用 RSA,对消息摘要算法将有多种选择,因此,可以将签名算法指定为 MD2withRSA、MD5withRSA 或 SHA1withRSA。没有默认的算法名称,所以必须为其指定名称。
用 Signature 对象签名数据或验证签名包括以下三个阶段:
- 初始化,使用
- 初始化验证签名的公钥(请参见
initVerify
),或使用 - 初始化签署签名的私钥(也可以选择“安全随机数生成器")
- 初始化验证签名的公钥(请参见
-
根据初始化类型,这可更新要签名或验证的字节。
- 签署或验证所有更新字节的签名。
Signature sig = Signature.getInstance("DSA");
//初始化此用于签名的对象
sig.initSign(readPrivateKey("D:/private_test"));
//更新要由字节签名或验证的数据
sig.update(encodestr);
//返回所有已更新数据的签名字节。
byte[] signature = sig.sign();
// 初始化此用于验证的对象。
sig.initVerify(readPublicKey("d:/public_test"));
sig.update(encodestr);
//验证传入的签名
System.out.println(sig.verify(signature));
//读取文件,生成privateKey(使用密钥工厂以便根据其编码实例化 DSA 私钥)
public static PrivateKey readPrivateKey(String filePath) throws Exception {
//密钥工厂
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
FileInputStream istream = new FileInputStream(filePath);
byte[] buffer = new byte[istream.available()];
istream.read(buffer);
buffer = Base64.decodeBase64(buffer);
//对于Private key是用PKCS#8编码
EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
// 根据所提供的密钥规范(密钥材料)生成私钥对象。
return keyFactory.generatePrivate(keySpec);
}
//生成publicKey
public static PublicKey readPublicKey(String filePath) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
FileInputStream istream = new FileInputStream(filePath);
byte[] buffer = new byte[istream.available()];
istream.read(buffer);
buffer = Base64.decodeBase64(buffer);
// public key是用X.509编码
EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
return keyFactory.generatePublic(keySpec);
}