ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Bouncy Castle의 ECDSA를 이용한 신원 인증 시스템 개발
    Security 2020. 3. 30. 02:09
    • 개인키와 공개키가 파일 형태로 컴퓨터에 남아있어서 저장하거나 불러오는 작업 수행 가능하도록 한다.

    • Bouncy Castle: Java에서 타원 곡선 암호화 기술을 쉽게 이용 가능하도록 해주는 라이브러리

      • 타원 곡선 암호화 기술에 필요한 라이브러리 : bcprov-jdk15on-159.jar와 bcpkix-jdkon-159.jar

      • https://www.bouncycastle.org/latest_releases.html

        1. 두 파일을 다운로드 후 프로젝트에 Drag and Drop

        2. 두 파일 우클릭 후 'Add to Build Path'

    • 인증서: 컴퓨터에 저장된 개인키/공개키 파일

      • 일반적으로 인증서 정보는 byte 형태로 저장되어있어 읽거나 처리가 어려우므로 키 데이터를 Base64 알고리즘을 이용해 사용하기 쉬운 형태로 인코딩 해서 관리함

      • PEM(Privacy Enhanced Mail) : 인코딩된 파일 .pem 확장자

    코드 설명

    1. 임의의 타원 곡선 암호 키 생성

    2. .pem 확장자로 내보내서 개인키/공개키를 컴퓨터 내에 저장

    • Pem.java : 특정한 개인키 혹은 공개키 정보를 읽어서 저장한 뒤에 파일로 내보내는 역할

    • EC.java : 타원 곡선 암호화 기술을 이용해 개인키 및 공개키를 생성해 저장 (sect163k1 알고리즘 사용)

    • BlockchainStarter.java : 실행

     

    Pem.java

    // 특정한 개인키, 공개키 정보를 읽어 저장한 뒤에 파일로 내보내는 역할을 수행
    package util;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.security.*;
    
    import org.bouncycastle.util.io.pem.PemObject;
    import org.bouncycastle.util.io.pem.PemWriter;
    
    public class Pem {
    	
    	private PemObject pemObject;
    	
    	// Key data, description PEM 객체에 저장
    	public Pem (Key key, String description) {
    		this.pemObject = new PemObject(description, key.getEncoded());
    	}
    	
    	// 특정한 파일 이름으로 PEM 파일 저장
    	public void write(String filename) throws FileNotFoundException, IOException {
    		PemWriter pemWriter = new PemWriter(new OutputStreamWriter(new FileOutputStream(filename)));
    		try {
    			pemWriter.writeObject(this.pemObject);
    		} finally {
    			pemWriter.close();
    		}
    	}
    
    }

    EC.java

    package util;
    
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.security.Key;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.SecureRandom;
    import java.security.spec.ECGenParameterSpec;
    
    public class EC {
    	// 세부 알고리즘 sect163k1
    	private final String ALGORITHM = "sect163k1";
    	
    	public void generate(String privateKeyName, String publicKeyName) throws Exception {
    		// ECDSA(bouncy castle의 타원 곡선 표준 알고리즘) 사용
    		KeyPairGenerator generator = KeyPairGenerator.getInstance("ECDSA", "BC");
    		
    		// 세부 알고리즘 sect163k1
    		ECGenParameterSpec ecsp;
    		ecsp = new ECGenParameterSpec(ALGORITHM);
    		generator.initialize(ecsp, new SecureRandom());
    		
    		// 해당 알고리즘으로 랜덤의 키 한 쌍 생성
    		KeyPair keyPair = generator.generateKeyPair();
    		System.out.println("타원곡선 암호키 한 쌍을 생성했습니다.");
    		
    		// 생성한 키 한쌍에서 개인키와 공개키를 추출
    		PrivateKey priv = keyPair.getPrivate();
    		PublicKey pub = keyPair.getPublic();
    		
    		// 개인키와 공개키를 특정한 파일 이름으로 저장
    		writePemFile(priv, "EC PRIVATE KEY", privateKeyName);
    		writePemFile(priv, "EC PUBLIC KEY", publicKeyName);
    		
    	}
    
    	// PEM 클래스로 생성된 암호키를 파일로 저장하는 함수
    	private void writePemFile(Key key, String description, String filename) 
    				throws FileNotFoundException, IOException {
    		Pem pemFile = new Pem(key, description);
    		pemFile.write(filename);
    		
    		System.out.println(String.format("EC 암호키 %s를 %s 파일로 내보냈습니다.", 
    				description, filename));
    	}
    
    }

    BlockchainStarter.java

    package core;
    import java.security.Security;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import util.EC;
    
    public class BlockChainStarter {
    	public static void main(String[] args) throws Exception {
    		
    		// 바운시 캐슬의 암호화 라이브러리 사용
    		Security.addProvider(new BouncyCastleProvider());
    		
    		// 타원 곡선 객체 생성 개인키과 공개키를 각각 private.pem public.pem으로 저장
    		EC ec = new EC();
    		ec.generate("private.pem", "public.pem");
    	}
    
    }
    • 실행 하면 `private.pem`, `public.pem` 두 파일 생성된 것을 확인 가능하다.

    • 작성된 파일은 랜덤으로 생성해서 저장하기에 매번 키 값이 변경된다.

       

       

    private.pem

    -----BEGIN RSA PRIVATE KEY-----
    MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKb7IQ+niN9SbTp6
    0XAmCapWJ0qoZM8D/yLft7tmx0loXjWwO4yjP78qO9Z0VsEFoC94NvjtWjhpFmMZ
    pg9n0mYY4Wm4MzUaOW/LfQ+PlrBzDFmBJHgYnD6UBDuOnQWP7LUYHpPDI8zb2CIw
    vTMgqTznmia7dpEb6aFlTebGOeDFAgMBAAECgYAVoN4bqbrmGEZbJojlwpuKY23j
    8vNZyB3+PaWOAcZK6RiY0iqocQXDBFyrTrbk+g5RT7wpGo9O0rfKXspeYPeEud33
    nHqs8l2vioOTIuSWU3SBWy6bpWcrYIH2gJnefQqNyKNE5vMOVHgaT5ssSrfjp0PC
    VYPL3aScHjBOhV5E2QJBANNOZ6apDdpBdbETlCAeLbhQMi0YSawHiSs12mFmI+jn
    JuWL2ZHAI6vSUKZo0N7J2bi5jmiI/RwnoaRmyGJCc40CQQDKTKTDPARuhTkDa8MX
    PPFgUfWffOC3HvFETiY7Uw+dgXaMWcIrqR7S7alRpiLx3d5L9Zq0plHEcElrYNQL
    /PgZAkEAmelqJkLNDETR7QFNy3cv5ijD44TlZKC4kPjQ8FDtpx93fYu4FinV0bmH
    dS6ztRNhuuOtjwb5FiDn5E/ZdXjhoQJAaOYLPY1eguyj3qk/VUpto1N8eQHpCCuM
    Ua3wVyy/2R1rmmVksP0WFavU85ihYCd7AIpPeUMQ/Tp4Z6yi58B56QJBAKsOofIR
    05Cfg7QsyFQigapHw5+R9CuedmiYMiETcdOcCy4smLThBRghcyHh4uvDICRC89bf
    o2ywjTZjPCKPWM0=
    -----END RSA PRIVATE KEY-----
    

    public.pem

    -----BEGIN RSA PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm+yEPp4jfUm06etFwJgmqVidK
    qGTPA/8i37e7ZsdJaF41sDuMoz+/KjvWdFbBBaAveDb47Vo4aRZjGaYPZ9JmGOFp
    uDM1Gjlvy30Pj5awcwxZgSR4GJw+lAQ7jp0Fj+y1GB6TwyPM29giML0zIKk855om
    u3aRG+mhZU3mxjngxQIDAQAB
    -----END RSA PUBLIC KEY-----
    

     

     

     

     

     

    출처 : http://www.bitweb.co.kr/m/view.php?idx=886

    반응형

    'Security' 카테고리의 다른 글

    공개키 암호 시스템, 개인키 암호 시스템  (0) 2020.02.20
Designed by Tistory.