2010년 6월 18일 금요일

비대칭키를 이용한 암-복호화

1. keystore에 키 생성
2. keystore의 키로 인증서 파일 생성
3. 공개키암호화, 비밀키복호화 코드 작성

Keystore에 키 생성

D:\jks>keytool -genkey -alias test -keyalg RSA -keystore test.jks
keystore 암호를 입력하십시오:
새 암호를 다시 입력하십시오:
이름과 성을 입력하십시오.
[Unknown]: Beauty Kim
조직 단위 이름을 입력하십시오.
[Unknown]: Dev
조직 이름을 입력하십시오.
[Unknown]: MyCompany
구/군/시 이름을 입력하십시오?
[Unknown]: Seoul
시/도 이름을 입력하십시오.
[Unknown]: Seoul
이 조직의 두 자리 국가 코드를 입력하십시오.
[Unknown]: KR
CN=Beauty Kim, OU=Dev, O=MyCompany, L=Seoul, ST=Seoul, C=KR이(가) 맞습니까?
[아니오]: y

에 대한 키 암호를 입력하십시오.
(keystore 암호와 같은 경우 Enter를 누르십시오):



인증서 파일 생성
D:\jks>keytool -export -alias test -keystore test.jks -file test.cer
keystore 암호를 입력하십시오:
인증서가 파일에 저장되었습니다.

공개키암호화, 비밀키복호화 코드



package jca.test;

import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PublicKey;
import java.security.cert.Certificate;

import javax.crypto.Cipher;

import org.junit.Test;

import com.lowagie.text.pdf.codec.Base64;

public class KeyStoreTest {

@Test
public void testKeyStore() throws Exception {
KeyStore keyStore = KeyStore.getInstance("JKS");
char[] password = "changeit".toCharArray();

FileInputStream in = null;
try {
in = new FileInputStream("d:/jks/test.jks");
keyStore.load(in, password);
} finally {
if(in != null) {
in.close();
}
}

byte[] data = "this is sample data".getBytes("utf8");

Certificate certificate = keyStore.getCertificate("test");

System.out.println("certificate: ");
System.out.println(certificate);

PublicKey publicKey = certificate.getPublicKey();

Key key = keyStore.getKey("test", "changeit".toCharArray());

System.out.println("key");
System.out.println(key);

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

byte[] cipherText = cipher.doFinal(data);
System.out.println("cipher text length: " + cipherText.length);
System.out.println("cipher text: " + Base64.encodeBytes(cipherText));

cipher.init(Cipher.DECRYPT_MODE, key);
byte[] result = cipher.doFinal(cipherText);

System.out.println("result: " + new String(result));
}
}

댓글 없음:

댓글 쓰기