Java之数字签名算法

目录

数字签名算法概述

数字签名算法——RSA

    DSA算法列表:MD、SHA两类

主要流程:​

 代码实现:

数字签名算法——DSA

    DSA算法列表:

主要流程:

代码实现:

数字签名算法——ECDSA

ECDSA算法列表:

主要流程:

代码实现:


数字签名算法概述

  • 数字签名——带有密钥(公钥、私钥)的消息摘要算法
  • 验证数据完整性、认证数据来源、抗否认
  • 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();
    }
}

不足之处,可以关注私信沟通,期待技术交流!

作者:筱白爱学习!!

欢迎关注转发评论点赞沟通,您的支持是筱白的动力!

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RSA算法是非对称加密算法,可以用来进行数字签名数字签名是一种将数据和私钥结合起来的技术,用于验证该数据的来源和完整性。 以下是JAVA实现RSA算法数字签名的示例代码: ```java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; public class RSASignatureExample { public static void main(String[] args) throws Exception { // 生成RSA密钥对 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048); KeyPair keyPair = keyPairGen.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); // 待签名的数据 String data = "Hello, world!"; // 生成数字签名 Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(data.getBytes()); byte[] signatureBytes = signature.sign(); // 验证数字签名 Signature verifySignature = Signature.getInstance("SHA256withRSA"); verifySignature.initVerify(publicKey); verifySignature.update(data.getBytes()); boolean result = verifySignature.verify(signatureBytes); System.out.println("数字签名验证结果:" + result); } } ``` 在此示例中,首先使用RSA算法生成了一个2048位的密钥对。然后,使用私钥对待签名的数据进行签名,并将签名结果存储在字节数组中。接着,使用公钥对签名结果进行验证,以验证签名的正确性。最后,输出签名验证结果。 需要注意的是,签名和验证过程中所使用的算法必须一致,否则会导致验证失败。在此示例中,我们使用SHA256withRSA算法进行签名和验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱白爱学习

你的鼓励将是我写作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值