JCA & JCE
1 설명
가) JCA는 Runtime enviroment의 일부
나) JCE는 JDK에 들어 있지 않은 JCA의 확장팩
나) JDK는 JCA에 정의된 특정한 암호 함수만 사용 가능
2 JCA
가) 전자 서명과 메시지 다이제스트 같은 기능에 대한 일반적인 API 제공
나) 주요 클래스들
① MessageDigest
② Signature
③ KeyPaireGenerator
④ KeyFactory
⑤ CertificateFactory
⑥ KeyStore
⑦ AlgorithmParameters
⑧ AlgorithmParameterGenerator
⑨ SecureRandom
다) 암호 서비스 제공자 Sun Provider(Java 2 기준, sun.security.provider.Sun)
① MD5 메시지 다이제스트
② SHA-1 메시지 다이제스트
③ DSA 전자 서명 사인과 검증
④ DSA 키 쌍 생성
⑤ DSA 키 변환
⑥ X.509 인증서 생성
⑦ Proprietary keystore 구현
⑧ DSA 알고리즘 매개변수
⑨ DSA 알고리즘 매개변수 생성
라) 암호 서비스 제공자 RSAJAC provider(com.sun.rsajca.Provider)
① RSA 키 쌍 생성
② RSA 키 변환
③ SHA-1 또는 MD5 메시지 다이제스트를 이용한 RSA 서명
마) JCA 접근
MessageDigest myMessageDigest = MessageDigest.getInstance(“MD5”);
myMessageDigest.update(myData);
byte[] signatureBytes = myMessageDigest.digest();
3 JCE(javax.crypto)
가) 주요 클래스와 인터페이스
① Cipher
② KeyAgreement
③ KeyGenerator
④ Mac
⑤ SecretKey
⑥ SecretKeyFactory
나) JCE 접근
KeyGenerator keyGenerator = KeyGenerator.getInstance(“Blowfish”);
Key key = keyGenerator.generatorKey();
Cipher cipher = Cipher.getInstance(“Blowfish/ECB/PKCS5Padding”);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = cipher.doFinal(myData);
다) JCE 설치
이름
BouncyCastle
URL
http://www.bouncycastle.org
라이선스
오픈소스
참고문서
http://www.bouncycastle.org/docs/docs1.6/index.html
보통 썬의 JCE를 사용하기를 원하지만 일단 Sun의 JCE가 설치되고 나면 다른 것을 사용하지 못한다. 즉 Sun의 JCE는 DES, TripleDEs, Blowfish, Difie-Hellman외에는 사용할 수가 없다. 따라서 Bouncy Castle를 추천한다.
라) Bouncy Castle 설치 (http://id0min.tistory.com/125 참조함)
① http://www.bouncycastle.org/latest_releases.html에서 자신의 JDK 버전에 해당되는 최신 버전을 다운로드 받는다. 다운받은 파일을 JDK과 JRE가 설치된 폴더에서 jre/lib/ext에 저장한다.
② 양쪽 폴더에서 jre/lib/security 폴더에 있는 java.security 파일을 다음과 같이 수정한다. 숫자 10은 provider 순서에 따라 수정한다.
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
③ unrestricted policy 파일들을 다운로드 받아 양쪽 폴더에서 jre/lib/security 폴더에 local_policy.jar와 US_export_policy.jar 파일을 교체한다. 아래 URL에서 파일을 다운로드 받아서 풀어보면 위의 2개 파일 있다. 덮어 씌우면 된다.
④ 설치한 후에 동작하는지 검증한다.
마) 테스트 소스
public static void main(String[] args) {
String providerName = "BC";
KeyGenerator keyGenerator = null;
if(Security.getProvider(providerName) == null)
System.out.println(providerName + " provider not installed");
else
System.out.println(providerName + " is installed");
// Blowfish는 블록 암호화 방식
System.out.println("Attepting to get a Blowfish key...");
try {
keyGenerator = KeyGenerator.getInstance("Blowfish");
} catch (NoSuchAlgorithmException e) {
}
keyGenerator.init(128);
SecretKey key = keyGenerator.generateKey();
System.out.println("OK");
//암호화 한다
System.out.println("Attempting to get a Cipher and encrypt...");
Cipher cipher = null;
byte[] ciphertext = null;
try {
cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
} catch (NoSuchAlgorithmException e) {}
catch (NoSuchPaddingException e) {}
try {
cipher.init(Cipher.ENCRYPT_MODE, key);
} catch (InvalidKeyException e) {}
try {
ciphertext = cipher.doFinal("This is a test".getBytes("UTF8"));
} catch (IllegalBlockSizeException e) {}
catch (BadPaddingException e) {}
catch (UnsupportedEncodingException e) {}
System.out.println("OK");
System.out.println("Test completed successfully : " + ciphertext);
}
(http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html)
출처 : http://sinpk.tistory.com/entry/%EC%95%94%ED%98%B8%ED%99%94-JCA-JCE
'Java > Common' 카테고리의 다른 글
[java]Calendar 사용법 (0) | 2015.05.29 |
---|---|
[java]object byte 상호변환 (0) | 2014.11.14 |
[java]한글 초성, 중성, 종성 분리 (0) | 2014.10.24 |