본문 바로가기
C++ 200제/코딩 IT 정보

BouncyCastle 자바 암호화 알고리즘, 3DES 등 예제 [Java강좌]

by vicddory 2017. 10. 18.

BouncyCastle 자바 암호화 알고리즘, 3DES 등 예제 [Java강좌]


1. BouncyCastle


꽤 방대한 자바 암호화 알고리즘을 가지고 있는 Bouncycastle 라이브러리입니다. 자세한 정보는 Bouncycastle 홈페이지[링크]에서 확인할 수 있습니다.


일반적으론 Eclipse에서 jar 파일 추가 등으로 간단히 사용할 수 있는데, 이 암호화 알고리즘을 안드로이드 프로젝트에서 사용하려면 압축 파일을 풀고, 프로젝트의 src 폴더 아래에 붙여넣기 한 후, bouncycastle를 사용할 자바 파일에서 import만 해줘야 합니다.


안드로이드에서는, 암호화 알고리즘 중 2중, 3중 Des 알고리즘 사용까지 확인해 봤습니다. 안드로이드에서 사용 시 이런저런 오류가 종종 발생하는데 자세한 이유는 모르겠군요. 안드로이드 SDK에 일부 라이브러리가 포함되었다는 말도 있지만, 확실친 않군요.

2. BouncyCastle 설정


우선 JCE 설정을 해야 합니다. JCE는 Oracle 홈페이지에서 다운 받으시고, JCE 설정은 이 포스팅(JCE 암호 라이브러리 설치 [링크])을 참조하세요.


JCE 설정이 끝났다면, 암호화 알고리즘 라이브러리인 Boucycastle 패키지를 다운로드 받습니다.


링크 - bouncycastle.zip [링크]


이후에 저처럼 생성된 프로젝트에 복사 후 붙여넣기를 하세요.


BouncyCastle 자바 암호화 알고리즘, 3DES 등 구현 방법 [자바강좌][자바 암호화 알고리즘] 3DES 강좌


※ 이후 아래 소스를 참고하세요.


전체 프로젝트 - MainClass.zip [링크]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
 
public class MainClass {
  public static void main(String[] args) throws Exception {
        
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        
    byte[] input = "ks".getBytes();
 
    byte[] keyBytes = new byte[]
      { 0x010x230x450x67, (byte)0x89, (byte)0xab, (byte)0xcd, (byte)0xef };
 
    byte[] ivBytes = new byte[] 
      { 0x000x010x020x030x000x000x000x01 };
 
    SecretKeySpec key = new SecretKeySpec(keyBytes, "DES");
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
    Cipher cipher = Cipher.getInstance("DES/CTR/NoPadding""BC");
 
    System.out.println("input : " + new String(input));
 
    // encryption pass
    cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
 
    byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
    int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
    ctLength += cipher.doFinal(cipherText, ctLength);
 
    System.out.println("cipher: " + new String(cipherText) + " bytes: " + ctLength);
 
    // decryption pass
    cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
 
    byte[] plainText = new byte[cipher.getOutputSize(ctLength)];
    int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
    ptLength += cipher.doFinal(plainText, ptLength);
 
    System.out.println("plain : " + new String(plainText) + " bytes: " + ptLength);
  } }
cs

3. 기타 자바 암호화 알고리즘 소스


BouncyCastle 14개의 암호화 알고리즘 소스는 맨 아래 압축 파일 참조하세요.


. Base64

. CACertGen

. CertGen


. Hash

. Keygen

. SecureRandom


. SimpleCipher

. Chpher_AlgParams

. Digest


. GenKeyPair

. Mac

. RSAEnc


. RSASignature

. x509CertGen_an - 압축 파일 해제 후 사용하세요 (javase.zip[링크])


BouncyCastle 자바[자바 암호화 알고리즘] 3DES 강좌


4. 짤막한 팁


첫번째, 안드로이드 프로젝트에 BouncyCastle jar 라이브러리를 등록할 경우 '이클립스+ADT'의 경우에는 libs 폴더 아래 복사해 넣으면 ADT가 자동으로 의존 라이브러리로 등록합니다. '안드로이드 스튜디오'의 경우에는 gradle 빌드 설정 파일(프로젝트 gradle 파일이 아닌 app 모듈 파일)에서 compile 구문을 통해 등록하면 됩니다.


그리고 두 IDE 모두 gradle 또는 maven 빌드 프로젝트로 변환한 경우에는 jcenter나 maven 저장소를 이용해서 암호화 알고리즘 라이브러리를 obtain 할 수 있습니다.


BouncyCastle 자바 암호화 알고리즘[자바 암호화 알고리즘] 3DES 강좌


두번째, SDK 내장된 bouncycastle과 따로 포함한 jar 간의 중복 패키지 관련 에러가 아닐까 싶습니다. 과거 apache httpclient 리패키징하여 사용한 것처럼... 리패키징이 필요할 수도...


세번째. Android SDK에는 라이트 버전의 bouncycastle 라이브러리가 확실히 포함되어 있습니다.

Security.getProviders의 리스트 결과, 이 결과에서의 각 엘리먼트의 provider.getServices의 리스트, 그리고 이 service의 getAlgorithm으로 확인 가능합니다.


(지원되는 알고리즘의 개수가 만족스럽지는 못하더군요... PBKDF2HmacSHA512를 사용하고 싶었지만... 라이트버전은 PBKDF2HmacSHA1만 지원하는 등...)


BouncyCastle 자바 암호화 알고리즘, 3DES 등 예제 [Java강좌]

댓글