암호 알고리즘

(암호화에서 넘어옴)

1 개요

VL1SpS)DjDwCXstVPR0yrl91D7]OIhJvkochqUuRlc7HEvPA]SrOpUkRnKKgNFJ]EypCgXZPC6hnPGhDIKUEDbadbMkzkXRoDpfTKBo0ucSDWCc!

문장 Is order a rabbit? 왜 그걸 왜긴 왜야 로리콘이지 을 암호 namuwiki, 1024비트 Threefish 방식으로 암호화한 문장.

컴퓨터에서 쓰이는 암호 알고리즘.

컴퓨터가 발달하면서 이전에는 군용이나 중대한 사업용으로만 쓰이던 암호가 일상 생활에도 널리 활용되게 되었다. 단순한 개인 게시판을 시작으로 대형 DBMS까지 다양한 분야에서 암호학이 실제로 쓰이며, 이러한 암호의 보급화는 전자상거래가 시작되는데 결정적인 역할을 하기도 했다. 암호는 개인정보 보호와 악의적 공격자의 공격으로 인하여 데이터가 누출되었을 때 중요한 자료들을 바로 가져갈 수 없도록 처리하는 역할을 한다.

2 암호의 분류 방법

암호는 크게 대칭형 암호와 비대칭형 암호의 2가지로 나눌 수 있으며, 암호화에 사용하는 키 값과 복호화에 사용하는 키 값이 같은지 다른지를 기준으로 구분한다. 암호화할 때 사용한 키로 복호화를 할 수 있으면 대칭형 암호, 암호화 키와 복호화 키를 따로 구분하면 비대칭형 암호다. 통상적으로 대칭형 암호는 비공개키 암호에 사용되며 비대칭형은 공개키 암호에 사용된다.
이와는 다르게 블럭 암호와 스트림 암호로 구분하기도 한다. 전자는 일정 비트 수(단위, 또는 블럭)를 암호화하는 방식이며, 후자는 연속적인 데이터를 암호화하는 방식이다.

2.1 대칭형 암호

상술했듯 암호화할 때 사용하는 키와 복호화할 때 사용하는 키가 동일한 암호화 기법으로, 대개 암호화 알고리즘이라고 하면 대부분 이쪽을 가리킨다. 현재 사용되는 대칭형 암호화 알고리즘은 주로 파이스텔 네트워크(Feistel Network) / S-Box를 통하여 블럭 암호로 만들어지만 AES처럼 파이스텔 네트워크를 사용하지 않는 알고리즘도 있다. 이쪽은 라인달(Rijndael) 알고리즘이라는 비교적 새로운 알고리즘을 적용하고 있다.

현재 가장 보편적으로 쓰이는 암호화 방식은 현 미국 표준 방식인 AES. 128~256비트 키를 적용할수 있어 보안성이 뛰어나며 공개된 알고리즘이라 누구나 사용할 수 있다. 그 전에는 DES(Data Encryption Standard)라는 알고리즘이 1975년부터 사용되고 있었으나 너무 오래되어 취약점이 발견됨에 따라[1] 이를 대체하기 위해 등장한 것이 바로 AES이다.

그 외에는 RC4, Twofish, Serpent, Blowfish, CAST5, 3DES, IDEA 등의 암호화 알고리즘이 존재하며 국내에서 개발된 SEEDARIA라는 알고리즘도 있다. AES는 현재 일반인들이 쉽게 접근할 수 있는 암호화 방식들 중에서 충분히 안전성이 있다고 알려진 암호로 암호화 키와 복호화 키가 동일하다. 즉, ABCDE라는 문자열을 QWERTY라는 키로 암호화했으면 복호화도 반드시 QWERTY로 해야 한다.(실제 키는 128비트 또는 256비트와 같이 알고리즘에서 요구하는 길이를 사용하여야 하기 때문에 16바이트 또는 32바이트가 되어야 한다.)

