양방향 암호화 알고리즘 LEA. 안드로이드에서 사용해보자.

i_dd_k·2021년 1월 9일
1

LEA 알고리즘이란?

LEA (Lightweight Encryption Algorithm)는 빅데이터, 클라우드 등 고속 환경 및 모바일기기 등 경량 환경에서 기밀성을 제공하기 위해 가발된 128비트 블록암호 알고리즘이다. (KISA - LEA 소개 참고)

LEA는 목적 자체가 모바일 기기, IOT 등에 적용하기 위해 개발된 양방향 암호화 알고리즘이다. 국내의 국가보안기술연구소에서 자체개발한 '국산' 암호화 알고리즘이고 국제 표준으로 지정된 암호화 알고리즘이다. (기사참고 - https://www.boannews.com/media/view.asp?idx=84457)

LEA 알고리즘을 사용하게된 배경

지금 진행하고 있는 모바일 프로젝트의 주요 기능 중 나의 현재 위치를 다른 사람들에게 공유하는 기능이 있는데 이때 위치정보(위도, 경도 등)를 암호화하기 위해 사용하였다. 암호화 알고리즘은 구글에 검색만 해봐도 수없이 많이 나오기 때문에 나의 프로젝트에 적합한 암호화 알고리즘을 추려내는 과정이 필요했다.

프로젝트에 적합한 암호화 알고리즘의 기준은 다음과 같았다.

1. 적은 RAM, CPU 사용량

모바일 기기에서 동작하는 애플리케이션의 특성상 일반 데스크톱 PC보다 RAM의 용량이 상대적으로 적을수밖에 없었고, CPU 또한 PC보다 성능이 떨어질수밖에 없었기 때문에 암호화, 복호화 과정에서 RAM과 CPU의 사용량이 적고 속도가 빠른것을 최우선으로 보고 알고리즘을 선정하게 되었다.

2. 암호화, 복호화 모두 가능해야 할 것.

시스템 설계상 암호화와 복호화가 가능한 알고리즘이어야 했다.
나의 시스템 설계는 다음과 같았다.

  1. A라는 사용자의 모바일기기에서 조회한 위치정보를 암호화한다.
  2. 암호화한 정보를 Server에 전달한다.
  3. Server는 B라는 사용자에게 암호화된 위치정보를 전달한다.
  4. B라는 사용자의 모바일기기에서 복호화하여 사용한다.

이러한 설계로 인해 암호화와 복호화가 모두 가능한 알고리즘 이어야 했다. 암호화 알고리즘을 공부하기 전까지는 모든 암호화 알고리즘이 암호화와 복호화가 가능 할 것 같았지만 아니었다.

'암호화'만 가능한것을 단방향 암호화 알고리즘이라 하며
'암호화'와 '복호화'가 가능한것을 양방향 암호화 알고리즘 이라고 한다.

  1. 단방향 : 암호화만 가능하고, 복호화는 불가능
  2. 양방향 : 암호화와 복호화가 모두 가능

이런 두가지의 조건을 모두 만족한 암호화 알고리즘이 LEA였다.
LEA는 암호화와 복호화 모두 가능한 양방향 암호화 알고리즘이었고
양방향 암호화 알고리즘의 대표인 AES보다 성능이 더 좋았다.

LEA와 다른 알고리즘들에 대한 성능 비교 : https://www.koreascience.or.kr/article/CFKO201725864427773.pdf


LEA 알고리즘의 사용방법

  1. KISA 홈페이지에서 소스코드를 다운로드 한다.
    https://seed.kisa.or.kr/kisa/Board/20/detailView.do

  2. 안드로이드 스튜디오에서 원하는 패키지 명으로 패키지를 하나 생성한 후 위의 소스코드들을 붙여넣기 한다.

  3. 다음과 같이 코드를 삽입한다.
    암호화, 복호화시 Base64로 인코딩 하는 과정이 필요하다.

     private String KEY = "1234567890123456"; // 16글자의 key값을 설정해야함.
     private BlockCipherMode cipher;

     private void onCreate() {
         cipher = new LEA.ECB();
         cipher.init(BlockCipher.Mode.ENCRYPT, KEY.getBytes());
         cipher.setPadding(new PKCS5Padding(16));
         
         String data = "123456"; // 암호화 할 데이터
         String encryptData = encrypt(data); // 암호화 한 데이터
         String decryptData = dectypt(encryptData);
     }

     private String encrypt(String data) {
         byte[] ct1 = cipher.doFinal(data.getBytes());

         // Base64로 인코딩한 String값을 return
         // Base64로 인코딩 하지 않으면 암호화한 데이터가 깨지는 문제가 발생함.
         String result = new String(Base64.encode(ct1, Base64.DEFAULT)); 
         cipher.reset();

         return result;
     }

     private String decrypt(String encryptData) {
         // Base64로 인코딩된 암호문을 decode하여 byte형식으로 저장
         byte[] ct1 = cipher.doFinal(Base64.decode(encryptData, Base64.DEFAULT));
         String result = new String(ct1, StandardCharsets.UTF_8);
         cipher.reset();
         
         return result;
     }

1개의 댓글

comment-user-thumbnail
2021년 1월 9일

❤💨

답글 달기