eclipse ECDSA 디지털 서명 실현

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(k3.무 작위 정수 r(r4.원 데이터 와 점 R 의 좌표 값 x,y 를 매개 변수 로 하고 SHA 1 을 hash,즉 Hash=SHA 1(원 데이터,x,y)로 계산한다.
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.등식 이 성립 되면 서명 을 받 습 니 다.그렇지 않 으 면 서명 이 무효 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기