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) );
    }
    
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值