대칭형 암호를 공격하는 방식에는 Known-PlainText, Chosen-PlainText, Differential, Linear 등의 방식이 있으며, AES의 경우 이러한 방식을 통한 알고리즘의 취약점 공격에 대해서는 아직 알려진 게 없음으로 안전하다고 알려져 있다. 하지만 2005년 DJ Bernstein의 논문에 따르면, SBOX를 읽어들이는 시간에 따라 서버와 통신시간에서 차이가 발생할 수 있어서 취약점이 발생한다고 지적하고 있다. 사실 이 방식은 대부분의 대칭형 암호에 대해서 취약해서 딱히 AES의 잘못이라고 보기 어렵다.

2.2 비대칭형 암호

대칭형 암호는 훌륭한 암호화 방식이기는 하지만 결정적인 문제가 존재한다. 바로 '키 배송'에 관한 문제로, 어떻게든 송신 측에서는 수신 측에 암호 키를 전달해야만 하고, 이 키가 배송 과정에서 털리면 아무리 뛰어난 암호화 알고리즘을 사용했더라도 속절없이 평문이 털리게 된다. 안전하게 평문을 전달하기 위해 만든 것이 암호문인데, 정작 키는 안전하게 전달할 방법이 없는 것. 이 키 배송에 대한 방법은 여러 가지 방법이 연구되었지만 발상의 전환으로 키 배송 문제를 해결한 방식이 비대칭형 암호이다.

비대칭형 암호는 이름 그대로 암호화 키와 복호화 키가 다르다. 암호화를 하면 하나의 키 쌍이 생기고 이 두 개의 키는 수학적으로 밀접한 관계를 가지고 있다. 두 개의 키를 각각 키 A, 키 B라고 했을 때 키 A로 암호화한 암호문은 키 B로만 복호화할 수 있고 키 B로 암호화한 암호문은 키 A로만 복호화할 수 있다. 따라서 이 중 하나의 키만 비밀로 보호하고(이를 '비밀키', '개인키'라고 한다) 다른 하나의 키는 공중에게 공개해도 관계가 없다(이를 '공개키'라고 부른다). 이렇게 둘 중 하나의 키는 반드시 공개되어야 통상적인 사용이 가능하므로 공개키 암호라고도 불린다. 공개키로 암호화한 암호문은 어차피 개인키를 가진 사람만이 풀어볼 수 있으므로 상호간에 공개키만 교환하고 상대의 공개키로 암호화를 해서 데이터를 교환하면 상대는 자신의 개인키로 복호화를 한다. 따라서 키 배송 문제는 근본적으로 발생하지 않는 것.

굉장히 신박한 아이디어기는 한데 비대칭형 암호는 암/복호화가 대칭형 암호에 비해 현저하게 느리다는 문제점이 있다. 따라서 현실적으로는 비대칭형 암호를 이용해서 대칭형 암호의 키를 배송하고 실제 암호문은 대칭형 암호를 사용하는 식으로 상호보완적으로 이용하는 것이 일반적이다. 그리고 비대칭형 암호라고 약점이 없는 것은 아니어서 중간자 공격(MITM : Man In The Middle Attack)에는 취약하다. 해커가 중간에서 통신을 가로채어 수신자에게는 송신자인 척하고 송신자에게는 수신자인 척 해서 양쪽의 공개키와 실제 암호화에 사용되는 대칭키를 모두 얻어내는 기법. 참고로 이 중간자 공격을 미리 차단하기 위해서 사이트 인증서라는 것이 존재한다.

대표적인 비대칭형 암호에는 Diffie-Hellman 키 교환, DSS, ElGamal, ECC, RSA 등이 있다.

위의 과정을 만화로 그렸다.

2.3 단방향 암호

