Java数字签名——DSA算法

简介:   RSA数字加密算法参考:http://www.cnblogs.com/LexMoon/p/javaRSA.html   DSS: 数字签名标准   DSA: 数字签名算法   DSA仅仅包含数字签名   ————————————————————————————————————   密钥...

  RSA数字加密算法参考:http://www.cnblogs.com/LexMoon/p/javaRSA.html

  DSS: 数字签名标准

  DSA: 数字签名算法

  DSA仅仅包含数字签名  

————————————————————————————————————

  密钥长度均为512~1024(64的整数倍),默认长度为1024

     实现方JDK:

        SHA1withDSA

     实现方BD:

        SHA224withDSA

        SHA256withDSA

        SHA384withDSA

        SHA512withDSA

——————————————————————————————————

 

 1 package DSA;
 2 
 3 import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;
 4 
 5 import java.security.*;
 6 import java.security.interfaces.DSAPrivateKey;
 7 import java.security.interfaces.DSAPublicKey;
 8 import java.security.spec.PKCS8EncodedKeySpec;
 9 import java.security.spec.X509EncodedKeySpec;
10 
11 public class Dsa {
12     public static String src = "hello berber" ;
13     public static void main(String[] args) {
14             jdkDSA();
15     }
16     public static void jdkDSA(){
17         try{
18             // 初始化:
19             KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA") ;
20             keyPairGenerator.initialize(512);
21             KeyPair keyPair = keyPairGenerator.generateKeyPair();
22 
23             DSAPublicKey dsaPublicKey = (DSAPublicKey)keyPair.getPublic() ;
24             DSAPrivateKey dsaPrivateKey = (DSAPrivateKey)keyPair.getPrivate() ;
25             // 签名:
26             PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());
27             KeyFactory keyFactory = KeyFactory.getInstance("DSA");
28             PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
29             Signature signature = Signature.getInstance("SHA1withDSA");
30             signature.initSign(privateKey);
31             signature.update(src.getBytes());
32             byte arr[] = signature.sign() ;
33             System.out.println("jdk dsa sign:"+ HexBin.encode(arr));
34             // 验证签名
35             X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded()) ;
36             keyFactory = KeyFactory.getInstance("DSA");
37             PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec) ;
38             signature = Signature.getInstance("SHA1withDSA");
39             signature.initVerify(publicKey);
40             signature.update(src.getBytes());
41             boolean bool = signature.verify(arr) ;
42             System.out.println("jdk dsa verify:"+bool);
43         }catch (Exception e){
44 
45         }
46     }
47 }

 

 

  结果:

    

  过程:

     构建密钥对:

        发送方:  1.构建密钥对

              2.公布密钥

     发送数据 :

        发送方:  1.使用私钥对数据签名

              2.发送签名,数据

                 3.使用公钥,签名验证数据

 

目录
相关文章
|
14天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
31 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
20天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
20天前
|
搜索推荐 算法 Java
Java实现的常用八种排序算法
提到数据结构与算法,无法避免的一点就包含排序,熟练的掌握各种排序算法则是一个程序员必备的素质之一,除此之外,排序算法也是当下各大技术公司比较喜欢问的技术点,所以,就这一点JavaBuild整理了常见的8种排序算法
12 0
|
25天前
|
机器学习/深度学习 数据采集 算法
使用 Java 实现机器学习算法
【4月更文挑战第19天】Java在数据驱动时代为机器学习提供支持,具备丰富的数学和数据结构库,适用于实现线性回归、决策树、SVM和随机森林等算法。实现时注意数据预处理、模型选择、评估指标和可视化。利用Java的库和编程能力可构建高效模型,但需按问题需求选择合适技术和优化方法。
|
1月前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出"验证成功",否则输出"验证失败"。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。
|
1月前
|
搜索推荐 Java
Java排序算法
Java排序算法
20 0
|
1月前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
25 4
|
1月前
|
搜索推荐 算法 Java
Java基础(冒泡排序算法)
Java基础(冒泡排序算法)
19 3
|
2天前
|
Java 调度
Java一分钟之线程池:ExecutorService与Future
【5月更文挑战第12天】Java并发编程中,`ExecutorService`和`Future`是关键组件,简化多线程并提供异步执行能力。`ExecutorService`是线程池接口,用于提交任务到线程池,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。通过`submit()`提交任务并返回`Future`对象,可检查任务状态、获取结果或取消任务。注意处理`ExecutionException`和避免无限等待。实战示例展示了如何异步执行任务并获取结果。理解这些概念对提升并发性能至关重要。
16 5
|
2天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。