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 |
|
라이선스 |
오픈소스 |
참고문서 |
보통 썬의 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); } |
'소프트웨어 > java암호화' 카테고리의 다른 글
[암호화] 인증(Authentication)과 전자서명 (0) | 2013.09.06 |
---|---|
[암호화]블록 암호화 Padding (0) | 2013.09.06 |
[암호화] 비대칭암호화 - RSA 파일 암호화 (0) | 2013.09.06 |
[암호화] 대칭 암호화 - 기본암호화 / Blowfish를 이용한 암호화 (0) | 2013.09.06 |
[암호화]패스워드 기반 암호화(PBE : Password-Based Encryption) (0) | 2013.09.06 |