91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

eclipse如何實現ElGamal數字簽名?

發布時間:2020-06-23 16:17:38 來源:億速云 閱讀:227 作者:清晨 欄目:開發技術

這篇文章將為大家詳細講解有關eclipse如何實現ElGamal數字簽名?,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

一、實驗目的

學習ElGamal算法在數字簽名方面的使用,掌握教科書版本的ElGamal數字簽名算法的編寫,掌握ElGamal加密算法和ElGamal數字簽名算法的異同。

二、實驗要求

1.熟悉ElGamal數字簽名算法。
2.掌握如何使用Java BigInteger類,簡單實現教科書式的ElGamal公私鑰簽名算法。
3.了解ElGamal加密算法和ElGamal數字簽名算法的異同。

三、開發環境

JDK 1.7,Java開發環境(本實驗采用Windows+eclipse作為實驗環境),要求參與實驗的同學按照對稱加密提供的方法,提前安裝好JDK。

四、實驗內容

【1-1】ElGamal簽名算法的實現

1.實現公私鑰生成算法:根據教材,ElGamal公私鑰生成算法首選需要選取一個大素數 ,然后選取 作為其生成元。接著隨機選取私鑰 ,計算 作為其公鑰。因此,可寫代碼如下:

public void initKeys() {
 System.out.println("choose a prime p with securitylevel " 
 + securitylevel + " , please wait ...");
 p = new BigInteger(securitylevel, 100, new Random());
 System.out.println("p : " + p);
 g = __randomInZp();
 System.out.println("g : " + g);
 x = __randomInZp();
 System.out.println("x : " + x);
 y = g.modPow(x, p);
 System.out.println("y : " + y);
 
}

其中,__randomInZp定義如下函數,實現從 中隨機選取一個大整數:

public BigInteger __randomInZp() {
 BigInteger r = null;
 do {
 System.out.print(".");
 r = new BigInteger(securitylevel, new SecureRandom());
 }while(r.compareTo(p) >= 0);
 System.out.println(".");
 return r;
}

2.實現簽名算法:

ElGamal簽名算法需要隨機選取 ,同時計算
此時, 即為簽名。因此,可根據公式,寫代碼如下:

public BigInteger[] signature(byte m[]) {
 BigInteger sig[] = new BigInteger[2];
 BigInteger k = __randomPrimeInZp();
 sig[0] = g.modPow(k, p);
 sig[1] = __hashInZp(m).subtract(x.multiply(sig[0]))
 .mod(p.subtract(BigInteger.ONE))
 .multiply(k.modInverse(p.subtract(BigInteger.ONE)))
 .mod(p.subtract(BigInteger.ONE));
 System.out.println("[r,s] = [" + sig[0] + ", " + sig[1] + "]");
 return sig;
}

此處的__randomPrimeInZp意為從 中隨機選取一個大素數,實現如下:

public BigInteger __randomPrimeInZp() {
 BigInteger r = null;
 do {
 System.out.print(".");
 r = new BigInteger(securitylevel, 100, new SecureRandom());
 }while(r.compareTo(p) >= 0);
 System.out.println(".");
 return r;
}

另有一哈希函數,實現如下:

public BigInteger __hashInZp(byte m[]) {
 MessageDigest md;
 try {
 md = MessageDigest.getInstance("SHA-256");
 md.update(m);
  byte b[] = new byte[33];
  System.arraycopy(md.digest(), 0, b, 1, 32);
  return new BigInteger(b);
 } catch (NoSuchAlgorithmException e) {
 System.out.println("this cannot happen.");
 }
 return null;
}

3.實現驗證算法:ElGamal簽名驗證算法即判定公式 是否成立。因此,可考慮寫代碼如下:

public boolean verify(byte m[], BigInteger sig[]) {
 BigInteger l = y.modPow(sig[0], p)
 .multiply(sig[0].modPow(sig[1], p)).mod(p);
 BigInteger r = g.modPow(__hashInZp(m), p);
 return l.compareTo(r) == 0;
}

4.實現main方法,在main方法中調用算法進行測試:

public static void main(String args[]) {
 ElGamalSignatureInstance instance = new ElGamalSignatureInstance();
 instance.initKeys();
 byte m[] = "my name is ElGamal, my student number is 201300012345.".getBytes();
 BigInteger sig[] = instance.signature(m);
 System.out.println("Real signature verify result : " + instance.verify(m, sig));
 sig[0] = sig[0].add(BigInteger.ONE);
 System.out.println("Faked signature verify result : " + instance.verify(m, sig));
}

