2025年3月22日 星期六 甲辰(龙)年 月廿一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Java

Java之数字签名算法

时间:06-20来源:作者:点击数:33

数字签名算法概述

  • 数字签名——带有密钥(公钥、私钥)的消息摘要算法
  • 验证数据完整性、认证数据来源、抗否认
  • OSI参考模型
  • 私钥签名、公钥验证
  • 常用的数字签名算法:RSA、DSA、ECDSA

数字签名算法——RSA

经典算法

DSA算法列表:MD、SHA两类

主要流程:

代码实现:

  • package com.bxl.demo.service;
  • import org.apache.commons.codec.binary.Hex;
  • import java.security.*;
  • import java.security.interfaces.RSAPrivateKey;
  • import java.security.interfaces.RSAPublicKey;
  • import java.security.spec.PKCS8EncodedKeySpec;
  • import java.security.spec.X509EncodedKeySpec;
  • /**
  • * Created by xiaobai on 2021-8-23
  • */
  • public class RSA {
  • private static String src = "xiaobai security rsa";
  • public static void RsaMethod(){
  • try {
  • /* 一、初始化密钥 */
  • // 1.获得RSA的KeyPairGenerator对象示例
  • KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  • // 2.修改key的长度
  • keyPairGenerator.initialize(512);
  • // 3.得到KeyPair对象
  • KeyPair keyPair = keyPairGenerator.generateKeyPair();
  • // 4.获取公钥
  • RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
  • // 5.获取私钥
  • RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
  • /* 二、执行签名 */
  • // 1.通过私钥进行签名,获取PKCS8EncodedKeySpec对象示例
  • PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
  • // 2.通过RSA算法构建KeyFactory实例对象
  • KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  • // 3.声明privateKey
  • PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  • // 4.创建签名对象,这里我们使用的是JDK的方式实现的所以在这里我们使用"MD5withRSA"
  • Signature signature = Signature.getInstance("MD5withRSA");
  • // 5.执行签名的初始化方法
  • signature.initSign(privateKey);
  • // 6.修改需要处理的内容
  • signature.update(src.getBytes());
  • // 7.执行签名
  • byte[] result = signature.sign();
  • /*
  • * Hex.encodeHexString() 是需要引入commons-codec依赖
  • * <dependency>
  • <groupId>org.wso2.orbit.org.bouncycastle</groupId>
  • <artifactId>bcprov-jdk15on</artifactId>
  • <version>1.60.0.wso2v1</version>
  • </dependency>
  • * */
  • System.out.println("jdk rsa sign:"+ Hex.encodeHexString(result));
  • /* 三、验证签名 */
  • // 1.通过公钥进行签名,获取X509EncodedKeySpec对象示例
  • X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
  • // 2.通过RSA算法构建KeyFactory实例对象 (此处是为了完整性,所以新创建了一个对象)
  • keyFactory = KeyFactory.getInstance("RSA");
  • // 3.获得PublicKey对象
  • PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  • // 4.创建签名对象,这里我们使用的是JDK的方式实现的所以在这里我们使用"MD5withRSA"
  • signature = Signature.getInstance("MD5withRSA");
  • // 5.验证签名的初始化方法
  • signature.initVerify(publicKey);
  • // 6.修改需要处理的内容
  • signature.update(src.getBytes());
  • // 7.验证签名
  • boolean resultBool = signature.verify(result);
  • System.out.println("jdk rsa verify:" + resultBool);
  • } catch (Exception e) {
  • e.printStackTrace();
  • }
  • }
  • public static void main(String[] args) {
  • // 执行方法
  • RsaMethod();
  • }
  • }

数字签名算法——DSA

        DSS(Digital Signture Standard)数字签名标准

        DSA(Digital Signature Algorithm)数字签名算法

        DSA仅包含数字签名

DSA算法列表:

主要流程:

