密码系统是加密技术及其附带基础工具的实现,以提供信息安全服务。基本密码系统的各种组件是明文,加密算法,密文,解密算法,加密密钥和解密密钥。其中加密密钥和解密密钥是:
- 加密密钥是发件人已知的值。发送方将加密密钥与明文一起输入加密算法,以便计算密文。
- 解密密钥是接收方已知的值。解密密钥与加密密钥有关,但并不总是与之相同。接收器将解密密钥与密文一起输入到解密算法中以便计算明文。
Java密码体系结构(JCA)是一组API,用于实现现代密码术的概念,如数字签名,消息摘要,证书,加密,密钥生成和管理,以及安全随机数生成等。
1,创建密钥对生成器
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
2,初始化密钥对生成器
keyPairGen.initialize(2048);
3,生成密钥
KeyPair pair = keyPairGen.generateKeyPair();
4,创建签名对象
Signature sign = Signature.getInstance("SHA256withDSA");
5,初始化签名
sign.initSign(privKey);
//"Hello how are you"为代签名的内容,实际情况中会有很多内容
byte[] bytes = "Hello how are you".getBytes();
6,将需要签名的内容设置到签名对象中
sign.update(bytes);
7,签名,返回签名后的内容
byte[] signature = sign.sign();
System.out.println("签名后的内容:"+new String(signature));
8,验证签名
sign.initVerify(pair.getPublic());
sign.update(bytes);
boolean bool = sign.verify(signature);
9,完整过程
import java.security.*;
public class SignDemo {
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
//创建密钥对生成器,后面算法选择有: DiffieHellman,DSA,RSA 三种,如果是其他的话,就会抛出异常NoSuchAlgorithmException
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
//初始化密钥对生成器,常用参数是长度,大于要加密内容的字节长度
keyPairGen.initialize(2048);
//生成密钥对(公钥和私钥)
KeyPair pair = keyPairGen.generateKeyPair();
//获取刚成成的密钥对中的私钥
PrivateKey privKey = pair.getPrivate();
//创建签名对象,后面的算法有3种,SHA1withDSA,SHA1withRSA,SHA256withRSA,如果不是上面3种之一,就会抛出异常NoSuchAlgorithmException
Signature sign = Signature.getInstance("SHA256withDSA");
//初始化签名
sign.initSign(privKey);
//"Hello how are you"为代签名的内容,实际情况中会有很多内容
byte[] bytes = "Hello how are you".getBytes();
//将需要签名的内容设置到签名对象中
sign.update(bytes);
//签名,返回签名后的内容
byte[] signature = sign.sign();
System.out.println("签名后的内容:"+new String(signature));
//下面是验证签名的过程,实际情况中,应该是在不同的方法内
//用公钥初始化签名验证过程
sign.initVerify(pair.getPublic());
//将明文(未签名的内容)设置到签名验证对象中
sign.update(bytes);
//验证签名
boolean bool = sign.verify(signature);
if(bool) {
System.out.println("Signature verified");
} else {
System.out.println("Signature failed");
}
}
}
注意和自己的实际场景结合使用