eclipse实现DSA数字签名

 更新时间:2020年06月23日 14:31:52   作者:秃头选拔赛形象大使  
这篇文章主要为大家详细介绍了eclipse实现DSA数字签名算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

DSA数字签名,供大家参考,具体内容如下

一、实验目的

在掌握了ElGamalSchorr数字签名算法的基础上,进一步地学习和掌握DSA签名算法。深入地理解该算法是如何降低了签名信息的长度(当其中一个重要参数 选为512bit的素数时,ElGamal签名的长度为1024bit,而DSA中通过160bit的素数 可以将签名的长度降低为320bit),从而减少了存储空间和传输带宽。

二、实验要求

4.学习DSA数字签名算法。
5.掌握如何使用Java BigInteger类,简单实现最基础的DSA公私钥签名算法。
6.深入地理解DSA签名算法与RSA算法的区别。

三、开发环境

JDK 1.7,Java开发环境(本实验采用Windows+eclipse作为实验环境),要求参与实验的同学按照对称加密提供的方法,提前安装好JDK。

四、实验原理

掌握了ElGamal和Schorr数字签名算法的基础上,进一步地学习和掌握DSA签名算法。深入地理解该算法是如何降低了签名信息的长度(当其中一个重要参数 选为512bit的素数时,ElGamal签名的长度为1024bit,而DSA中通过160bit的素数 可以将签名的长度降低为320bit),从而减少了存储空间和传输带宽

代码段:

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;


public class DSASign {
  public BigInteger p,q,g;
  public BigInteger x,y;
  
  public BigInteger _randomInZq(){
   BigInteger r= null;
   do {
   System.out.print(".");
   r = new BigInteger(160, new SecureRandom());
   }while(r.compareTo(q) >=0);
   System.out.print(".");
   return r;
  }
  
  public BigInteger _hashInZq(byte m[]){
   MessageDigest md;
   try {
   md = MessageDigest.getInstance("SHA-1");
   md.update(m);
   byte b[] = new byte[17];
   System.arraycopy(md.digest(), 0, b, 1, 16);
   return new BigInteger(b);
   }catch (NoSuchAlgorithmException e){
   System.out.print("This cannot happen!");
   }
   return null;
  }
  
  public void initKeys(){
   q = new BigInteger(160, 100, new SecureRandom());
   do {
   BigInteger t = new BigInteger(512, new SecureRandom());
   p = t.multiply(q).add(BigInteger.ONE);
   System.out.println("~");
   }while(!p.isProbablePrime(100));
   BigInteger h = _randomInZq();
   g = h.modPow(p.subtract(BigInteger.ONE).divide(q), p);
   x = _randomInZq();
   y = g.modPow(x, p);
   System.out.println("p : " + p);
   System.out.println("q : " + q);
   System.out.println("g : " + g);
   System.out.println("x : " + x);
   System.out.println("y : " + y);
  }
  
  public BigInteger[] signature(byte m[]){
   BigInteger k = _randomInZq();
   BigInteger sig[] = new BigInteger[2];
   sig[0] = g.modPow(k, p).mod(q);
   sig[1] = _hashInZq(m).add(x.multiply(sig[0])).mod(q)
   .multiply(k.modInverse(q)).mod(q);
   return sig;
  }
  public boolean verify(byte m[], BigInteger sig[]){
   BigInteger w = sig[1].modInverse(q);
   BigInteger u1 = _hashInZq(m).multiply(w).mod(q);
   BigInteger u2 = sig[0].multiply(w).mod(q);
   BigInteger v = g.modPow(u1, p).multiply(y.modPow(u2, p)).mod(p).mod(q);
   System.out.println("v = " + v);
   System.out.println("r = " + sig[0]);
   return v.compareTo(sig[0]) == 0;
  }
  
  public static void main(String args[]){
   DSASign dsa = new DSASign();
   dsa.initKeys();
   String message = "My name is xxx, my student number is xxxx.";
   System.out.println(message);
   BigInteger sig[] = dsa.signature(message.getBytes());
   System.out.println("DSASignture verifies result:" + dsa.verify(message.getBytes(),sig) );
  }
  
}

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java 线程的生命周期详解

    java 线程的生命周期详解

    这篇文章主要介绍了java 线程的生命周期详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 如何通过一个注解实现MyBatis字段加解密

    如何通过一个注解实现MyBatis字段加解密

    用户隐私很重要,因此很多公司开始做数据加减密改造,下面这篇文章主要给大家介绍了关于如何通过一个注解实现MyBatis字段加解密的相关资料,需要的朋友可以参考下
    2022-02-02
  • java利用url实现网页内容的抓取

    java利用url实现网页内容的抓取

    本文主要介绍了java利用url实现网页内容抓取的示例。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Java中的WeakHashMap浅析

    Java中的WeakHashMap浅析

    这篇文章主要介绍了Java中的WeakHashMap浅析,weakhashmap关键是:当一个对象被GC回收时,响应的值对象的引用从map中删除,weakhashmap能节约存储空间,来实现缓存那些非必要的数据,需要的朋友可以参考下
    2023-09-09
  • JAVA使用SimpleDateFormat类表示时间代码实例

    JAVA使用SimpleDateFormat类表示时间代码实例

    这篇文章主要介绍了JAVA使用SimpleDateFormat类表示时间代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java编程题之从上往下打印出二叉树

    java编程题之从上往下打印出二叉树

    这篇文章主要为大家详细介绍了java编程题之从上往下打印出二叉树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • Java计时器工具StopWatch的具体使用

    Java计时器工具StopWatch的具体使用

    计时器在很多地方都可以用到,本文主要介绍了Java计时器工具StopWatch的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 新手入门Jvm--jvm概览

    新手入门Jvm--jvm概览

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的
    2021-06-06
  • springboot 微信授权网页登录操作流程

    springboot 微信授权网页登录操作流程

    这篇文章主要介绍了springboot 微信授权网页登录操作流程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java简单数据加密方法DES实现过程解析

    Java简单数据加密方法DES实现过程解析

    这篇文章主要介绍了Java简单数据加密方法DES实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论