代码实现:

  • package com.bxl.demo.service;
  • import org.apache.commons.codec.binary.Hex;
  • import java.security.*;
  • import java.security.interfaces.DSAPrivateKey;
  • import java.security.interfaces.DSAPublicKey;
  • import java.security.spec.PKCS8EncodedKeySpec;
  • import java.security.spec.X509EncodedKeySpec;
  • /**
  • * Created by xiaobai on 2021-8-23
  • */
  • public class DSA {
  • private static String src = "xiaobai security dsa";
  • public static void JdkDsaMethod(){
  • try {
  • /* 一、初始化密钥 */
  • // 1.获得DSA的KeyPairGenerator对象示例
  • KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
  • // 2.修改key的长度
  • keyPairGenerator.initialize(512);
  • // 3.得到KeyPair对象
  • KeyPair keyPair = keyPairGenerator.generateKeyPair();
  • // 4.获取公钥
  • DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();
  • // 5.获取私钥
  • DSAPrivateKey dsaPrivateKey = (DSAPrivateKey) keyPair.getPrivate();
  • /* 二、执行签名 */
  • // 1.通过私钥进行签名,获取PKCS8EncodedKeySpec对象示例
  • PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());
  • // 2.通过DSA算法构建KeyFactory实例对象
  • KeyFactory keyFactory = KeyFactory.getInstance("DSA");
  • // 3.声明privateKey
  • PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  • // 4.创建签名对象,这里我们使用的是JDK的方式实现的所以在这里我们使用"SHA1withDSA"
  • Signature signature = Signature.getInstance("SHA1withDSA");
  • // 5.执行签名的初始化方法
  • signature.initSign(privateKey);
  • // 6.修改需要处理的内容
  • signature.update(src.getBytes());
  • // 7.执行签名
  • byte[] result = signature.sign();
  • /*
  • * Hex.encodeHexString() 是需要引入commons-codec依赖
  • * <dependency>
  • <groupId>org.wso2.orbit.org.bouncycastle</groupId>
  • <artifactId>bcprov-jdk15on</artifactId>
  • <version>1.60.0.wso2v1</version>
  • </dependency>
  • * */
  • System.out.println("jdk dsa sign:"+ Hex.encodeHexString(result));
  • /* 三、验证签名 */
  • // 1.通过公钥进行签名,获取X509EncodedKeySpec对象示例
  • X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded());
  • // 2.通过DSA算法构建KeyFactory实例对象 (此处是为了完整性,所以新创建了一个对象)
  • keyFactory = KeyFactory.getInstance("DSA");
  • // 3.获得PublicKey对象
  • PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  • // 4.创建签名对象,这里我们使用的是JDK的方式实现的所以在这里我们使用"SHA1withDSA"
  • signature = Signature.getInstance("SHA1withDSA");
  • // 5.验证签名的初始化方法
  • signature.initVerify(publicKey);
  • // 6.修改需要处理的内容
  • signature.update(src.getBytes());
  • // 7.验证签名
  • boolean resultBool = signature.verify(result);
  • System.out.println("jdk dsa verify:" + resultBool);
  • } catch (Exception e) {
  • e.printStackTrace();
  • }
  • }
  • public static void main(String[] args) {
  • // 执行方法
  • JdkDsaMethod();
  • }
  • }

数字签名算法——ECDSA

  • 微软
  • Elliptic Curve Digital Signature Algorithm(ECDSA),椭圆曲线数字签名算法
  • 速度快、强度高、签名短

ECDSA算法列表:

主要流程:

代码实现:

  • package com.bxl.demo.service;
  • import org.apache.commons.codec.binary.Hex;
  • import java.security.*;
  • import java.security.interfaces.ECPrivateKey;
  • import java.security.interfaces.ECPublicKey;
  • import java.security.spec.PKCS8EncodedKeySpec;
  • import java.security.spec.X509EncodedKeySpec;
  • /**
  • * Created by xiaobai on 2021-8-23
  • */
  • public class ECDSA {
  • private static String src = "xiaobai security ecdsa";
  • public static void JdkEcdsaMethod(){
  • try {
  • /* 一、初始化密钥 */
  • // 1.获得EC的KeyPairGenerator对象示例
  • KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
  • // 2.修改key的长度
  • keyPairGenerator.initialize(256);
  • // 3.得到KeyPair对象
  • KeyPair keyPair = keyPairGenerator.generateKeyPair();
  • // 4.获取公钥
  • ECPublicKey ecPublicKey = (ECPublicKey) keyPair.getPublic();
  • // 5.获取私钥
  • ECPrivateKey ecPrivateKey = (ECPrivateKey) keyPair.getPrivate();
  • /* 二、执行签名 */
  • // 1.通过私钥进行签名,获取PKCS8EncodedKeySpec对象示例
  • PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());
  • // 2.通过EC算法构建KeyFactory实例对象
  • KeyFactory keyFactory = KeyFactory.getInstance("EC");
  • // 3.声明privateKey
  • PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  • // 4.创建签名对象,这里我们使用的是JDK的方式实现的所以在这里我们使用"SHA1withECDSA"
  • Signature signature = Signature.getInstance("SHA1withECDSA");
  • // 5.执行签名的初始化方法
  • signature.initSign(privateKey);
  • // 6.修改需要处理的内容
  • signature.update(src.getBytes());
  • // 7.执行签名
  • byte[] result = signature.sign();
  • /*
  • * Hex.encodeHexString() 是需要引入commons-codec依赖
  • * <dependency>
  • <groupId>org.wso2.orbit.org.bouncycastle</groupId>
  • <artifactId>bcprov-jdk15on</artifactId>
  • <version>1.60.0.wso2v1</version>
  • </dependency>
  • * */
  • System.out.println("jdk ecdsa sign:"+ Hex.encodeHexString(result));
  • /* 三、验证签名 */
  • // 1.通过公钥进行签名,获取X509EncodedKeySpec对象示例
  • X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());
  • // 2.通过EC算法构建KeyFactory实例对象 (此处是为了完整性,所以新创建了一个对象)
  • keyFactory = KeyFactory.getInstance("EC");
  • // 3.获得PublicKey对象
  • PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  • // 4.创建签名对象,这里我们使用的是JDK的方式实现的所以在这里我们使用"SHA1withECDSA"
  • signature = Signature.getInstance("SHA1withECDSA");
  • // 5.验证签名的初始化方法
  • signature.initVerify(publicKey);
  • // 6.修改需要处理的内容
  • signature.update(src.getBytes());
  • // 7.验证签名
  • boolean resultBool = signature.verify(result);
  • System.out.println("jdk ecdsa verify:" + resultBool);
  • } catch (Exception e) {
  • e.printStackTrace();
  • }
  • }
  • public static void main(String[] args) {
  • // 执行方法
  • JdkEcdsaMethod();
  • }
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门