평문을 암호문으로 암호화하는 것은 가능하지만 암호문을 평문으로 복호화하는 것은 불가능한(!) 암호화 기법. 기본적으로 동일한 평문은 동일한 암호문으로 암호화되지만 이를 바탕으로 평문을 복원할 수는 없다. 얼핏 생각하면 뭐 이딴 게 다 암호화냐! 라고 할 수도 있겠지만 실제로는 복호화하지 않아도 상관없는 정보가 있기 마련이다. 예를 들면 패스워드는 양방향 암호로 저장하는 것보다 단방향 암호로 저장하는 것이 안전하다. 암호화된 패스워드 목록이 털린다고 해도 이를 가지고 원래의 패스워드를 복원할 수 없고, 패스워드 자체를 검증할 때는 입력받은 값을 암호화해서 암호화한 값끼리 비교하면 땡이기 때문.

주로 해시 기법을 사용하며 최소한 SHA-256, 가능하면 SHA-3를 쓰는 것이 좋다. 나머지는 취약점이 발견된 상태며, 특히 MD5는 단시간 내에 충돌값을 찾아낼 수 있는 지경에 이르렀다.[2] 패스워드 암호화에 아직도 MD-5를 사용하는 사이트가 있거든 당장 탈퇴하라고 얘기할 정도. 그걸 가입자 입장에서 알 방법이 없다는 게 함정

MD5가 위험하다는 것을 쉽게 예를 들어 설명하자면, 어떤 평문을 해시화했을 때 ABCD가 나온다면, ABCD라는 해시값을 반환하는 여러 개의 평문을 예상보다 쉽게 찾을 수 있다는 의미이다. 이것이 문제가 되는 것은 MD5는 주로 파일의 무결성 검사를 위해 사용하기 때문이다. 공격 코드를 포함하지만 원래 MD5 해시값과 같은 바이너리를 비교적 손쉽게 만들 수 있다는 뜻이다. 물론 아직까지는 엄청난 연산이 필요하지만, 제곱의 기하급수적 증가를 생각해 보면 10비트만 줄여도 계산량은 210분의 1로 줄어든다! 쉽게 말하면 100만 년이 3906년으로 줄어드는 것이다. 이런 문제를 줄이기 위해 SHA-3은 스폰지 펑션, 즉, 원문의 길이에 따라 해시값의 길이가 예측 불가능하게 바뀌는 함수를 내장하고 있다.

3 공격 방법

사실 암호는 보안의 시작이자 끝이다. 즉, 악의적인 공격자는 암호를 해독하려 하고 그것을 지키려는 사람은 악의적 사용자를 배제하고 올바른 정보가 있을 경우에만 올바른 값을 돌려주려 노력한다. 즉, 물고 물리는 전쟁이다. 이러한 전쟁의 승자는 거의 대부분 악의적 사용자로 그 이유는 참으로 단순하게도 전수조사(...)라는 극악의 카드가 있었기 때문이다. 전수조사(Brute Force Attack)는 모든 사용 가능한 키 값을 일일히 대응시켜 올바른 값을 돌려주기를 기다리는 방식으로 사실 모든 암호는 이 공격 방법을 이겨낼 수 없다. 현재 사용하는 암호화 방식들은 이러한 전수조사에서 충분히 긴 시간 동안의 연산이 필요하여 실질적으로 유효한 정보를 가져갈 수 없다는 판단이 선 암호화 방식들이다. AES도 전수조사가 가능해지면 답이 없다. 실제로 분산 컴퓨팅을 동원하여 AES-128을 뚫은 사례가 있기도 하고 과거에 사용된 DES[3]도 당시에는 엄청난 시간이 필요했으나 지금은 아무리 뻗대어도 몇 분이면 털릴 정도니... 즉, 시간이 가면서 컴퓨터의 연산 능력이 강해질수록 필요한 암호 키의 길이는 증가한다. 현재는 128비트도 안전하다고 보기 힘들다는 입장이며 정말로 중요한 정보는 192비트 이상의 사용을 권장한다.[4] 다만, 2016년 현재는 상황이 좀 다르다. AES-192/256에 대한 키 스케줄 알고리즘에 대한 공격 연구가 더 진행되어, AES-256이 오히려 가장 취약하고 AES-128이 더 강하다.
그 외에도 부채널 공격(Side Channel Attack), Linear, Differential, Boomerang, Mod n, Related-key, Slide Rotational, Timing, XSL, Interpolation, Partitioning 등 매년 관련 논문들이 수십, 수백 편씩 나온다. 관련 논문 모음인데 거의 매일 몇 편씩 올라오고 이중에 약 40%가 공격 방법에 대한 논문이라니...

