eclipse ECDSA 디지털 서명 실현
실험 목적
암호학 라 이브 러 리 를 사용 하여 타원 곡선 을 기반 으로 한 서명 방안 을 실현 하고 간단 한 실험 코드 를 작성 하여 정확 한 ECDSA 서명 과 검증 을 할 수 있 습 니 다.
2.실험 요구
1.ECDSA 알고리즘 의 기본 원 리 를 숙지 한다.
2.자바 를 어떻게 사용 하여 ECDSA 알고리즘 을 간단하게 실현 하 는 지 알 아 보기;
3.ECDSA 서명 알고리즘 을 사용 한 간단 한 코드 실험 을 파악 합 니 다.
3.개발 환경
JDK 1.8,자바 관련 개발 환경(이 실험 은 윈도+eclipse 를 실험 환경 으로 사용)실험 에 참여 한 학생 들 에 게 jdk 를 미리 설치 하도록 요구 합 니 다.
4.실험 내용
【1-1】 ECDSA 서명 및 검증 실험
1.다음 함수 로 시스템 초기 화 및 키 생 성:
public static void KeyGenerator() throws Exception {
// //
System.out.println(" ……");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
keyPairGenerator.initialize(256);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic();
ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate();
// publicKey.key privateKey.key
String path = new File("").getCanonicalPath();
out(path + "\\privateKey.key", Base64.getEncoder().encodeToString(ecPrivateKey.getEncoded()));
out(path + "\\publicKey.key",Base64.getEncoder().encodeToString(ecPublicKey.getEncoded()));
System.out.println(" :" + path + "\\publicKey.key");
System.out.println(" :" + path + "\\privateKey.key");
System.out.println(" 。");
}
그 중에서 public static KeyPairGenerator getInstance(String algorithm)를 사용 합 니 다.키 쌍 생 성 기 를 만 드 는 방법 은 타원 곡선'EC'와 같은 키 알고리즘 을 사용 하 는 문자열 을 매개 변수 로 해 야 합 니 다.public void initialize(int keysize)사용 하기;키 쌍 을 초기 화 합 니 다.매개 변수 keysize 는 생 성 된 key 의 길 이 를 설명 하 는 데 사 용 됩 니 다.이론 적 으로 이 매개 변수의 값 이 클 수록 암호 화 된 데 이 터 는 해독 되 기 어렵 지만 암호 화 할 때 계산 자원 을 소모 합 니 다.
keyPairGenerator.generateKeyPair().getPublic()사용 하기;동적 생 성 공개 키
keyPairGenerator.generateKeyPair().getPrivate()사용 하기;동적 생 성 비밀 키
2.다음 함수 로 서명 과정 을 수행 합 니 다.
//
public static byte[] SignGen(byte[] ECprivateKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance("EC");
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ECprivateKey);
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Signature signature = Signature.getInstance("SHA1withECDSA");
signature.initSign(privateKey);
signature.update(data.getBytes());
byte[] result = signature.sign();
return result;
}
그 중에서 KeyFactory.getInstance(String algorithm)를 사용 합 니 다.키 공장 을 예화 합 니 다.이 방법 은 어떤 키 알고리즘 을 사용 하 는 지 설명 하 는 문자열 이 필요 합 니 다.예 를 들 어 이 알고리즘 에서 타원 곡선'EC'를 사용 합 니 다.새 PKCS8EncodedKeySpec(ECprivateKey)사용 하기;keyFactory.generatePrivate(pkcs8En)
codedKeySpec);비밀 키 를 바이트 배열 에서 비밀 키 로 변환 합 니 다.
Signature.getInstance(String algorithm)사용 하기;서명 에 사용 할 해시 함 수 를 지정 합 니 다.이 알고리즘 에 서 는 SHA 1 을 사용 합 니 다.
signature.initSign(privateKey)사용 하기;signature.update(data.getBytes();메시지 서명
3.다음 함 수 를 사용 하여 인증 서명 을 실현 합 니 다.
//
public static booleanVerifiGen(byte[] ECpublicKey, byte[] result) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance("EC");
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ECpublicKey);
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Signature signature = Signature.getInstance("SHA1withECDSA");
signature.initVerify(publicKey);
signature.update(data.getBytes());
boolean bool = signature.verify(result);
return bool;
}
그 중에서 KeyFactory.getInstance(String algorithm)를 사용 합 니 다.키 공장 을 예화 합 니 다.이 방법 은 어떤 키 알고리즘 을 사용 하 는 지 설명 하 는 문자열 이 필요 합 니 다.예 를 들 어 이 알고리즘 에서 타원 곡선'EC'를 사용 합 니 다.new PKCS8EncodedKeySpec(ECpublicKey)사용 하기;keyFactory.generatePrivate(pkcs8En)
codedKeySpec);공개 키 를 바이트 배열 에서 공개 키 로 변환 합 니 다.
Signature.getInstance(String algorithm)사용 하기;서명 에 사용 할 해시 함 수 를 지정 합 니 다.이 알고리즘 에 서 는 SHA 1 을 사용 합 니 다.
signature.initVerify(publicKey)사용 하기;signature.update(data.getBytes();서명 이 올 바른 지 확인 하기
signature.verify(result)사용 하기;인증 결 과 를 되 돌려 줍 니 다.true orfalse
[1-2]참조 코드
package ECDSA.demo;
import java.io.*;
import java.security.*;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Scanner;
public class ECDSA {
private static String data ;
//
public static void KeyGenerator() throws Exception {
System.out.println(" ……");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
keyPairGenerator.initialize(256);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic();
ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate();
// publicKey.key privateKey.key
String path = new File("").getCanonicalPath();
out(path + "\\privateKey.key", Base64.getEncoder().encodeToString(ecPrivateKey.getEncoded()));
out(path + "\\publicKey.key",Base64.getEncoder().encodeToString(ecPublicKey.getEncoded()));
System.out.println(" :" + path + "\\publicKey.key");
System.out.println(" :" + path + "\\privateKey.key");
System.out.println(" 。");
}
//
public static byte[] SignGen(byte[] ECprivateKey) throws Exception {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ECprivateKey);
KeyFactory keyFactory = KeyFactory.getInstance("EC");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Signature signature = Signature.getInstance("SHA1withECDSA");
signature.initSign(privateKey);
signature.update(data.getBytes());
byte[] result = signature.sign();
return result;
}
//
public static boolean VerifiGen(byte[] ECpublicKey, byte[] result) throws Exception {
X509EncodedKeySpec x509encodedkeyspec= new X509EncodedKeySpec(ECpublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("EC");
PublicKey publicKey = keyFactory.generatePublic(x509encodedkeyspec);
Signature signature = Signature.getInstance("SHA1withECDSA");
signature.initVerify(publicKey);
signature.update(data.getBytes());
boolean bool = signature.verify(result);
return bool;
}
//
public static void out(String path, String val) {
try {
val = Base64.getEncoder().encodeToString(val.getBytes("utf-8"));
FileWriter fw = new FileWriter(path);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter outs = new PrintWriter(bw);
outs.println(val);
outs.flush();
outs.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
//
public static byte[] read(String path){
byte[] sk = null;
try {
File f=new File(path);
FileReader fr=new FileReader(f);
BufferedReader br=new BufferedReader(fr);
String line=null;
StringBuffer sb=new StringBuffer();
while((line=br.readLine())!=null) {
byte[] b = Base64.getDecoder().decode(line);
String[] key = new String(b,"utf-8").split(",,,,,,");
System.out.println("
");
if(key.length == 1){
sk = Base64.getDecoder().decode(key[0]);
}
else{
throw new Exception(" ");
}
}
br.close();
return sk;
}
catch(Exception ex)
{
ex.printStackTrace();
}
return sk;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
KeyGenerator();
Scanner sc = new Scanner(System.in);
String str = "";
//
sc.useDelimiter("
");
System.out.print("
"+" :");
if (sc.hasNext()) {
data = sc.next();
}
//
sc.useDelimiter("
");
System.out.print("
"+" :");
if (sc.hasNext()) {
str = sc.next();
}
//
byte[] ECprivateKey = read(str.substring(0,str.length()-1));
//
byte[] result = SignGen(ECprivateKey);
System.out.println(" :"+ Base64.getEncoder().encodeToString(result));
new Scanner(System.in);
sc.useDelimiter("
");
System.out.print("
"+" :");
if (sc.hasNext()) {
str = sc.next();
}
//
byte[] ECpublicKey = read(str.substring(0,str.length()-1));
boolean bool = VerifiGen(ECpublicKey, result);
if(bool == true){
System.out.println(" : !");
}
else {
System.out.println(" !");
}
} catch (Exception ex) {
System.out.println(" !");
// System.out.println(ex);
}
}
}
[1-3]참고 자료 확장1、 ESCDA 알고리즘 원리:
ECDSA 는 ECC 와 DSA 의 결합 으로 서명 알고리즘 은 ECC 다.
서명 과정 은 다음 과 같 습 니 다.
1.타원 곡선 Ep(a,b)와 기점 G 를 선택 하 십시오.
2.개인 키 k(k
5.계산 s▼r-Hash*k(mod n)
6.r 와 s 를 서명 값 으로 하고 r 와 s 중 하나 가 0 이면 3 단계 부터 다시 실행 합 니 다.
검증 과정 은 다음 과 같 습 니 다.
1.수신 자 는 메시지(m)와 서명 값(r,s)을 받 은 후에 다음 과 같은 연산 을 한다.
2.계산:sG+H(m)P=(x1,y1),r1.
3.검증 등식:r1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.r mod p.
4.등식 이 성립 되면 서명 을 받 습 니 다.그렇지 않 으 면 서명 이 무효 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.