암호 알고리즘

 

1. 개요
2. 암호의 분류 방법
2.1. 대칭형 암호
2.2. 비대칭형 암호
2.3. 단방향 암호
3. 공격 방법
4. 암호의 종류
6. 관련 문서


1. 개요


'''IotBN8)yfBA7L9OjoK)phwEfVXRSg9XukiY!'''

단어 namu.wiki을 암호 umanle, 448비트 Blowfish 방식으로 암호화한 문장.

컴퓨터에서 쓰이는 암호 알고리즘.
컴퓨터가 발달하면서 이전에는 군용이나 중대한 사업용으로만 쓰이던 암호가 일상 생활에도 널리 활용되게 되었다. 단순한 개인 게시판을 시작으로 대형 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를 읽어들이는 시간에 따라 서버와 통신시간에서 차이가 발생할 수 있어서 취약점이 발생한다고 지적하고 있다.
대칭 열쇠 암호 문서 참조.

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)은 모든 사용 가능한 키 값을 일일이 대응시켜 올바른 값을 돌려주기를 기다리는 방식으로 사실 모든 암호는 무한한 시간이 주어졌다는 가정하에서 이 공격 방법을 이겨낼 수 없다. 그래서 몇 번에서 몇십 번 정도 잘못된 키를 보내면 실명인증하거나 직접 서비스 회사로 본인이 찾아가기 전까지 아예 계정을 잠가버리는 경우가 많다. 파일이나 하드디스크 암호화라면 기기를 초기화 시켜 버리는 경우도 많다. 그러나 이러한 제한은 시스템 취약점 공격으로 쉽게 우회가 가능하니 처음부터 휴대폰 비밀번호를 무차별 대입법으로 해제가 불가능할 정도로 복잡하게 만드는 것이 좋다.[3]
현재 사용하는 암호화 방식들은 이러한 전수조사에서 충분히 긴 시간 동안의 연산이 필요하여 실질적으로 유효한 정보를 가져갈 수 없다는 판단이 선 암호화 방식들이다. 과거에 사용된 DES[4]도 당시에는 엄청난 시간이 필요했으나 지금은 아무리 뻗대어도 몇 분이면 털릴 정도니... 즉, 시간이 가면서 컴퓨터의 연산 능력이 강해질수록 필요한 암호 키의 길이는 증가한다.
암호 자체를 전수조사로 푸는 것은 매우 많은 시간이 소요되고 사전이 있더라도 풀 수 있을것이라는 보장이 없음으로 암호화 시스템의 취약점을 이용해 암호키를 훔치거나 인증 과정을 우회하는 것을 선호한다. 랜섬웨어를 복구하는 도구들도 암호 자체를 풀는 것 보다는 랜섬웨어의 취약점을 이용해 암호키를 추출하는 방식이 많다.
부채널 공격(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배의 속도를 낼 수 있다.
  • Blowfish
  • Camellia: 일본미쓰비시전기와 NTT에서 개발한 알고리즘. 블록 사이즈는 128비트이며 128/192/256비트 키를 사용한다.
  • 공개키 암호
    • RSA#s-3: 공개키 암호화 기법의 사실상 표준. 매우 큰 수의 소인수분해가 수학적으로 어렵다는 이론에 기반한다.
    • ECC: RSA의 키 길이가 너무 긴 결점을 보완하기 위해 타원곡선함수를 이용한 암호화 기법. 비교적 최신 기법이다.
  • 암호학적 해시 함수[6]
    • MD5: 현재는 안전하지 않다.
    • SHA
    • bcrypt: 블로피시(Blowfish)라는 블록 암호 알고리즘을 해시 함수로 변형한 것이다.
    • PBKDF2: 미국 정부기관에서 승인할 정도로 검증된 암호학적 해시 알고리즘이다.
    • scrypt: PBKDF2의 강화판. 굼벵이 같은 해싱 속도로 유명하다(...). [5]

5. 악용 사례


랜섬웨어는 사용자의 파일을 암호화 하여 파일가지고 인질극(...)을 벌이는 악성코드다. 랜섬웨어마다 다르지만 보통 TLS에서 볼 수 있듯이 파일마다 AES-256 키를 생성하여 RSA 암호화-4096 공개키로 암호화 시킨다. 파일을 복구하는 방법은 해커한테 돈을 주거나 [7] 전수조사라는 궁극의 기술을 사용하면 암호화를 풀 수 있다.[8] 자세한 것은 랜섬웨어 참조.

6. 관련 문서





[1] 대표적으로 암호화 키 길이가 56비트에 지나지 않는다. 70~80년대에는 이 정도면 충분한 길이였으나 오늘날에는 거의 '''의미가 없다'''.[2] 이전에는 여기에 "복호화가 가능한 수준"이라고 언급되어 있다. 복호화하는 것은 가능하지만, 그것이 원문이라는 보장이 없다. 출력값의 길이가 제한된 모든 해시 함수는 비둘기 집의 원리에 의해 충돌값이 반드시 발생할 수밖에 없다. 따라서 해시값을 가지고 원문을 복원하는 것은 불가능하다는 것은 '''수학적으로 증명되어 있다.''' 중학교 수준의 수학만 가지고도 설명할 수 있다(...).[3] 이스라엘의 포렌식 업체에서 USB단자를 통한 해킹으로 아이폰 비밀번호 입력 횟수 제한을 해제한 사례가 있다. 추측하기 어러운 복잡한 문자열로 최소한 16자 이상으로 만드는것이 좋다.[4] 64비트 키를 사용한다. 패리티 8비트를 빼고 나면 실제 키 길이는 56비트.[5] 느리다는 점을 이용해 라이트코인이 스크립트 알고리즘을 사용하긴 하지만 결국 스크립트 알고리즘 역시 ASIC이 나와버리고 결국...[6] 해쉬를 이용한 알고리즘은 암호화를 위한 알고리즘으로 쓰이기도 하지만, 무결성 알고리즘이기도 하다. 암호화 알고리즘과 무결성 알고리즘은 같다고 보기는 힘들다. 전자는 파일의 내용을 쉽게 알지 못하도록 변형(암호화)화고 필요할 때 복구(복호화)하는 것이 주라면, 후자는 파일 해쉬값을 이용해 위변조를 인식하는 것이 주 목적이다.[7] 먹튀하는 경우도 있다(...).[8] 전수조사는 복호화 확률 100% 를 자랑한다! 가장 확실한 방법이다. 문제라면 가정용 컴퓨터 따위로는 이런 암호화를 뚫는 게 불가능하고, 심지어 슈퍼컴퓨터로도 수백만 년이 걸릴지도 모른다(...)