Basilica android

sharku.egloos.com



카카오톡 분석하기 (5) - 암호화와 복호화(PBEWithSHAAnd256BITAES-CBC-BC) by sharku

1. bc의 jar 파일 다운받기
우선 bc라는 놈을 이해해야합니다

"PBEWithSHAAnd256BITAES-CBC-BC"
이건 무엇인가..!!
바로 암호화 방식이었슴다
제공자는 BC였다

BC라는 것은 bounty castle 이라는 어떤 집단을 지칭하는 것이고
쉽게 말하면 provider, 이런 알고리즘을 제공하는 곳이네요
이 소스를 다운받아야 하는데
여기에 가면 필요한 것만 받을 수 있어요
(전 bcprov-jdk15on-149.jar를 받았어요 아무거나 받아도 됩니다)
bc에 대해서 자세히 알고 싶다면 
여기에 들어가서 자세히 공부해도 되구요..

참으로 멋진곳인거 같아요..
위 사항을 찾아내려고 괜한 함수들을 쪼갰다 붙였다 여러번..
검색도 수십번 한것 같은데
결국 겨우겨우 해서 찾아낸 결과가 jar 파일을 추가하면 된다는 것입니다
하하하..
역시 삽질은 공부중에 제일인거같아요ㅋㅋ

그렇다면 이제 jar 파일을 java에 추가해줘야 하는데
jar 을 추가하는 것도 안보면 까먹기에 여기에 기록해두겠습니다
[java 폴더] - [jre7] - [lib] - [ext]
폴더 안에 붙여넣기 한 후
아래 구문을 jre/lib/security/java.security 파일에 써줍니다
security.provider.#=org.bouncycastle.jce.provider.BouncyCastleProvider
#대신에 숫자를 써주면 됩니다. 보면 비슷한 리스트들이 있는데 제일 마지막에 써주면 됩니다

위와 같은 방법으로 추가해줘야 기본 제공자로 인식이 됩니다


2. 키 값 수정해주기
또 실행해보면 오류가 나는데
이제 init 함수에서 key 값 크기가 안된다고 하네요
key 값을 점검해봅니다
문제는 AES/CBC/PKCS5Padding 이 256이 지원이 안된다고 합니다..
어떻게 지원했을까요.. 찾아봅시다..하하하..

엄청난 디버깅과 뒤적뒤적의 결과로.. ㅋㅋ
역시나 bc에서 지원하는 jce 파일을 사용해야 한다는 결론에 이르렀습니다 ㅋ
시작해봅시다 과연 어떤지..
똑같이 위에 주소로 들어가보면

SIGNED JAR FILES 라는 부분의 바로 위쪽에 보면

crypto-149.zip 라는 파일을 다운받아 주면 됩니다
용량이 커서 다운이 좀 걸립니다
1번부터 이 파일을 받아서 bcprov-jdk15on-149.jar 파일만 빼내서 써도 됩니다

여기서 중요한 파일은
jce-jdk13-149.jar 파일입니다
(위치는 압축푼 폴더에서 [crypto-149] - [jars] 에 있습니다)

파일의 이름을 jce.jar 로 바꿔줍니다
그리고 자바가 설치된 폴더 안에 기존의 jce.jar 파일에 덮어쓰기 해줍니다
(폴더는 [Java] - [jre] - [lib] 폴더입니다)

이제 암호화는 무조건 bc가 만들어주신 클래스들을 감사히 쓰기만 하면 됩니다
다시 실행시켜 보면 무사히 실행되는 것을 알 수 있습니다.. 몇개만 돌려보겠습니다

그리고 base64 부분이 잘 안되는것 같아서 어떤 분의 조언대로
이 부분도 import로 추가시켰습니다..

최종적으로 완성된 코드는 다음과 같습니다

main.java

  1. package com.kakao;
  2.  
  3. class Main {
  4.         public static void main(String args[]) {
  5.                 byte[] a = { 1023-4207347-3827-2211-20-22373654 };
  6.                 y m = new y(a);
  7.                
  8.                 System.out.print("Completed : " + m.en("010-1234-1234") + "\n");
  9.                 System.out.print("Completed : " + m.de("HUo0cYf2sbfF8C1awxkOJQ==") + "\n");
  10.                 System.out.print("            " + "123465789 123465789 123465789 123465789 123465789 123465789 " + "\n");
  11.         }
  12. }
  13.  

