Java密码学之数字签名

密码系统是加密技术及其附带基础工具的实现,以提供信息安全服务。基本密码系统的各种组件是明文,加密算法,密文,解密算法,加密密钥和解密密钥。其中加密密钥和解密密钥是:

  • 加密密钥是发件人已知的值。发送方将加密密钥与明文一起输入加密算法,以便计算密文。
  • 解密密钥是接收方已知的值。解密密钥与加密密钥有关,但并不总是与之相同。接收器将解密密钥与密文一起输入到解密算法中以便计算明文。

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");
        }
    }
}

注意和自己的实际场景结合使用

你可能感兴趣的:(玩意儿,算法,密码学,java,算法,数字签名)