Notice
Recent Posts
Recent Comments
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

topcue

NEAT 암호 (1) 개요 본문

Crypto

NEAT 암호 (1) 개요

topcue 2021. 2. 8. 13:56

※ 본 프로젝트는 offensive research가 아닌 defensive 관점에서 진행한 학술적인 연구입니다.

✉ 윤형준 encrypt@kakao.com


[목차]


Overview

NEAT(National Encryption AlgoriThm)는 국정원에서 만든 암호 알고리즘으로 1997년 국가기관용 표준암호로 제정되었다.

암호 알고리즘의 표준 문서나 명세서를 제공하고 있지 않은 비공개 암호 알고리즘으로 security through obscurity에 보안성을 일부 의존하고 있다.

본 프로젝트에서는 NEAT 암호 알고리즘을 포함하고 있는 바이너리를 리버싱하여 NEAT 알고리즘을 분석한다.


동기

동계 방학 현장실습을 하다가 한컴위드의 홈페이지에서 아래와 같은 암호 알고리즘들의 이름을 보게 되었다.

[그림1] 한컴위드 (2021.01.05)

국내에서 개발한 표준 암호인 SEED, ARIA와 국제 표준 암호인 DES, 3DES, AES, IDEA 사이에서 눈에 띄었던 알고리즘은 바로 NEAT다. 다른 암호 알고리즘은 설계 사상이나 동작 원리를 공부하고 직접 구현해보기도 했는데, NEAT는 굉장히 낯설었다.

그러다가 수업 시간에 교수님께서 하신 말씀이 기억났다.

💡
"이 알고리즘은 여러분들이 알 필요도 없고, 알 수도 없으며, 알려고 해서도 안됩니다."

암호 관련 전공 수업 시간이었는데, 당시엔 알고리즘의 이름도 구두로 들었던 터라 정확한 스펠링도 기억하고 있지 않았다. 분명 이름이 니트였다

심지어 암호 이론 중 "숨기는 것에 의존하는 보안은 취약할 수 있다"security through obscurity라는 개념을 알려주신 교수님이셨다.

  • security through obscurity
It is possible that, without enough people evaluating the cryptosystem, there will be undiscovered errors in the algorithm.

하지 말라면 더 하고 싶은 법. 언젠가 분석해 주겠다고 생각했다. 그래서 어렴풋이 기억하고 있었던 것 같다.

하고 싶은 건 뭐든지 직접 해봐야 직성이 풀리는 나이라 아주 재미있는 생각을 했다.

그것은 바로 '국가가 비밀로 하는 국가기관용 암호 알고리즘인 NEAT를 분석한다!'였다.

다음과 같은 순서로 진행할 예정이다.

  1. NEAT에 대해 조사한다.
  1. NEAT 구현체를 리버싱하여 암호 알고리즘을 분석한 과정을 정리한다.
  1. 알아낸 암호 알고리즘의 동작 과정을 정리한다.
  1. 암호 동작 원리를 증명하고 설계 사상을 엿본다.
  1. 암호 알고리즘을 직접 구현하여 배포하고 소중히 간직한다.
  1. 암호분석을 진행하고 국가 비밀 기관의 연락을 기다린다.

NEAT 사전 정보

조사하기 전 알고 있는 정보를 정리하면 다음과 같다.

  • NEAT국내 표준 암호다.
  • 암호 알고리즘을 공개하지 않는다.
  • 물론 소스코드도 구할 수 없다.
  • 비밀이 많고 중요한 기관(국정원? 국방부?)에서만 사용한다.

요약하자면 NEAT는 국내 일부 기관에서만 사용하며 security through obscurity에 보안성을 일부 의존하고 있는 비공개 국내 표준 알고리즘이다.


NEAT 조사

다음으로 2021년 현재를 기준으로 인터넷에서 구할 수 있는 NEAT와 관련된 모든 정보를 수집했다.

[그림2] 암호 분석 기법 - PPT 발표 자료 p.23 (2006.12)
[그림3] 암호 분석 기법 - PPT 발표 자료 p.53 (2006.12)

현재 접근할 수 있는 공개 자료 중 가장 오래된 PPT 발표 자료다

url이 깨져있어서 PPT를 직접 다운 받을 수는 없었고 아래처럼 쉘 스크립트를 간단하게 작성해서 이용해 낱장으로 다운 받았다.

  • shell script
    #!/bin/sh
    
    for idx in {1..110}
    do
    	`wget https://image.slideserve.com/905445/slide$idx-l.jpg`
    done

23페이지에 NEAT가 1997년정부기관용(國家機關用) 표준암호로 제정되었다는 것을 알 수 있다.

53페이지에는 NEAT가 국가기관용 표준암호라고 언급하고 있다.

[그림4] 『행정정보공동이용법안』에 관한 공청회 (2007. 4.25)
[그림5] 『행정정보공동이용법안』에 관한 공청회 (2007. 4.25)

2007년 당시 NEAT는 공인전자서명체계가 아닌 행정전자서명체계에서 사용하는 국가기관용 암호 알고리즘이라는 것을 알 수 있다.

[그림6] 암호의 안전성 - 네이버 블로그(2008.07.17)

NEAT는 국정원에서 만든 암호 알고리즘이며, 국기기관 내부용 데이터 및 문서 암호화에 쓰인다.

  • 행정전자서명인증 암호체계 고도화 추진경과 - 행정전자서명 인증관리센터 (2011.02.03)
    [그림7] 행정전자서명인증 암호체계 고도화 추진경과 - 행정전자서명 인증관리센터 (2011.02.03)
  • 정보암호화 - 다음 블로그 (2012.5.29)
    [그림8] 정보암호화 - 다음 블로그 (2012.5.29)

