원래대로라면 3학년 2학기인 다음 학기에 '컴퓨터 보안' 이라는 과목을 수강하며 암호학에 대해 공부를 진행하려 했으나
개발을 위해서 필수적으로 암호학을 공부해야했다.
나는 팀원들에게 대표 암호 알고리즘들을 선택하고 데이터 크기, 하드웨어 상황에 따라 어떤 것이 가장 효율적인지 판단한 뒤, 그 암호 알고리즘을 토대로 개발을 진행하자라고 설명했고 팀원들은 각자 나름대로 암호학에 대해 공부했다.
나는 드림핵에서 들을 수 있는 무료 강의인 암호학 강의와, 컴퓨터 보안을 수강 완료한 선배님에게 자료를 받았고,
암호 알고리즘을 비교한 여러 논문을 참고하며 공부하기 시작했다.
현대 암호에는 대칭키(비밀키) 암호, 비대칭키(공개키) 암호로 구분되며 대칭키 암호화 방식에는 블록암호, 스트림 암호 방식으로 다시 구분된다.
블록 암호(Block Cipher)는 평문을 정해진 크기의 블록 단위로 암호화하는 암호 방식으로, 블록의 크기가 4바이트라면 평문을 4바이트의 블록으로 쪼개어 각 블록마다 암호화를 진행한다, 만약 블록의 크기가 배수가 아니라, 균등하게 쪼갤 수 없을 때 평문 뒤에 데이터를 추가하는 패딩을 먼저 수행한다. 또한 블록암호에는 암/복호화 시 사용되는 ECB, CBC, OFB, CFB, CTR 등 여러 운영모드와 DES, AES 와 같은 여러가지 암호 알고리즘이 존재한다.
스트림 암호(Stream Cipher)는 송신자와 수신자가 시드(Seed)라 불리는 작은 값을 공유하고, 사전에 합의한 함수의 인자로 이 시드를 이용해 각자 데이터 스트림을 생성해 이를 평문에 XOR하는 방식이다.
블록 암호와 스트림 암호는 쓰임새에 따라 다른데, 스트림 암호는 XOR와 같은 단순 연산으로 속도가 매우 빠르지만, 블록 암호방식보다 안전하지 못하기 때문에 임베디드 기기나 속도가 중요한 환경에서만 사용한다고 한다.
* dreamhack - '현대 암호' 강의 참고
이렇게 각자 공부한 내용을 바탕으로 우리는 회의를 진행했다.
아래는 회의의 안건이다.
1. 어떤 암호 방식을 선택해야 하는가?
2. 알고리즘 비교를 위해 각자 맡을 알고리즘이 무엇인지?
다들 공부를 열심히 했는지 많은 이야기들이 오고 갔고, 2시간만에 회의가 종료되었다.
이번 회의를 통해 우리가 얻은 결론은
1. 우리가 개발하는 시스템은 대량의 데이터를 암/복호화 해야하므로 대칭키 암호화 방식을 선택
2. PC 환경에서 운영되기에 스트림암호보다는 블록 암호방식을 선택
3. 해외에서 사용하는 DES와 AES방식의 비교를 진행,
- AES의 경우에는 128, 192, 256 각각의 블록 크기별로 알고리즘을 구성
- DES의 경우는 취약점이 존재하므로 이 단점을 극복한 3-DES를 구성해서 비교
4. 운영모드는 CBC 모드와 CTR 모드 두가지를 선택했다.
- 평문과 암호문이 1대1로 대응되어 패턴이 그대로 드러나는 취약점이 존재하는 ECB 패턴은 제외
- CBC, CFB, OFB, CTR 모드가 있었지만 피드백 모드의 경우 CTR 모드의 등장으로 대체되어 잘 사용하지 않는다.
- 온라인에 자료 또한 CBC 모드와 CTR 모드 두 가지를 중심으로 나와있다.
- 이러한 이유로 비교 분석 시에는 이 두가지 모드만을 사용하기로 선택하였지만, 난 각 모드별로 공격 형태가 다른 것에 흥미가 생겨 따로 공부를 더 진행하였다. - 참고 주소올려야징-
각자 그렇게 코드를 작성하고 좋은 성능의 데스크탑을 가진 선배 한명의 자취방에 모여 비교 분석을 진행하였다.
분석 개요
3-DES
- DES : 8바이트(64비트)를 한 블록으로 하는 블록 암호이며, 전체 구조는 초기 순열(Initial Permutation, IP), 최종 순열(Final Permutation, FP), 페이스텔(Feistel) 구조의 16 라운드, 각 라운드에 사용되는 48비트의 키를 생성하는 키 생성 함수(Key Generation)로 구성되어 있으며 치환이나 순열 같은 단순한 연산들로 한 라운드로 구성하고, 각 라운드를 여러 번 반복하여 암호학적 안전성을 확보하는 곱 암호를 사용한다.
- 연산 능력이 증대되고, 관련된 공격 기법이 연구됨으로 인해, DES는 더이상 안전한 암호 시스템이 아니다.
다중 DES는 서로 다른 키를 사용하는 DES모듈을 여러 개 이어붙여서 DES의 약점을 보완한 암호 시스템이며. DES를 두 겹으로 사용하는 이중 DES(Double DES, 2-DES)는 112비트, 삼중 DES(Triple DES, 3-DES)는 168비트의 키를 사용하며, 이번 분석에서는 삼중 DES를 사용하는 것으로 분석을 진행한다.
AES
- AES : 연산 능력의 향상으로 DES가 더 이상 안전하지 않게 되자, 2001년에 새롭게 표준으로 선정된 블록 암호 알고리즘이며, 표준으로 선정된 이후부터 지금까지 AES에는 기밀성을 위협하는 치명적인 취약점이 발견되지 않았다.
또한 CPU 제조사들이 AES 연산을 위한 명령어를 따로 정의해 주어서 암호화, 복호화의 성능도 뛰어나다. 이런 이유로 현대에는 대칭키 암호 알고리즘을 사용할 때, 일반적으로 AES가 사용되고 있다.
- AES는 라운드마다 128비트 크기의 블록을 암호화하는 블록 암호이다.
키의 길이는 128, 192, 256비트 중 하나를 선택할 수 있고, 라운드 수는 키의 길이에 따라
10, 12, 14로 결정된다. 키의 길이가 128bit이면 AES-128 10라운드, 192bit이면
AES-192 12라운드, 256bit이면 AES-256 14라운드라고 부른다.
시나리오
특이사항
- 전제조건 : 하드 테스팅을 위해 극한을 사용.
(Java와 Mysql의 원시타입 및 매칭되는 클래스 둘 중 Max의 boundary를 선택) - Long 접두사가 붙은 단위들 (LongText, LongBlob 등 Max 4GB) 및 MediumBLOB
(~1600만 Byte), varBinary(MAX)(~2GB)은 단위가 너무 크기에 부적합 판단되서 제외함 - 각각의 데이터는 1000개로 한정
- 파일 입출력의 빠른 출력 결과를 위해 버퍼 사이즈를 맥시멈(1GB)로 설정
가정 시나리오
- dummyTable 하나씩 모든 컬럼을 조회한다.
- 하나의 컬럼씩 암호화 진행해서 암호화 테이블에 저장한다.
- 모두 저장한 후, 하나씩 암호화 테이블에 데이터를 꺼내어 복호화를 진행한다.
- 원본 데이터와 비교 후, 데이터가 다른지 같은 지 카운팅한다.
- 모든 테이블 반복.
시간 비교 방식
- 암호화 이후 시간 - 암호화 이전 시간
- 복호화 이후 시간 – 복호화 이전 시간
암호화 데이터 종류
- 크기가 다른 평문 더미 파일
- hwp, docx 등 문서 파일
분석환경
구분 | 사양 |
운영체제 | Microsoft Windows 10 Pro (x64) |
프로세서 | Intel(R) Core(TM) i7-8700 @ 3.20GHz (12 CPUs), ~3.2GHz |
메모리 | 16.00GB |
개발언어 | Java Spring Boot |
DB | MySQL 8.0 |
IDE | IntelliJ 2022. 1. 1. |
실행 결과
운영 모드 : CBC
암호화 시간 | 복호화 시간 | |||||||
구 분 | AES128 | AES192 | AES256 | 3-DES | AES128 | AES192 | AES256 | 3-DES |
10KB | 0.003 | 0.001 | 0.001 | 0.004 | 0.003 | 0.001 | 0.001 | 0.002 |
1MB | 0.02 | 0.018 | 0.02 | 0.074 | 0.013 | 0.022 | 0.015 | 0.070 |
10MB | 0.108 | 0.136 | 0.141 | 0.695 | 0.122 | 0.127 | 0.139 | 0.689 |
100MB | 1.124 | 1.222 | 1.344 | 7.041 | 1.256 | 1.297 | 1.422 | 6.863 |
1GB | 11.819 | 12.845 | 14.242 | 71.904 | 12.762 | 13.711 | 14.693 | 69.969 |
5GB | 57.589 | 63.031 | 70.683 | 363.067 | 62.186 | 69.226 | 74.307 | 353.368 |
운영 모드 : CTR
암호화 시간 | 복호화 시간 | |||||||
구 분 | AES128 | AES192 | AES256 | 3-DES | AES128 | AES192 | AES256 | 3-DES |
10KB | 0.003 | 0.001 | 0.001 | 0.004 | 0.001 | 0.001 | 0.001 | 0.001 |
1MB | 0.012 | 0.027 | 0.018 | 0.070 | 0.013 | 0.013 | 0.014 | 0.069 |
10MB | 0.11 | 0.119 | 0.128 | 0.684 | 0.108 | 0.117 | 0.129 | 0.695 |
100MB | 1.186 | 1.178 | 1.277 | 6.911 | 1.112 | 1.232 | 1.322 | 6.967 |
1GB | 11.982 | 12.159 | 13.658 | 70.703 | 11.795 | 12.755 | 13.905 | 71.756 |
5GB | 53.724 | 61.848 | 65.304 | 349.100 | 58.383 | 63.576 | 70.193 | 357.039 |
분석 결과
- CBC 모드는 IV XOR 연산 이외에도 이전 암호문을 Padding 하여 새로운 암호화 과정에 이용하기 때문에 보안성이 가장 높은 모드 중 하나이다.
그러나 그림을 보면 알 수 있듯이 CBC 모드는 보안성이 높은만큼 암호화/복호화 과정 중 시간이 오래 걸린다. - CTR은 반대로 보안성은 CBC에 비하여 조금 떨어질 수 있으나 CBC 보다 높은 속도를 자랑한다. 그림 1-2와 그림 1-4를 비교하면 5GB Dummy File에 대한 복호화 과정이 약 1.5배 이상의 속도 차이를 보여주는 것을 확인할 수 있다.
- 따라서 높은 보안 레벨을 요구하는 데이터관리에 대해서는 CBC 모드를 사용하는 것이 최선책이며 빠른 속도를 요구하는 데이터관리에 대해서는 CTR 모드를 사용하는 것이 최선책이다.
- 3-DES의 경우 DES를 세 번 진행하는 것으로 시간이 제일 오래 걸렸으며,
AES128, AES2192, AES256의 경우 키의 길이에 따른 속도에 근소한 차이를 보인다.
이렇게 분석을 하고 결과를 내고 난 뒤, AES-256의 CTR 모드를 이용한 시스템을 본격적으로 설계하기 시작했다.
시스템을 설계하기 위해 여러 암호 시스템 정보를 찾아 보던 중 국내 공공기관에 암호 모듈을 사용하기 위해서는 국정원 인증을 받은 암호 시스템만 사용가능하다는 글을 발견하였다.
물론 지금 개발하는 시스템이 공공기관에 설치되는 것은 아니였으나, 난 꿈이 크기에 국정원 검증을 통과하기 위한 암호 시스템의 기준을 살펴보았다.
대충 요약해보면 국내 암호알고리즘을 사용한 시스템이 여러 테스트 케이스를 통과하면 되는 것이다.
이 중에서 가장 걸림돌이 되는 것은 바로 우리가 해외 알고리즘인 AES256을 사용한다는 점이다.
나는 국내 암호 알고리즘에 구미가 당기기 시작했고, 팀원들의 야유를 살짝?받긴 했으나 끈질긴 설득과 적당한 타협으로 국내 암호 알고리즘도 함께 비교하기로 하였다.
문제는 KISA에서 제공하는 암호 알고리즘 문서를 보고 했는데, 어떤 알고리즘은 CBC CTR 함수별로 잘 분리되어 있는 반면 어떤건 공통부분이 한 메소드 안에 구현되어 있었다.(확실히 스타일 다른 코드가 자주 보여 여러 사람이 개발한 티가 확 난다)
모든 모드와, 블록 크기를 비교하고 싶었지만 빠르게 연구를 끝내야하는 속사정이 있기도 했고, 리팩토링에 시간이 많이 걸릴 것으로 보여 CBC 모드를 기준으로 SEED, ARIA, HIGHT, LEA를 비교했다.
또한 해외 알고리즘 분석 환경과 이번 분석 환경이 다르다는 점을 감안해 AES256도 함께 추가해서 비교하기로 했다.
분석 개요
ARIA
- ARIA : ARIA의 알고리즘은 암호화와 복호화를 수행하는 라운드 함수와 키 확장으로 구성되어 있다.
ARIA 라운드 함수의 기본구조는 Involution SPN 구조이다. ARIA는 평문 128비트를 암호화하는 블록 암호 알고리즘으로,키크기는 128, 192, 256비트이며, 이때의 각각의 라운드 함수 수는 12, 14, 16라운드이다. - 성능면에선 소프트웨어에서 AES에게 부족하지만, 일본의 카멜리아에 비하면 좋은 편이며, 하드웨어의 경우 AES와 비견되는 정도이다. 하드웨어 스펙이 높아지면 ARIA도 AES에 성능이 근접하지만 임베디드와 같은 낮은 스펙의 하드웨어에서는 효율이 좋지 않다.
SEED
- SEED : 한국인터넷진흥원(KISA)에서 1999년에 개발한 대칭키 암호화 알고리즘으로 알고리즘 구조와 기술적으로 DES와 가까운 친척뻘이다. SEED는 DES와 같은 페이스텔 구조를 사용한다. 암호화 스테이지 수도 16으로 똑같아 당시의 표준이었던 DES를 의식하고 만들어진 알고리즘이다.
- 128비트의 평문을 암호화하며, 키 크기는 128비트이다. 총 16라운드에 걸쳐 암호화를 진행하며, Addition, XOR,
bit-rotation등의 연산식을 사용하여 암호화를 수행한다
HIGHT
- HIGHT : RFID, USN 등과 같이 저전력 및 경량화를 요구하는 컴퓨팅 환경, 혹은 스마트폰, 스마트카드 및 RFID등과 같이 저전력, 경량화를 요구하는 모바일 환경에서 기밀성을 제공하기 위해 개발된 블록 암호화 알고리즘이다.
이는 휴대형 기기 및 모바일 환경에 적합하도록 특수 설계되었고, 전력 소비가 적도록 개발되었다. 또한 8비트 단위의 기본적인 산술연산, XOR, 순환이동만으로 사용가능 하도록 간단구조로 설계되었다.
HIGHT는 128비트 국산암호화 알고리즘 SEED에 비해 제한된 환경에 적용하기 위해 매우 간단한 구조의 안전성, 효율성을 동시에 고려하였으며 메모리와 같은 하드웨어 자원이 부족한 환경에 적합하도록 일반적인 블록 암호화 알고리즘과는 다르게 S-Box(Substitution-box)를 제거하였다. - HIGHT 알고리즘은 전체적으로 일반화된 Feistel 변형 구조로 이루어져 있으며, 64비트의 평문과 128비트의 키로부터 생성된 8개의 8비트 화이트닝키와 128개의 8비트 서브키를 입력으로 사용함으로써 총 32라운드를 거쳐서 64비트 암호문을 출력한다.
LEA
- LEA : LEA는 국가보안기술연구소에서 개발한 128비트의 데이터 블록을 암호화하는 알고리즘으로, ARX 형태로 설계한 GFN TYPE-III 알고리즘이다.
입출력을 매핑하는 SBOX의 사용을 피하고, ARX형태로 구현한 탓에 경량화 구현이 가능해졌으며, AES의 연산속도보다 훨씬 빠르며 기존 경량화 암호인 HIGHT보다 더 높은 수준의 안전성을 추구하였다. - 128비트의 평문을 암호화하며, 키 크기는 128비트이다. 총 16라운드에 걸쳐 암호화를 진행하며, Addition, XOR, bit-rotation등의 연산식을 사용하여 암호화를 수행한다
시나리오
가정 시나리오
- CBC 단일 모드로 진행.
- 더미 파일에 대해 암호화/복호화를 진행한다.
- 원본 데이터와 비교 후, 데이터가 같은지 확인한다.
시간 비교 방식
- 암호화 이후 시간 - 암호화 이전 시간
- 복호화 이후 시간 – 복호화 이전 시간
암호화 데이터 종류
- 크기가 다른 평문 더미 파일
- hwp, docx 등 문서 파일
분석 환경
구분 | 사양 |
운영체제 | Microsoft Windows 10 Pro (x64) |
프로세서 | Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz (12CPUs) 2.60 GHz |
메모리 | 16.00GB |
개발언어 | JAVA |
IDE | IntelliJ IDEA 2022.1.1 |
DB | MySQL 8.0 |
실행 결과
암호화 시간 | 복호화 시간 | |||||||
구 분 | AES256 | ARIA | SEED | LEA | AES256 | ARIA | SEED | LEA |
10MB | 0.06850 | 0.20415 | 0.33621 | 0.03443 | 0.07006 | 0.21941 | 0.33529 | 0.03100 |
100MB | 0.79555 | 2.11420 | 3.33090 | 0.35034 | 0.83009 | 2.25817 | 3.30088 | 0.26593 |
1GB | 10.76272 | 29.32610 | 33.45990 | 4.64990 | 7.82536 | 21.24381 | 33.66569 | 3.04240 |
5GB | 89.91100 | 109.43000 | 165.98000 | 33.41500 | 92.42112 | 109.09723 | 167.38201 | 34.18343 |
분석 결과
- 속도차이
- 국내 알고리즘의 경우 경량화 알고리즘인 LEA가 가장 높은 속도를 보였으며, ARIA, SEED 순으로 속도의 차이를 보였다. 국제 알고리즘인 AES-256과 국내 알고리즘 속도를 비교했을 때, 국제 알고리즘보다 국내 알고리즘의 속도가 느린 것을 확인하였다. LEA > AES > ARIA > SEED 순서
- SEED는 DES와 동일 Feistel 구조이고, ARIA는 AES에 비해 연산 처리가 많아 느린것으로 보인다.
- LEA는 비선형 치환 테이블인 S-BOX의 사용을 배제하여 빠른 속도를 가지고 있는 것으며 보인다.
이렇게 해서 국내 / 해외 블록 암호 알고리즘의 비교분석이 끝났다.
사실 완벽하게 연구한 것도 아니고, 코드를 짜면서 최적화 부분에 어느정도 문제가 있었을 수도 있지만 나름 의미 있는 결과를 냈다고 생각한다.
우리 개발팀은 AES를 활용해서 개발을 진행하고 싶었지만, 한국인터넷진흥원에 '2018 암호알고리즘 및 키 길이 이용안내서 - 보안강도에 따른 분류표'에 따르면 LEA는 AES와 동일한 키의 길이로 보안강도 역시 동일하다는 특징이 있기도 하고 AES가 LEA보다 우월한 부분이 딱히 없는 것 같아 LEA를 사용해서 개발하기로 했다.
'개발 > 암호 모듈 제작' 카테고리의 다른 글
데이터 보안 시스템 기술 개발 기록(3) - '구현 범위 설정' (0) | 2023.06.28 |
---|---|
데이터 보안 시스템 기술 개발 기록(1) - '서론' (0) | 2023.06.27 |