eclipse ElGamal 디지털 서명 실현

ElGamal 디지털 서명,참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
실험 목적
ElGamal 알고리즘 이 디지털 서명 에 사용 되 는 것 을 배우 고 교과서 버 전의 ElGamal 디지털 서명 알고리즘 의 작성 을 파악 하 며 ElGamal 암호 화 알고리즘 과 ElGamal 디지털 서명 알고리즘 의 공통점 과 차이 점 을 파악 합 니 다.
2.실험 요구
1.ElGamal 디지털 서명 알고리즘 익히 기.
2.자바 BigInteger 류 를 어떻게 사용 하 는 지 파악 하고 교과서 식 ElGamal 공개 키 서명 알고리즘 을 간단하게 실현 합 니 다.
3.ElGamal 암호 화 알고리즘 과 ElGamal 디지털 서명 알고리즘 의 공통점 과 차이 점 을 알 아 봅 니 다.
3.개발 환경
JDK 1.7,자바 개발 환경(이 실험 은 윈도 우즈+eclipse 를 실험 환경 으로 사용),실험 에 참여 한 학생 들 에 게 대칭 암호 화 제공 방법 에 따라 JDK 를 미리 설치 하도록 요구 합 니 다.
4.실험 내용
[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 속도 의 영향 을 받 아 일부 학생 들 의 컴퓨터 에서 매개 변 수 를 선택 하 는 느 린 문제 가 발생 할 수 있 습 니 다.이 때 security level 의 값 을 낮 출 수 있 습 니 다(1024 부족,512 로 낮 출 수 있 습 니 다).속 도 를 높 일 수 있 습 니 다.그러나 security level 을 낮 추 는 것 은 안전 강 도 를 떨 어 뜨 릴 수 있 습 니 다.
[1-5]확장 내용:ElGamal 암호 화 알고리즘 과 ElGamal 서명 알고리즘 은 어떤 차이 가 있 습 니까?
답:
(1)공개 키 가 발생 하 는 데 있어 이들 은 거의 일치 합 니 다.
(2)암호 화/서명 절 차 는 모두 무 작위 수 를 선택 하고 비밀문서 의 첫 번 째 분량 으로 계산 해 야 한다(이것 도 ElGamal 의 확률 로 출력 하 는 원인 이다).다른 점 은 암호 화 알고리즘 이 후속 적 으로 사용 하 는 방식 으로 비밀문서 의 두 번 째 분량 을 만 들 었 고 서명 알고리즘 은 두 번 째 분량 으로 사용 했다 는 것 이다.
(3)복호화/검증 에 있어 복호화 알고리즘 은 복구 명문 을 사용 하고 서명 검증 알고리즘 은 공식 으로 서명 이 일치 하 는 지 검증 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기