eclipse实现DSA数字签名

这篇文章主要为大家详细介绍了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) ); } }

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

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...