eclipse实现DSA数字签名

网友投稿 275 2022-12-03


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,而DSAhttp://中通过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.dighttp://est(), 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 http://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) );

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java中easypoi导入excel文件列名相同的处理方案
下一篇:Spring Boot编写拦截器教程实例解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~