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