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

