최근에 LEA관련된 암호 방식이 있다는 걸 확인해서(필자는 DVD에 보관하길 원하는데, 혹시 모르는 안전을 위해서도 있고... 이것 저것 신기한 것 같아서) 연습삼아 만든걸 올린다.


 LEA는 최근 우리나라 KISA가 만든 경량화된 대칭키 암호 방식을 뜻한다.


 대칭키 암호는 단일 암호키를 가지고 암호/복호화를 하기 때문에 키를 알면 누구든지 암호/복호를 할 수 있는 단점을 가지고 있지만, 반대로 간단한 암호 방식으로 알고 있다.


 대표적인 암호로 AES가 있는데, LEA는 여기에 있는 AES의 속도 보다 1.5~2배 빠르다. 라고 나와있다.(실제로 나온 과 비교해보니 빠르다.)


 그래서 이걸 library을 다운받아서 적용시키는 작업을 해보았다.



 -소스-

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <stdlib.h>
 
#include "include/lea/config.h"
#include "include/lea/lea.h"
 
#define ENC {2323534323123050894203424518223}
 
unsigned char mk[16= ENC;
 
unsigned int mk_len = 16;
 
unsigned char ctr_enc[16= ENC;
 
unsigned char pyn_buffer[16];
//unsigned int pyn_buffer_len = 16;
 
unsigned char cyp_buffer[16];
//unsigned int cyp_buffer_len = 16;
 
int main()
{
    size_t M = 0;
 
    LEA_KEY key;
 
    FILE *fip = NULL;
    FILE *fop = NULL;
 
    fip = fopen64("test","rb");
    fop = fopen64("test.LEA_CTR","wb");
 
    lea_set_key(&key, mk, mk_len);
 
    while((M=fread(pyn_buffer, sizeof(char), sizeof(pyn_buffer), fip))!=NULL)
    {
        lea_ctr_enc(cyp_buffer, pyn_buffer, M, ctr_enc, &key);
        //lea_ctr_dec(cyp_buffer, pyn_buffer,M,ctr_enc,&key);
        if (fwrite(cyp_buffer, sizeof(char), M, fop) == 0)
        {
            fclose(fip);
            fclose(fop);
            _unlink(fop); // 에러난 파일 지우고 종료
            return -1;
        }
        //lea_ctr_enc(cyp_buffer, pyn_buffer, pyn_buffer_len, ctr_enc, &key);
        //fwrite(cyp_buffer, cyp_buffer_len, 1, fop);
 
    }
 
    fclose(fip);
    fclose(fop);
 
    return 0;
}
 
cs



 일단, 위에 소개한 앱과 다른 점은 모드가 다르다.


 위에 소개한 앱의 암호 방법은 ECB방식이다. 이 방식은 암호키와 평문을 사용하는데, 딱 1:1로 처리하기 때문에 암호문이 단조로워 질수도 있다는 점이다.


 실제로도 이미지(RAW)파일을 암호화 시키니깐, 색은 없지만, 형태는 보여져서 대략적인 그림을 알 수 있는 특징을 가졌다.

 이것은 반대로 말하면, 반복적인 평문일 경우엔 뚫리기 쉬워진다는 뜻이 된다.(암호문의 반복 패턴을 이용해서 암호키를 유추할 수 있으며, 이 유추된 키를 이용해서 다른 암호문들을 다 풀기 시작하면, 평문이 금방 나오게 된다는 점이다.)


 그래서 나는 CRT 방식이 라이브러리로 적용이 되어 줘서 이 방법을 사용하였다.


 이 방법은 CRT라는 암호키 외의 정보를 가지고 있어야되며, 이것과 다른 암호문을 만들때 변형 시켜서 사용하기 때문에 단조로운 형태를 취해지지 않는다는 특징을 가지게 된다.


 실제로도 RAW파일을 이용해서 만드니 이게 어떤 형태의 파일인지 정확하게 알기 어려웠다.


 다음은 RAW파일을 억지로 BMP파일로 바꾼것과 LEA_ECB로 암호화된 파일을 억지로 BMP으로 바꾼 것. LEA_CRT로 암호화된 파일을 억지로 BMP으로 바꾼 것이다.


 억지로 바꾸기 위해서 MSPAINT을 이용해서 24bit그림 파일로 바꾸었고(RAW파일의 대상은 내 휴대폰이다.) 수정할때 사용한 에디터는 HxD이다.


 

LEA_ECB 방식으로 암호화한 결과를 BMP으로 바꾼 것.


LEA_CRT로 암호화 한걸 BMP으로 바꾼 것.


원본



 RAW파일을 강제로 가지고와서 그려지게 했기 때문에 조금 깨지게 되어 있지만, LEA_ECB로 해서 만들어진 것과 비교한다면, 약간의 잔상이 원본과 유사한 부분이 있어 보임을 알 수 있다.


 파일을 암호화 하는 것 중에 하나는 랜섬웨어 같은 나쁜 용도로 사용되는게 아니라 원래는 내 파일을 혹은 내 문서/내 메세지를 원하지 않는 사람(해커)에게서 지키기 위해서 사용하는 방식이다.


 LEA방식과 AES 방식을 비교해보면, LEA 방식이 확실이 빠름을 느낄 수 있었다.

 이걸 이용해서 개인 파일을 해커에게 지키거나 하는 방법도 생각해보는 것도 좋을 것 같다.


 사실, 국가 보호법에서 사람의 휴대폰을 볼 수 있다. 이런 식의 이야기가 있기도 하고, 내 개인 적인 정보를 DVD에 기록하기 전에 한번이라도 적용 시킬 수 있는 내 개인적인 장치를 만들고 싶기도 했다.


 LEA는 최근에 내왔지만, 기사에선 LEA가 암호화에서 3~5위 안에 들어간 방식이라는 말을 들었기 때문에 빠르게 암호화를 원한다면, 한번 제작해보는 것도 좋을 것 같다.


 사실 라이브러리를 적용시킨 사례가 적은 것도 있는 것 같다.


 여기서 CRT는 사용자(개발자) 마음대로 적용 시켜도 되는데, 저렇게 고정 시켜서 적용 시켜도 되는지는 모르겠다.

 라이브러리 사용법은 적혀 있지만, 예제가 적은 점이...



 참고로 Block암호화 방식이기 때문에 늘어나는 것도 줄어 드는 것도 없다. A라는 용량의 파일을 암호화 하면, A라는 용량으로 1:1크기의 암호다.


 큰 용량일때, 압축이 가능하다. 라면, 압축시키고 암호화 시켜야된다.(아니면, 분할시켜서 보내던가...)

 그렇지 않고, 암호한 후에 압축하면 효율성이 거의 0%이다.

Posted by JunkMam
,