eclipse實現(xiàn)DSA數(shù)字簽名
DSA數(shù)字簽名,供大家參考,具體內(nèi)容如下
一、實驗目的
在掌握了ElGamal和Schorr數(shù)字簽名算法的基礎上,進一步地學習和掌握DSA簽名算法。深入地理解該算法是如何降低了簽名信息的長度(當其中一個重要參數(shù) 選為512bit的素數(shù)時,ElGamal簽名的長度為1024bit,而DSA中通過160bit的素數(shù) 可以將簽名的長度降低為320bit),從而減少了存儲空間和傳輸帶寬。
二、實驗要求
4.學習DSA數(shù)字簽名算法。
5.掌握如何使用Java BigInteger類,簡單實現(xiàn)最基礎的DSA公私鑰簽名算法。
6.深入地理解DSA簽名算法與RSA算法的區(qū)別。
三、開發(fā)環(huán)境
JDK 1.7,Java開發(fā)環(huán)境(本實驗采用Windows+eclipse作為實驗環(huán)境),要求參與實驗的同學按照對稱加密提供的方法,提前安裝好JDK。
四、實驗原理
掌握了ElGamal和Schorr數(shù)字簽名算法的基礎上,進一步地學習和掌握DSA簽名算法。深入地理解該算法是如何降低了簽名信息的長度(當其中一個重要參數(shù) 選為512bit的素數(shù)時,ElGamal簽名的長度為1024bit,而DSA中通過160bit的素數(shù) 可以將簽名的長度降低為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) ); } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- eclipse實現(xiàn)Schnorr數(shù)字簽名
- eclipse實現(xiàn)ElGamal數(shù)字簽名
- Java PDF 添加數(shù)字簽名的實現(xiàn)方法
- Java實現(xiàn)的數(shù)字簽名算法RSA完整示例
- 詳解Java數(shù)字簽名提供XML安全
- 淺析java消息摘要與數(shù)字簽名
- Java數(shù)字簽名算法DSA實例詳解
- Java加密解密和數(shù)字簽名完整代碼示例
- 使用數(shù)字簽名實現(xiàn)數(shù)據(jù)庫記錄防篡改(Java實現(xiàn))
- 常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實現(xiàn)示例
相關文章
java利用url實現(xiàn)網(wǎng)頁內(nèi)容的抓取
本文主要介紹了java利用url實現(xiàn)網(wǎng)頁內(nèi)容抓取的示例。具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03JAVA使用SimpleDateFormat類表示時間代碼實例
這篇文章主要介紹了JAVA使用SimpleDateFormat類表示時間代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04Java簡單數(shù)據(jù)加密方法DES實現(xiàn)過程解析
這篇文章主要介紹了Java簡單數(shù)據(jù)加密方法DES實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12