대칭 암호 구조 요소
- 평문(PlainText) : 원문이나 데이터로서 알고리즘의 입력으로 이용된다.
- 암호 알고리즘(Encryption algorithm) : 암호 알고리즘은 입력으로 돌아온 원문을 다양한 방법으로 치환하고 변환한다.
- 비밀 키(Secret Key) : 비밀키도 알고리즘의 한 입력으로 이용된다. 이 키를 이용하는 알고리즘에 의해서 정확한 대체와 전환이 이루어진다.
- 암호문(Ciphertext) : 출력으로 나오는 암호화된 메시지이다. 이는 평문과 비밀키에 따라서 달라진다. 주어진 메시지에 대해 서로 다른 키를 사용하면 두 개의 암호문은 서로 다르게 출력된다.
- 복호 알고리즘(Decryption algorithm) : 이것은 근본적으로 암호 알고리즘을 역으로 수행하는 것과 같다. 암호문에 알고리즘과 사용했던 동일한 키를 적용하여 원문을 복구해내는 것이다.
대칭 암호 단순 모델(http://funnyksoo.blogspot.com/2014/11/symmetric-cipher-model-1-1.html)
대칭 암호 필수 사항
- 강한 암호 알고리즘 : 공격자가 알고리즘과 암호문, 평문 정보를 인지하고 있더라도 절대 암호문을 해독하거나 키를 알아낼 수 없어야 한다.
- 안전한 비밀키 관리 : 공격자가 비밀키와 알고리즘을 안다면, 이 키를 이용한 모든 통신은 노출되기 때문에, 송신자와 수신자는 공유하는 비밀키를 안전한 방법을 통해서 획득해야 하며, 안전하게 보관해야 한다.
암호 시스템 단계(독립적)
- 평문을 암호문으로 전환하는 데 사용되는 연산 유형
- 대체 : 평문의 각 요소(비트, 문자, 비트블록, 문자블록)를 다른 요소로 바꾸는 것
- 치환 : 요소의 순서를 재조정하는 것
- 두 가지의 핵심 : 어떤 정보도 손실되지 않아야 한다.
- 사용되는 키의 수
- 송신자와 수신자 양측이 동일한 키를 사용할 경우 : 대칭암호, 단일키 암호, 비밀키 암호 혹은 관용 암호
- 송신자와 수신자가 서로 다른 키를 사용할 경우 : 비대칭암호, 쌍키 암호, 공개키 암호
- 평문으로 처리되는 방법
- 블록 암호 : 한 번에 한 블록씩 입력하여 처리하고 한 블록씩 출력
- 스트림 암호 : 입력 요소를 연속적으로 처리하여 한 번에 한 요소씩 출력
암호해독
- 평문이나 키를 찾으려는 시도
- 암호해독 공격 유형
공격 유형 |
암호해독가가 알고 있는 정보 |
특징 |
암호문만 알고 있는 공격 |
- 암호 알고리즘 - 해독해야 할 암호문 |
- 평문의 통계적 성질, 문장의 특성 등을 추정하여 해독 - 전수 공격을 사용한 해독
|
알려진 평문 공격 |
- 암호 알고리즘 - 해독해야 할 암호문 - 비밀키로 만들어진 한 쌍 혹은 여러 쌍의 평문-암호문 |
- 암호문과 평문과의 관계로부터 키와 전체 평문을 추정하여 해독 |
선택 평문 공격 |
- 암호 알고리즘 - 해독해야 할 암호문 - 해독가가 선택한 평문 메시지와 비밀키로 그 평문을 암호화한 암호문 |
- 키의 구조를 파악해낼 수 있는 평문의 패턴을 해독가가 선택하여 해독 |
선택 암호문 공격 |
- 암호 알고리즘 - 해독해야 할 암호문 - 해독가가 목적을 갖고 선택한 암호문과 비밀키로 그 암호문을 복호화한 평문 |
- 무작위로 선택한 암호문과 일치하는 평문을 이용하여 해독 |
선택문 공격 |
- 암호 알고리즘 - 해독해야 할 암호문 - 해독가가 선택한 평문 메시지와 키를 가지고 그 평문을 암호화한 암호문 - 해독가가 목적을 갖고 선택한 암호문과 비밀키로 그 암호문을 복호화한 평문 |
- 선택 평문과 선택 암호문을 합친 공격 |
계산적으로 안전한 암호 구조 조건
- 암호문을 깨는 데 드는 비용이 암호화된 정보의 가치보다 더 크다.
- 암호문을 깨는 데 걸리는 시간이 해당 정보의 수명보다 더 길다.
키 탐색에 요구되는 평균 시간
Feistel 암호 구조
Feistel 암호 구조(https://i.stack.imgur.com/AIPrN.png)
- 평문 블록을 L0와 R0로 나눈다.
- 라운드 함수 F를 R0에 적용한 다음 해당 함수의 출력과 데이터의 L0에 XOR 연산을 시행하는 식으로 L0의 대체를 수행한다.
- 비밀키 값은 라운드 함수에 적용되며, 각 라운드마다 비밀 키로부터 생성 알고리즘으로 생성된 서브키를 사용한다.
- L0의 대체를 수행한 결과는 R1에, R0는 L1에 교환되는 식으로 치환을 수행한다.
- 1-3와 같은 과정을 라운드 수만큼 진행한다.
- 라운드 수는 원하는 만큼 -> Feistel 암호 핵심
- Feistel 복호화 과정은 근본적으로 암호 과정과 동일
- 암호문을 알고리즘의 입력으로 사용하고 서브키 순서를 거꾸로 적용
대칭 블록 암호 구현 : 매개변수와 설계 특성
- 블록 크기(Block size) : 블록 길이가 크다는 것이 더 강한 보안을 의미하지만(다른 조건이 같다는 가정하에) 길이가 길면 암호화/복호화 속도는 떨어진다. -> 64비트의 블록 크기가 가장 합리적인 크기이고 블록 암호 설계에서 주로 이 크기를 사용
- 키 크기(Key size) : 키 길이가 크다는 것이 더 강한 보안을 의미하지만 암호/복호 속도는 떨어진다. -> 가장 보편적인 키 길이 : 128비트
- 라운드 수(Number of rounds) : 단일 과정으로는 보안이 부족하지만 라운드 수를 증가시켜 보안을 강화 할 수 있다. -> 전형적인 라운드 수 : 16
- 서브키 생성 알고리즘(Subkey generation algorithm) : 이 알고리즘이 복잡하면 복잡할수록 암호해독이 어려워진다.
- 라운드 함수(Round Function) : 이 함수 역시 복잡하면 복잡할수록 암호해독이 어려워진다.
Feistel 암호 설계 고려사항
- 빠른 소프트웨어 암호/복호(Fast software encryption/decryption) : 대부분 하드웨어적인 구현을 피할 수 있도록 암호화는 응용 프로그램이나 유틸리티 함수에 내장시킨다. 따라서 알고리즘 실행속도를 고려해야 한다.
- 용이한 해독(Ease of analysis) : 비록 암호해독을 쉽게 못하도록 알고리즘을 만들어야 하지만, 알고리즘 구조를 단순하게 만들면 암호 해독적 취약점을 찾아 더 강한 보안성 및 신뢰성을 갖는 알고리즘으로 발전시킬 수 있다.
위 글은 "Network Security Essentials William Stallings 저"을 공부하며 쓴 글입니다.
댓글 영역