4 암호의 종류

  • 블록 암호
국내에서 개발된 암호 알고리즘은 KISA에서 명세서와 소스코드를 모두 무료로 다운받아 사용할 수 있다.
  • DES: 구 미국 표준. 56비트 키를 사용한다.
  • 3DES: DES를 3번 반복한다. DES로 키를 바꿔가며 암호화→복호화→암호화를 해서 키 길이를 늘리는 기법이다. 2키를 사용하는 경우 112비트, 3키를 사용하는 경우 168비트의 키 길이를 가지기 때문에 현재도 제법 안전성은 있다고는 하지만, 느리다는 문제가 있다.
  • AES: 현재 표준 대칭키 암호화 기법. 128/192/256비트 키를 사용한다.
  • SEED: 대한민국의 국가 암호 표준. 128비트 키를 사용하며 2005년에 ISO/IEC 국제 표준으로 제정.
  • HIGHT: 저전력, 경량 환경에서 사용할 수 있도록 개발된 64비트 블록암호 알고 리즘. 코드 사이즈가 작고 AES보다도 속도가 빠르다. 2010년 12월 ISO/IEC 국 제표준으로 제정.
  • ARIA: SEED 이후로 나온 대한민국의 국가 암호 표준. 128/192/256비트 키를 사용한다. (AES와 동일)
  • LEA: 빅데이터, 클라우드, 모바일 등의 환경에 맞게 2013년에 국내 개발된 128비트 경량 암호 알고리즘. AES의 1.5~2배의 속도를 낼 수 있다.
  • 공개키 암호
    • RSA#s-3: 공개키 암호화 기법의 사실상 표준. 매우 큰 수의 소인수분해가 수학적으로 어렵다는 이론에 기반한다.
    • ECC: RSA의 키 길이가 너무 긴 결점을 보완하기 위해 타원곡선함수를 이용한 암호화 기법. 비교적 최신 기법이다.
  • 암호학적 해시 함수[5]
    • MD5: 현재는 안전하지 않다.
    • SHA
  1. 대표적으로 암호화 키 길이가 56비트에 지나지 않는다. 70~80년대에는 이 정도면 충분한 길이였으나 오늘날에는 거의 의미가 없다. 128비트가 위험하다는 소리가 나오는 세상이다
  2. 이전에는 여기에 "복호화가 가능한 수준"이라고 언급되어 있었는데, MD5는 해시 함수이기 때문에 이는 적절하지 않은 표현이다. 출력값의 길이가 제한된 모든 해시 함수는 비둘기 집의 원리에 의해 충돌값이 반드시 발생할 수 밖에 없다. 따라서 해시값을 가지고 원문을 복원하는 것은 불가능하다는 것은 수학적으로 증명되어 있다. 중학교 수준의 수학만 가지고도 설명할 수 있다(...).
  3. 64비트 키를 사용한다. 패리티 8비트를 빼고 나면 실제 키 길이는 56비트.
  4. 하지만 AES-256에 대한 취약점이 AES-128보다 먼저 공개되긴 했다. 다만 그 취약점이라는 게 전수조사보다 겨우 조금 나은 수준의 공격 방법이라 128비트보다는 튼튼하다.
  5. 해쉬를 이용한 알고리즘은 암호화를 위한 알고리즘으로 쓰이기도 하지만, 무결성 알고리즘이기도 하다. 암호화 알고리즘과 무결성 알고리즘은 같다고 보기는 힘들다. 전자는 파일의 내용을 쉽게 알지 못하도록 변형(암호화)화고 필요할 때 복구(복호화)하는 것이 주라면, 후자는 파일 해쉬값을 이용해 위변조를 인식하는 것이 주 목적이다.