• 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,完整过程
    1. import java.security.*;
    2. public class SignDemo {
    3. public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    4. //创建密钥对生成器,后面算法选择有: DiffieHellman,DSA,RSA 三种,如果是其他的话,就会抛出异常NoSuchAlgorithmException
    5. KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
    6. //初始化密钥对生成器,常用参数是长度,大于要加密内容的字节长度
    7. keyPairGen.initialize(2048);
    8. //生成密钥对(公钥和私钥)
    9. KeyPair pair = keyPairGen.generateKeyPair();
    10. //获取刚成成的密钥对中的私钥
    11. PrivateKey privKey = pair.getPrivate();
    12. //创建签名对象,后面的算法有3种,SHA1withDSA,SHA1withRSA,SHA256withRSA,如果不是上面3种之一,就会抛出异常NoSuchAlgorithmException
    13. Signature sign = Signature.getInstance("SHA256withDSA");
    14. //初始化签名
    15. sign.initSign(privKey);
    16. //"Hello how are you"为代签名的内容,实际情况中会有很多内容
    17. byte[] bytes = "Hello how are you".getBytes();
    18. //将需要签名的内容设置到签名对象中
    19. sign.update(bytes);
    20. //签名,返回签名后的内容
    21. byte[] signature = sign.sign();
    22. System.out.println("签名后的内容:"+new String(signature));
    23. //下面是验证签名的过程,实际情况中,应该是在不同的方法内
    24. //用公钥初始化签名验证过程
    25. sign.initVerify(pair.getPublic());
    26. //将明文(未签名的内容)设置到签名验证对象中
    27. sign.update(bytes);
    28. //验证签名
    29. boolean bool = sign.verify(signature);
    30. if(bool) {
    31. System.out.println("Signature verified");
    32. } else {
    33. System.out.println("Signature failed");
    34. }
    35. }
    36. }

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

  • 相关阅读:
    CleanMyMac X2024告别硬盘空间不足,让您的Mac电脑极速如新
    数字营销中台和全渠道的数字化精耕,快消老品牌实现数字营销焕新生
    在 Qt 框架中,有许多内置的信号可用于不同的类和对象\triggered
    R语言统计学DOE实验设计:用平衡不完全区组设计(BIBD)分析纸飞机飞行时间实验数据...
    TCP 通信并发服务器详解(附有案例代码)
    springboot+skywalking初体检
    以太网诊断协议DoIP(Ethernet Diagnostic Protocol DoIP)
    一个算子在深度学习框架中的旅程
    【紧急情况】:回宿舍放下书包的我,花了20分钟敲了一个抢购脚本
    德国LFGB检测办理
  • 原文地址:https://blog.csdn.net/wangerrong/article/details/132838457