2012년 블로그 게시글에 NEAT(BUD-F)라고 쓰여있다.

확실하지는 않지만 정황상 NEATBUD-F 자체거나 BUD-F에 탑재된 암호 알고리즘인 것 같다.

더 이상 알 수 없어서 BUD-F는 일단 차치하고 다시 NEAT로 돌아왔다.

이후 아래와 같은 자료에서 NEAT라는 이름을 찾아볼 수 있었다.

  • 교육부 전자서명인증센터 상호연동기술표준 (2013.04.xx)
  • 행정전자서명 기술요건 (2014.01.xx)
    [그림10] 행정전자서명 기술요건 (2014.01.xx)

NEAT 구현체 획득

그러다가 드디어 NEAT 구현체를 하나 발견했다.

다음은 iccsmWebNew라는 github 링크에 있던 코드 조각이다.

  • GPKISecureWeb V1.0.0.1 Configration (2013.07.20)
# [암호화관련]

# 암호알고리즘셋팅[NEAT/CBC,ARIA/CBC,NES/CBC,3DES/CBC,SEED/CBC]
GPKISecureWeb.crypto.algo = NEAT/CBC

그리고 iccsmWebNew/WebContent/gpki/gpki_jni/gpkiapi/libgpkiapi64.a에 neat가 구현되어 있다는 것을 알 수 있었다.

그런데 문제가 있다.

$ file libgpkiapi64.a
libgpkiapi64.a: 64-bit XCOFF executable or object module

바로 이 libgpkiapi64.a가 XCOFF라는 파일 포맷이며 object module인 것 같다.

파일 확장자가 .a인 것으로 보아 기계어 덩어리는 아닐까 했는데..

  • functions in libgpkiapi64.a
.getNeat_Padding__12DSCryptoBaseFi
.NEAT_MakeRoundKey
.NEAT_EncryptBlock
.NEAT_DecryptBlock
.EncryptNeatCBC
.DecryptNeatCBC
.DS_EncryptNeatCBC
.DS_DecryptNeatCBC
.SY_NEAT__6DSAlgoFv

함수명 앞에 온점 붙은 것도 그렇고..

disassemble은 가능한데..

[그림11] disassemble graph view

그렇다. 디컴파일을 할 수 없다.

기계어만 보면서 리버싱을 한다면 NEAT를 분석하기 전에 수명이 다할 것이라고 판단했다.

  • 친절한 기계어들
.text:0000000010022064   .globl .EncryptNeatCBC
.text:0000000010022064 .EncryptNeatCBC:
.text:0000000010022064
.text:0000000010022064 .set sender_sp, -0x240
.text:0000000010022064 .set var_218, -0x218

// ...

.text:0000000010022064 .set var_8, -8
.text:0000000010022064 .set sender_lr,  0x10
.text:0000000010022064
.text:0000000010022064    cmpwi     r4, 0x10
.text:0000000010022068    std       r31, var_8(r1)
.text:000000001002206C    mflr      r0

분명 디컴파일 가능한 NEAT 구현체가 있을 것이다.

일단 킵해두자.


Theori가 왜 거기서 나와?

[그림12] Theori가 왜 거기서 나와?

그러다가 엄청난 사실을 알아버렸다. theori에서 NEAT를 벌써 분석했다는 것이다.. 그것도 4년 전인 2017년에.. 아래 게시글에서 확인할 수 있다...

처음에는 힘이 쭉 빠졌지만 마침 선행 연구가 너무 없어서 힘들어하던 참이었고, 게다가 상대는 티오리다! 티오리에서 했다면 분명 엄청난 것일 테고 나도 그걸 할 예정이다! 다시 자신감을 가지고 해당 게시글로 case study를 진행했다.

그러다 아래와 같은 내용을 보게 되었다.

[그림13] 티오리 게시글 중 일부

라운드 함수 마지막에 swap을 한 번 하는데 이는 필시 암복호화를 대칭구조로 만들기 위한 final swap일 것이라고 생각했다. 하지만 블로그에선 이에 관한 언급이 없었다.

아직 한참 부족하지만 나름 암호학도 전공 중인 본인이🧐 티오리가 놓친 부분을 찾을 수 있을지도 모른다!

라고 생각하면서 잠깐 들떴다. 나중에 알게 된 사실이지만 영문으로 작성된 티오리의 다른 게시글에서 이 부분을 정확하게 언급하고 있었다.

The last round is a half round without the MIX function. Instead, the left halves and right halves are swapped. This is important because it allows us to use the same code for encryption and decryption.

역시 티오리는 대단했다!😥

하지만 무슨 상관인가. 애초에 잠깐이라도 티오리를 이겨먹으려 했던 내가 건방졌다.

게다가 글의 마지막에서 아래와 같이 언급하고 있다.

[그림14] 티오리 게시글 중 일부

cryptanalysis를 하지 않았다고!!!

NEAT를 완전히 분석한 뒤에 암호분석(cryptanalysis)을 해보는 것도 좋겠다.

좋은 선행 연구도 있고, 무엇보다 덕분에 NEAT 구현체를 하나 더 획득했다.


Conclusion

이제부턴 정말 리버싱 뿐이야!


Comments