티스토리 뷰

검색하다 하다 화딱지가 나서 직접 글을 써야겠다는 마음이 들었다.



졸업작품으로 아두이노-안드로이드 블루투스 통신부분을 구현하던중


주고받는 데이터를 암호화해서 보내기 위해 DES 라이브러리를 사용했었다.



아두이노/안드로이드 DES라이브러리는 구현된것도 많고 정말 쉽게 구현할 수 있었지만,


DES는 무겁고...아두이노 메모리는 작고...


램때문에 보드에 올려볼수조차 없었다ㅠㅠ



그래서 교수님께서 대안으로 제안해주신것이 국산암호 LEA




설명과 소스코드 다운로드는 여기서


http://seed.kisa.or.kr




정말 너무너무너무너무 잘되있는데, 뭐가 어디 있는지를 몰라서 엄청 헤맸다...ㅠㅠ





AES보다 1.5배~2배정도 빠른 성능을 자랑하는


자랑스런 우리나라 국산암호이다



비교적 최근에 개발되었는데, 그래서 그런지 kisa에서 제공해주는 스마트폰용 라이브러리에는 LEA가 없다.



그러나, LEA 설명페이지의 맨 아랫부분에 소스코드 다운로드를 누르면 구현된 소스코드를 다운받을수 있는 페이지로 넘어간다.







이렇게, 소스코드를 다운받을 수 있다.


C, openssl용 C, Java, Python으로 구현된 LEA 소스코드들이다.




그래서 나는 이걸 다운받으면서, 안드로이드는 Java 소스코드를 jar파일로 라이브러리화 시키면 될거고


아두이노는 c 코드를 라이브러리화 시키면 되겠네.......라고 생각 했지만.............



저 압축파일에 올라와있는 LEA C코드는 철저히 컴파일러로 컴파일을 하기 위한 코드들이었다....



필요한 부분만 뽑아내서 새 c코드를 만들어내려니 그것도 복잡...


아두이노에서 지원해주지 않는것들 투성이...


검색해도 아무것도 안나오고....ㅠㅠ



그러나......자랑스런 우리나라 KISA에서는...



무려 아두이노 코드를 제공해주신다.....


흑....이걸 한 이틀 고민하다가 새벽 3시에 찾았는데 이거 찾고 눈물을....거의 눈물을 흘릴뻔 했다.



꼭꼭 숨어있어서 찾기 힘들었지만 사물인터넷 시대에 걸맞게, 아두이노 보드에 올릴 수 있도록 미리 코드를 구현해 주셨다ㅠㅠ



LEA 외에도, ARIA, SEED, HIGHT 가 구현된 아두이노 소스코드들이 올라와있고, 친절히 LEA를 사용하는 예제까지 올라와있다.



램이 작은 아두이노에 적용하기 위해 다 없애고 딱 필요한부분만 구현된 소스코드였다.



LEA 소스코드는 딱 세개의 함수가 구현되어 있는데,



LEA_Key(BYTE pbUserKey[16],DWORD pdwRoundKey[24][6]) :


pbUserKey를 사용해 RoundKey를 생성해준다. 이 함수에서 pbUserKey는 Input, pdwRoundKey는 output이다.


RoundKey를 이용해 encrypt, decrypt 과정이 일어난다.


그러므로, encrypt, decrypt 과정 전에 꼭 호출시켜줘야함!



LEA_Enc(DWORD pdwRoundKey[24][6],BYTE pbData[16]) :


위에서 생성된 RoundKey를 이용해 pbData를 암호화해준다.


이 함수의 input은 RoundKey, pbData이고, output은 pbData이다.


pbData에 암호화된 값을 덮어쓰는 형식이라


차라리 byte[]를 리턴해주는형식이었으면 조금 더 편했을거 같다고 생각했지만, 아무렴 상관없다.



LEA_Dec(DWORD pdwRoundKey[24][6],BYTE pbData[16]) :



위에서 생성된 RoundKey를 이용해 pbData를 복호화해준다.


이 함수의 input은 enc와 마찬가지로 RoundKey, pbData이고 output은 pbData이다.




이렇게 쉽게.... 한 이틀을 c코드 라이브러리화 시키느라 고생했는데....


이렇게 쉽게 암호화/복호화가 끝나버렸다 ^^






아, LEA소스코드 모음 압축파일을 다운받아서 실행시키다보면,


모든 소스코드가 ecb, cbc, gcm등의 모드로 구현되어 있는것을 확인할 수 있다.



그에 반해, 아두이노는 메모리 때문인지 딱 16바이트 블록암호만 암호화/복호화가 가능하다.



16바이트의 값을 주고 받을 것인데 안드로이드와 아두이노의 호환을 위해서,


안드로이드에서는 받은 값을 ecb모드로 암호화/복호화 하되


padding을 하지 않고 doFinal 함수만 호출 해주면 된다.

'보안' 카테고리의 다른 글

[컴퓨터보안] gnuTLS 설치/사용 및 예제 실행하기  (0) 2016.08.19
댓글