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)); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。