eclipse 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)복호화/검증 에 있어 복호화 알고리즘 은 복구 명문 을 사용 하고 서명 검증 알고리즘 은 공식 으로 서명 이 일치 하 는 지 검증 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.