【1-2】完整參考代碼

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;


public class ElGamalSignatureInstance {
 int securitylevel = 1024;
 BigInteger p, g, x, y;
 
 public BigInteger __randomInZp() {
 BigInteger r = null;
 do {
 System.out.print(".");
 r = new BigInteger(securitylevel, new SecureRandom());
 }while(r.compareTo(p) >= 0);
 System.out.println(".");
 return r;
 }
 
 public BigInteger __randomPrimeInZp() {
 BigInteger r = null;
 do {
 System.out.print(".");
 r = new BigInteger(securitylevel, 100, new SecureRandom());
 }while(r.compareTo(p) >= 0);
 System.out.println(".");
 return r;
 }
 
 public BigInteger __hashInZp(byte m[]) {
 MessageDigest md;
 try {
 md = MessageDigest.getInstance("SHA-256");
 md.update(m);
  byte b[] = new byte[33];
  System.arraycopy(md.digest(), 0, b, 1, 32);
  return new BigInteger(b);
 } catch (NoSuchAlgorithmException e) {
 System.out.println("this cannot happen.");
 }
  return null;
 }
 
 public void initKeys() {
 System.out.println("choose a prime p with securitylevel " + securitylevel + " , please wait ...");
 p = new BigInteger(securitylevel, 100, new Random());
 System.out.println("p : " + p);
 g = __randomInZp();
 System.out.println("g : " + g);
 x = __randomInZp();
 System.out.println("x : " + x);
 y = g.modPow(x, p);
 System.out.println("y : " + y);
 
 }
 
 public BigInteger[] signature(byte m[]) {
 BigInteger sig[] = new BigInteger[2];
 BigInteger k = __randomPrimeInZp();
 sig[0] = g.modPow(k, p);
 sig[1] = __hashInZp(m).subtract(x.multiply(sig[0])).mod(p.subtract(BigInteger.ONE))
 .multiply(k.modInverse(p.subtract(BigInteger.ONE))).mod(p.subtract(BigInteger.ONE));
 System.out.println("[r,s] = [" + sig[0] + ", " + sig[1] + "]");
 return sig;
 }
 
 public boolean verify(byte m[], BigInteger sig[]) {
 BigInteger l = y.modPow(sig[0], p).multiply(sig[0].modPow(sig[1], p)).mod(p);
 BigInteger r = g.modPow(__hashInZp(m), p);
 return l.compareTo(r) == 0;
 }
 
 public static void main(String args[]) {
 ElGamalSignatureInstance instance = new ElGamalSignatureInstance();
 instance.initKeys();
 byte m[] = "my name is ElGamal, my student number is 201300012345.".getBytes();
 BigInteger sig[] = instance.signature(m);
 System.out.println("Real signature verify result : " + instance.verify(m, sig));
 sig[0] = sig[0].add(BigInteger.ONE);
 System.out.println("Faked signature verify result : " + instance.verify(m, sig));
 }
}

由于產生隨機大素數的方法(即__randomPrimeInZp)的運行速度受到 值和電腦CPU速度的影響,在某些同學的電腦上可能出現選取參數緩慢的問題。此時可將securitylevel的值調低(缺省1024,可調低到512),即可提高速度。但注意調低securitylevel將會導致安全強度下降。

【1-5】擴展內容:ElGamal加密算法和ElGamal簽名算法有何異同?
答:

(1)在產生公私鑰方面,二者幾乎完全一致。
(2)加密/簽名步驟,都需要先選取一個隨機數 并計算 作為其密文的第一分量(這也是ElGamal的概率輸出的原因所在)。不同點在于,加密算法后續采用 的方式產生密文第二分量,而簽名算法采用了 作為其第二分量。
(3)解密/驗證方面,解密算法采用 恢復明文,而簽名驗證算法采用公式 來驗證簽名是否吻合。

關于eclipse如何實現ElGamal數字簽名?就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大余县| 青州市| 旌德县| 宁南县| 伽师县| 清涧县| 揭阳市| 新营市| 时尚| 临泽县| 威远县| 涡阳县| 保定市| 泾川县| 罗田县| 渭源县| 新巴尔虎右旗| 武威市| 昌平区| 安丘市| 清原| 常州市| 驻马店市| 子洲县| 奎屯市| 敦化市| 福清市| 洪泽县| 宁晋县| 邢台县| 洛南县| 吐鲁番市| 武山县| 防城港市| 诸暨市| 堆龙德庆县| 辛集市| 沾益县| 蓝山县| 普兰店市| 青川县|