실행시키면 아래같은 결과가 나옵니다
위의 complete가 암호화
아래 complete가 복호화가 되겠습니다

y.java (a 파일 대신에 base64 함수를 사용했습니다)

  1. package com.kakao;
  2.  
  3. import java.security.GeneralSecurityException;
  4. import javax.crypto.Cipher;
  5. import javax.crypto.SecretKey;
  6. import javax.crypto.SecretKeyFactory;
  7. import javax.crypto.spec.IvParameterSpec;
  8. import javax.crypto.spec.PBEKeySpec;
  9. import javax.crypto.spec.SecretKeySpec;
  10.  
  11. public final class y
  12. {
  13.   private static final byte[] salt = { 1023-4207347-3827-2211-20-22373654 };
  14.   //salt
  15.   private static final char[] pswd = { 421081207551133933101352107 };
  16.   // password
  17.   private Cipher c;
  18.   private Cipher d;
  19.   public y(String paramString1, String paramString2, byte[] paramArrayOfByte)
  20.   {
  21.     try
  22.     {
  23.         PBEKeySpec PKS = new PBEKeySpec(pswd, paramArrayOfByte, 2256);
  24.         SecretKeyFactory SKF = SecretKeyFactory.getInstance(paramString1);
  25.         SecretKey tmp = SKF.generateSecret(PKS);
  26.         SecretKey SK = new SecretKeySpec(tmp.getEncoded(),"AES");
  27.       this.c = Cipher.getInstance(paramString2);
  28.       this.c.init(1, SK, new IvParameterSpec(salt));
  29.       this.d = Cipher.getInstance(paramString2);
  30.       this.d.init(2, SK, new IvParameterSpec(salt));
  31.       return;
  32.     }
  33.     catch (GeneralSecurityException localGeneralSecurityException)
  34.     {
  35.       throw new RuntimeException(localGeneralSecurityException);
  36.     }
  37.   }
  38.   public y(byte[] paramArrayOfByte)
  39.   {
  40.         this("PBEWITHSHAAND256BITAES-CBC-BC""AES/CBC/PKCS5Padding", paramArrayOfByte);
  41.   }
  42.  
  43.   public final String en(String paramString)
  44.   {
  45.     String str;
  46.     if (paramString == null)
  47.       str = null;
  48.     while (true)
  49.     {
  50.       try
  51.       {
  52.           str = new String(Base64.encode(this.c.doFinal(paramString.getBytes("UTF-8"))));
  53.       }
  54.       catch (Exception localException)
  55.       {
  56.         throw new RuntimeException(localException);
  57.       }
  58.       finally
  59.       {
  60.       }
  61.  
  62.       return str;
  63.     }
  64.   }
  65.  
  66.   public final String de(String paramString)
  67.   {
  68.     String str;
  69.     if (paramString == null)
  70.       str = null;
  71.     while (true)
  72.     {
  73.       try
  74.       {
  75.         str = new String(this.d.doFinal(Base64.decode(paramString)),"UTF-8");
  76.       }
  77.       catch (Exception localException)
  78.       {
  79.         throw new RuntimeException(localException);
  80.       }
  81.       finally
  82.       {
  83.       }
  84.       return str;
  85.     }
  86.   }
  87. }


Base64.java 파일은 생략하겠습니다 다운받은 jar 파일안에 있으니 참고하시면 됩니다

그리고 현재 카카오톡의 파일에서 추출한 값을 대입하면(복호화 과정에서) 오류가 생깁니다.. 
뭔가 중간에 복호화와 암호화 과정에 추가된 부분이 있거나
bc 클래스들을 제대로 사용하지 못한 느낌도 듭니다..
약간 수정해보고 싶은 부분도 있는데..
헉헉...

오늘은 여기까지만 하겠습니다 ㅋㅋ

핑백

덧글

  • 2013/07/19 15:46 # 비공개

    비공개 덧글입니다.
  • 11111111 2013/08/16 09:29 # 삭제

    올려주신 글의 99.9%는 이해 하지도 못하는 소경입니다

    혹시 암호화된부분인데 AC67D0E2939FBE5BDF5BA7F1F354D6A1

    이분은 뭐하고 해석 되는지 알고 싶습니다

    제발요
  • sharku 2013/08/27 23:30 #

    나중 글에 보시면 알겠지만 user id가 필요합니다.. ^^
※ 로그인 사용자만 덧글을 남길 수 있습니다.