eclipse DSA 디지털 서명 실현
실험 목적
ElGamal와Schorr디지털 서명 알고리즘 을 파악 한 토대 에서 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) );
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
m1 이클립스에 oracle cloud (오라클 클라우드)연결하기m1에는 oracle이 설치되지 않는다.... 큰맘먹고 지른 m1인데 oracle이 설치되지 않는다니... 하지만 이뻐서 용서가 된다. 이거 때문에 웹 개발 국비수업을 듣는 도중에 몇번 좌절하고 스트레스를 크게 받았...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.