eclipse实现DSA数字签名
DSA数字签名,供大家参考,具体内容如下
一、实验目的
在掌握了ElGamal和Schorr数字签名算法的基础上,进一步地学习和掌握DSA签名算法。深入地理解该算法是如何降低了签名信息的长度(当其中一个重要参数选为512bit的素数时,ElGamal签名的长度为1024bit,而DSA中通过160bit的素数可以将签名的长度降低为320bit),从而减少了存储空间和传输带宽。
二、实验要求
4.学习DSA数字签名算法。
5.掌握如何使用JavaBigInteger类,简单实现最基础的DSA公私钥签名算法。
6.深入地理解DSA签名算法与RSA算法的区别。
三、开发环境
JDK1.7,Java开发环境(本实验采用Windows+eclipse作为实验环境),要求参与实验的同学按照对称加密提供的方法,提前安装好JDK。
四、实验原理
掌握了ElGamal和Schorr数字签名算法的基础上,进一步地学习和掌握DSA签名算法。深入地理解该算法是如何降低了签名信息的长度(当其中一个重要参数选为512bit的素数时,ElGamal签名的长度为1024bit,而DSA中通过160bit的素数可以将签名的长度降低为320bit),从而减少了存储空间和传输带宽
代码段:
importjava.math.BigInteger;
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importjava.security.SecureRandom;
importjava.util.Random;
publicclassDSASign{
publicBigIntegerp,q,g;
publicBigIntegerx,y;
publicBigInteger_randomInZq(){
BigIntegerr=null;
do{
System.out.print(".");
r=newBigInteger(160,newSecureRandom());
}while(r.compareTo(q)>=0);
System.out.print(".");
returnr;
}
publicBigInteger_hashInZq(bytem[]){
MessageDigestmd;
try{
md=MessageDigest.getInstance("SHA-1");
md.update(m);
byteb[]=newbyte[17];
System.arraycopy(md.digest(),0,b,1,16);
returnnewBigInteger(b);
}catch(NoSuchAlgorithmExceptione){
System.out.print("Thiscannothappen!");
}
returnnull;
}
publicvoidinitKeys(){
q=newBigInteger(160,100,newSecureRandom());
do{
BigIntegert=newBigInteger(512,newSecureRandom());
p=t.multiply(q).add(BigInteger.ONE);
System.out.println("~");
}while(!p.isProbablePrime(100));
BigIntegerh=_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);
}
publicBigInteger[]signature(bytem[]){
BigIntegerk=_randomInZq();
BigIntegersig[]=newBigInteger[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);
returnsig;
}
publicbooleanverify(bytem[],BigIntegersig[]){
BigIntegerw=sig[1].modInverse(q);
BigIntegeru1=_hashInZq(m).multiply(w).mod(q);
BigIntegeru2=sig[0].multiply(w).mod(q);
BigIntegerv=g.modPow(u1,p).multiply(y.modPow(u2,p)).mod(p).mod(q);
System.out.println("v="+v);
System.out.println("r="+sig[0]);
returnv.compareTo(sig[0])==0;
}
publicstaticvoidmain(Stringargs[]){
DSASigndsa=newDSASign();
dsa.initKeys();
Stringmessage="Mynameisxxx,mystudentnumberisxxxx.";
System.out.println(message);
BigIntegersig[]=dsa.signature(message.getBytes());
System.out.println("DSASigntureverifiesresult:"+dsa.verify(message.getBytes(),sig));
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。