软件编程
位置:首页>> 软件编程>> java编程>> eclipse实现DSA数字签名

eclipse实现DSA数字签名

作者:秃头选拔赛形象大使  发布时间:2023-08-24 19:11:37 

标签:eclipse,DSA,数字签名

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

一、实验目的

在掌握了ElGamal和Schorr数字签名算法的基础上,进一步地学习和掌握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) );
 }

}

来源:https://blog.csdn.net/qq_45056216/article/details/106894361

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com