eclipse DSA 디지털 서명 실현

DSA 디지털 서명,참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
실험 목적
ElGamalSchorr디지털 서명 알고리즘 을 파악 한 토대 에서 DSA 서명 알고리즘 을 더욱 배우 고 파악 했다.이 알고리즘 이 서명 정보의 길 이 를 어떻게 낮 추 는 지 깊이 이해 했다.
2.실험 요구
4.DSA 디지털 서명 알고리즘 을 배운다.
5.자바 BigInteger 류 를 어떻게 사용 하 는 지 파악 하고 가장 기본 적 인 DSA 공개 키 서명 알고리즘 을 간단하게 실현 합 니 다.
6.DSA 서명 알고리즘 과 RSA 알고리즘 의 차 이 를 깊이 이해한다.
3.개발 환경
JDK 1.7,자바 개발 환경(이 실험 은 윈도 우즈+eclipse 를 실험 환경 으로 사용),실험 에 참여 한 학생 들 에 게 대칭 암호 화 제공 방법 에 따라 JDK 를 미리 설치 하도록 요구 합 니 다.
실험 원리
ElGamal 과 Schorr 디지털 서명 알고리즘 을 파악 한 토대 에서 DSA 서명 알고리즘 을 더욱 배우 고 파악 했다.이 알고리즘 이 서명 정보의 길 이 를 어떻게 낮 추 는 지 깊이 이해 하 였 습 니 다(그 중 중요 한 매개 변수 가 512 bit 의 소수 로 선택 되 었 을 때 ElGamal 서명 의 길 이 는 1024 bit 이 고 DSA 에 서 는 160 bit 의 소 수 를 통 해 서명 의 길 이 를 320 bit 로 낮 출 수 있 습 니 다).이로써 저장 공간 과 전송 대역 폭 을 줄 였 습 니 다.
코드 세그먼트:

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) );
  }
  
}
 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기