티스토리 뷰

Android/자료정리

[Android] KISA SEED CBC 적용.

썩소천사 2018. 10. 31. 09:00
반응형

// 2021.07.30 seed cbc 를 다시 사용할 일이 있어 찾아본 결과 KISA에서 예전에 제공했던 파일과 다르다.
아래 글은  seedcbc.c, seedcbc.h 파일을 기초로 자바에서 구현된 내용이니 다음글 참조!!

[Android/자료정리] - [Android][SEED CBC] 암복호화 처리

 

[Android][SEED CBC] 암복호화 처리

예전에 JAVA 버전 SEED CBC가 없었던 것 같은데... 다시 사용하려고 다운받아보니 있다. 그런김에 암복호화 매서드 정리! 1. 파일 다운로드 https://seed.kisa.or.kr/kisa/Board/17/detailView.do 2. key, iv 셋팅..

soo84.tistory.com

모바일 암호화 알고리즘이 지금은 KISA에서 많이 나왔지만,

예전부터 썼던 SEED CBC를 사용하기위해 마지막으로 올라온 버전으로 셋팅하며, 기록으로 남겨 본다.

일전에 셋팅했었던 KISACrypto.so 파일로 설정하는 코드를 날려먹었기 때문이다.

새로나온 알고리즘에 대해 자료가 없는 부분도 한 몫 한다.

가이드 좀 제발 쉽고, 현재 개발 환경에 맞게 업데이트 좀 해줬으면 얼매나 좋을까...

1. 파일 다운로드.

https://seed.kisa.or.kr/kisa/Board/17/detailView.do

seedcbc.c, seedcbc.h 파일과 SEEDCBC파일을 가이드 문서대로 넣고 셋팅을 시작한다.

 

2. CMakeList.txt

-  여기서 당황했다. 개발중인 프로젝트 였기에 프로젝트 생성 시"Include C++ support" 선택하지 않으면 해당 파일을 찾을 수 없다.

https://developer.android.com/studio/projects/add-native-code?hl=ko#link-gradle 

다행히 구글에 셋팅법에 대해 자세히 설명되어 있다. 파일을 추가할 경우 가이드 문서와 동일하게 나올테니 계속해서 따라하면 된다.

 

3. NDK 오류.

 - https://developer.android.com/ndk/downloads/?hl=zh-en

이곳에 가서 NDK을 받은 후 내 NDK 폴더와 비교해 없는 폴더를 복사해주면 된다. (하단 내용 참조 )

[Android/자료정리] - [android] NDK error : No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android

 

4. 암/복호화 코드.

 - kisa 문서대로 하면 되긴 하는데 뭔가 부족하다.

 - 가이드 문서대로 하면 암호문 뒤에 "0000000"이 붙는 것을 볼 수 있다. 그래서 arraycopy를 사용해 잘라 사용하였다.

 - SEEDCBC 파일에 아래 내용을 추가한 후 사용하면 된다.

public static final byte[] key = new String("1234567890123456").getBytes();
public static final byte[] iv = {
        (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
        (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
        (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01
};

 - 암호화 키는 꼭 16자리 채워야 한다.

 

public static String EncryptBase64(String pText){
byte[] plainText = pText.getBytes();
byte[] cipherText = new byte[plainText.length + 16];
int outputTextLen = 0;

SEEDCBC seed = new SEEDCBC();
seed.init(SEEDCBC.ENC, key, iv);

outputTextLen = seed.process(
plainText, 0,
plainText.length,
cipherText, 0);

outputTextLen += seed.close(cipherText, outputTextLen);

byte[] sliceCipher = new byte[outputTextLen];
System.arraycopy(cipherText,0, sliceCipher, 0, outputTextLen);

String encryptText = Base64.encodeToString(sliceCipher,0);

return encryptText;
}

 

public static String DecryptionBase64(String cText) {
if(cText == null || cText.equals("")) return "";

byte[] plainText = new byte[144];
byte[] cipherText = Base64.decode(cText, 0);
int outputTextLen = 0;

SEEDCBC seed = new SEEDCBC();
seed.init(SEEDCBC.DEC, key, iv);

outputTextLen = seed.process(
cipherText, 0,
cipherText.length,
plainText, 0);

seed.close(plainText, outputTextLen);

cText = new String(plainText);

return cText;
}

 

서버와 통신을 위해 base64인코딩을 사용하였다. 

String중 서버통신에 오류가 생길 수 있는 특수문자는 place해서 사용하면 된다.

삽질하다 하루가 갔다.

슬펐다.

 

 

 

반응형
댓글
반응형