-
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
-
두 파일을 다운로드 후 프로젝트에 Drag and Drop
-
두 파일 우클릭 후 'Add to Build Path'
-
-
-
인증서: 컴퓨터에 저장된 개인키/공개키 파일
-
일반적으로 인증서 정보는 byte 형태로 저장되어있어 읽거나 처리가 어려우므로 키 데이터를 Base64 알고리즘을 이용해 사용하기 쉬운 형태로 인코딩 해서 관리함
-
PEM(Privacy Enhanced Mail) : 인코딩된 파일 .pem 확장자
-
코드 설명
-
임의의 타원 곡선 암호 키 생성
-
.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-----
반응형'Security' 카테고리의 다른 글
공개키 암호 시스템, 개인키 암호 시스템 (0) 2020.02.20 -