블록 암호 운용방식
블록 암호의 운용 방식은 다음과 같다.
하나의 키로 블록 암호를 반복적으로 안전하게 이용하게 하는 절차.
예를들어 DES의 경우, 블록사이즈가 64비트이다.
그렇다면, 평문을 64비트 단위로 쪼개서 여러번 암호화를 수행해야 할 것이다.
이 때, 반복적으로 이용하는 방법에 따라 여러가지 모드로 나눌 수 있다.
블록암호를 운용하는 방식에 따라 ECB, CBC, CFB, OFB, CTR 모드가 있다.
블록암호의 운용모드
가장 단순하며 기본적인 모드
운용방식 중 가장 간단한 구조로, 암호화하려는 메세지를 여러 블록으로 나누어 각각 암호화하는 방식이다.
각 블록이 독립적으로 동작하므로 한 블록에서 에러가 난다고 해도 다른 블록에 영향을 주지 않는다.
(암/복호화 모두 병렬처리 가능)
모든 블록이 같은 암호화 키를 사용하기 때문에 보안에 취약하다.
만약 암호화 메세지를 여러 부분으로 나누었을 때 두 불록이 같은 값을 가진다면, 암호화한 결과 역시 같다. 이는 공격자가 비슷한 메세지를 반복적으로 암호화하는 반복공격에도 취약하다.
블록암호 운용모드 중에서 가장 보안성이 높은 모드로 가장 많이 사용되고 있다.
각 블록은 암호화되기 전에 이전 블록의 암호화한 결과과 XOR되며, 첫 블록의 경우에는 초기화 벡터(Initial Vector)가 사용된다.
초기화 벡터같은 경우 출력 결과가 항상 같기 때문에, 매 암호화마다 다른 초기화 벡터를 사용해야한다.
CBC 방식은 현재 널리 사용되는 운용방식 중 하나로 ECB와 달리 동일 평문이 동일한 암호문으로 되지 않는다.
암호화는 병렬처리가 불가능하지만 복호화의 경우 병렬처리가 가능하다.
그리고 메세지는 암호블록 사이즈의 배수로 패딩 되어야한다.
- 패딩(padding)이란?
블록암호 알고리즘에서 블록의 크기를 일정하게 맞추기 위해 빈 부분을 채워주는 것을 말한다.
ECB 및 CBC 모드에서 AES 및 트리플 DES 와 같은 블록암호 알고리즘은 입력 내용이 블록 크기의 정확한 배수(64비트 또는 128비트)가 되어야 한다.
원문의 크기가 16바이트(64비트 또는 128비트)의 배수가 아니라면 마지막 블록은 16바이트보다 작은 크기가 된다. 이 때 마지막 블록의 빈 부분을 채워주는 방식을 패딩이라고 한다.
평문 블록 내의 한 비트가 변경될 경우, 이어지는 모든 암호 블록에 영향을 주게 된다.
CBC의 변형인 모드로 동일 평문이 동일한 암호문이 되지 않도록 하며, 블록암호가 스트링암호처럼 구성하여 평문과 암호문의 길이가 같다. (== 패딩이 필요없다.)
IV를 암호화한 값과 평문 블록을 XOR 하여 암호블럭을 생성하고 그 암호문을 초기값으로 하여 그걸 다시 암호화한 값과 다음 평문블록을 XOR 하여 암호블록을 반복하여 생성하는 방식이다.
CBC와 마찬가지로 암호화는 순차적이고, 복호화는 병렬적으로 처리 가능하다.
ECB와 CBC모드에서는 암호 알고리즘을 이용하여 평문블록을 암호화한 반면, CFB모드에서는 평문블록을 암호 알고리즘으로 직접 암호화하지 않는다.
암호화, 복호화 모두 암호화(Encryption)로만 처리 가능하다.
CFB 모드와 스트림암호
: CFB 모드에서는 암호 알고리즘이 생성하는 비트열을 키 스트림(key stream)이라 부른다.
키 스트림을 생성하기 위한 의사난수 생성기로서 암호알고리즘을 이용하고 있으며 초기화 벡터가 의사난수 생성기의 seed에 해당한다. 이 모드에서는 평문의 데이터를 1비트씩 암호화할 수 있으며 CFB모드는 블록암호를 사용하여 생성한 키를 이용하는 스트림암호라고 간주할 수 있다.
암호알고리즘의 출력을 암호 알고리즘의 입력으로 피드백
블록암호가 스트링암호처럼 구성하여 평문과 암호문의 길이가 같다. (== 패딩이 필요없음)
초기값 IV를 암호화하고 그 값을 다시 암호화하는 과정을 반복함으로써 생성된 값과 평문블록을 XOR하여 암호문을 생성하는 방식이다.
평문블록은 암호알고리즘에 의해 직접 암호화되는 것이 아니라 평문블록과 암호알고리즘의 출력을 XOR하여 암호블록을 만든다.
암호화방법과 복호화방법이 동일하기 때문에 암호문을 한 번 더 암호화하면 평문이 나온다. (복호화시에 암호화)
주로 블록암호 시스템을 스트림암호 시스템처럼 사용하고자 할 때 이용한다.
암호문의 오류는 복호화 과정에서 대응되는 한 블록에만 영향을 미치므로, 영상이나 음성과 같은 digitied analog 신호에 자주 사용한다.
CBC모드에서는 암호블록을 피드백하기 위해서 처음의 평문블록부터 순서대로 암호화해야하지만, OFB모드에서는 평문블록과 관계없이 암호 알고리즘을 미리 돌려서 XOR하기 위한 비트열(키 스트림)을 준비할 수 있다.
→ 키 스트림을 미리 준비하면 평문으로부터 암호문을 만들 때 암호알고리즘을 작동시키지 않고 평문과 키 스트림의 XOR만 취하면 된다.
CFB와의 차이점은 암호알고리즘의 입력 만이 다르다.
CFB모드에서는 바로 이전의 암호블록이 암호 알고리즘의 입력이고, OFB모드에서의 암호 알고리즘 입력으로 사용되는 것은 암호 알고리즘의 한 단계 앞의 출력값이다.
OFB와 같이 블록암호를 스트림암호처럼 사용하기 위한 목적으로 사용한다.(== 패딩이 필요없다.)
암호화와 복호화가 같은 구조이다.
초기값 IV와 Counter를 1씩 증가한 값을 연결한 것을 암호화하여 생성된 값과 평문블록을 XOR하여 암호문을 생성한다.
(구성도의 Nonce는 다른 곳의 초기화 벡터인 IV와 동일)
병렬성이 뛰어나고, 비밀키와 IV가 주어지면 미리 계산할 수 있어서 바로 평문을 가지고 암호문을 만들 수 있다.
동일한 비밀키와 IV를 반복하여 사용할 경우 안전성에 문제가 생긴다는 취약점이 있다.
CFB 와 OFB모드보다는 CTR 모드를 사용하는 편이 좋다.
SSL 이란?
SSL(Secure Socket Layer) 프로토콜은 웹서버(서버)와 브라우저(클라이언트) 사이의 보안을 위해 만들었다.
SSL은 서버와 클라이언트의 인증을 하는데 사용된다.
신뢰할 수 있는 제 3자가 발행한 인증서를 통해 별도로 발급한 암호화 키를 가지고 발신자와 수신자가 (예 > 클라이언트와 서버)
서로 암호화된 통신을 하는 규약 (프로토콜) 을 의미한다.
** TLS (Transport Layer Security Protocol) 와 SSL 은 같은 의미로 통용되고 있다.
처음 네스케이프사에 의해 SSL 이 발명되었고, 이것이 점차 폭넓게 사용되다가 표준화 기구인 IETF 에 의해 관리를 하게 되면서 TLS 라는 이름으로 변경 되었다.
SSL 암호화
SSL에서는 데이터를 암호화해서 전송하므로 여기에서 사용되는 방식으로 대칭키 암호화와 비대칭키 암호화가 있다.
암호화는 크게 ‘암호화 (Encryption)’ 와 ‘복호화 (Decryption)’ 를 하는 과정으로 구성되어 있다.
발신자는 암호화 알고리즘을 수행하는 암호화 키를 이용해서 평문을 암호화 하고, 수신자는 암호화된 데이터를 해독하는 복호화 키를 이용해서 해독한다.
SSL 에서 사용하는 암호화 기술/방식은 암호화 키와 복호화 키의 구현 및 사용 방법에 따라 대칭 키(공용 키) 방식과 비대칭 키(공개 키) 방식으로 구분할 수 있다.
서로 통신하는 발신자와 수신자가 모두 동일한 키를 이용하여 암호화 및 복호화 하는 방식을 의미한다.
대칭 키 방식은 구조가 단순하기 때문에 속도가 빠르다는 장점이 있다.
그러나 양 측의 키가 같기 때문에 키를 전송하는 과정에서 제 3자가 입수 등의 문제가 발생할 수 있다.
> 암호화 종류 : DES (Data Encryption Standard / 데이터 암호화 표준), 3DES (Triple Data Encryption Standard / 3중 데이터 암호화 표준), AES (Advanced Encryption Standard / 고급 암호화 표준)
발신자와 수신자가 서로 다른 암호화 키 및 복호화 키를 사용하는 방식을 의미한다.
즉, 모두에게 공개 가능한 공개 키 (Public Key) 와 모두에게 비밀로 해두고 한 쪽에서만 사용하는 비밀 키 (Secret Key) 방식을 사용한다.
이 둘은 키 페어 (Key Pair) 관계, 즉 쌍으로 존재한다. (한 쪽의 키만 가지고 다른 키를 만들거나, 암호화된 데이터를 해독할 수 없음)
따라서, 한 쪽의 비밀 키를 전송하지 않아도 되므로 키 분배 문제가 없어지는 장점이 있다.
그러나 비대칭 키 암호화 방식은 처리가 복잡하기 때문에 그만큼 속도가 비교적 느리다는 단점이 있다.
> 암호화 종류 : RSA (Rivet Sharmir Adleman), 타원 곡선 암호 (Elliptic Curve Cryptosystem)
1) 수신자는 공개 키와 비밀 키를 함께 만듦 (키 페어)
2) 수신자는 공개 키를 모두에게 배포, 비밀 키는 보관
3) 발신자는 공개 키로 데이터를 암호화 하여 송신
4) 수신자는 비밀 키로 수신한 데이터를 복호화
발신자가 비대칭 키 방식의 공개 키로 대칭 키 (공용 키) 를 암호화 하여 상대방에게 전송한 후, 수신자가 비밀 키로 해당 대칭 키를 복호화 하는 방식을 의미한다.
이 후 메세지는 대칭 키를 이용하여 암호화/복호화를 하게 된다.
이렇게 하여 대칭 키 방식의 장점인 빠른 속도와 비대칭 키 방식의 장점인 키 분배 문제를 동시에 해결할 수 있다.
SSL 은 바로 이 하이브리드 방식을 이용하고 있다.
1) 수신자는 공개 키와 비밀 키를 만듦
2) 수신자는 공개 키를 모두에게 배포, 비밀 키는 보관
3) 발신자는 공개 키로 공용 키를 암호화하여 수신자에게 전송
4) 수신자는 비밀 키로 공용 키를 복호화 (메세지 암호화를 위한 공용 키가 양 측 모두에게 있는 상태가 됨)
5) 발신자는 공용 키로 데이터를 암호화하여 송신
6) 수신자는 공용 키로 수신한 데이터를 복호화
인증기관 (Certification Authority - CA)
HTTPS 통신에서는 제3자 인증을 사용한다.
인증기관(CA)으로 부터 공인인증서를 발급받아서 서버에 설치해야 경고 없이 HTTPS 통신을 할 수 있다.
인증기관의 인증을 받았다는 것은 웹서비스를 제공하는 소유자를 보증해 준다는 의미이다.
자세히는 웹서비스 제공자의 공개키가 키 소유자의 것이라는 것을 보증해준다.
HTTPS로 웹서비스를 제공하려는 사람은 자신의 공개키와 개인키를 생성하고, 공개키를 인증기관에 보낸다.
인증기관에서는 보내온 공개키, 유효기간, 도메인 등의 정보를 포함하여 인증기관의 개인키로 전자서명한 인증서를 발급한다.
웹서비스 제공자는 발급 받은 인증서와 자신의 개인키를 웹서버에 설정하여 HTTPS 통신을 할 수 있게된다.
클라이언트 즉, 웹 브라우저에는 여러 인증기관의 공개키를 포함한 인증서가 이미 설치되어 있다.
그래서 웹서버와 통신시 인증기관의 개인키로 서명된 인증서를 받았을때 이미 설치되어 있는 인증기관의 공개키로 복호화가 가능한 것이다.
개발 목적이나 내부에서 사용할 목적으로 사설 인증서를 만들 경우 웹 브라우저에 인증서를 수동으로 설치해야만 경고 없이 통신을 할 수 있다.
웹서비스를 하시는분이 키생성등의 기술적인 작업을 잘 모르기 때문에 인증서 발급기관에서 개인키/공개키 생성해서 인증서를 발급해준다.
개인키는 노출되지 않는게 중요하므로 직접 키를 생성해서 인증서를 발급 받는 것이 좋다.
SSL 동작 방식
위에서 설명한 하이브리드 암호화 방식을 토대로 인증기관이 포함된 전체적인 SSL 의 동작과정은 다음과 같다.
특히 인증 기관에서 발급하는 인증서를 설치하는 과정이 먼저 준비가 되어야 하는 과정이 포함되어 있다.
실제는 데이터 전송을 위해 웹브라우저가 지원하는 암호화 방식과 서버가 지원하는 암호화 방식들 중 둘 다 지원하는 암호화 방식을 선택하는 등의 많은 작업이 있고,
키 교환도 다른 방식이 있을 수 있다.
디피-헬먼 키 교환(Diffie–Hellman key exchange)
디피-헬먼 키 교환(Diffie–Hellman key exchange)은 암호 키를 교환하는 하나의 방법이다.
두 사람이 암호화되지 않은 통신망을 통해 공통의 비밀 키를 공유할 수 있도록 한다.
휫필드 디피와 마틴 헬먼이 1976년에 발표하였다.
디피-헬먼 키 교환은 기초적인 암호학적 통신 방법을 수립하였으며, 이후 1977년 공개 키 암호 방식인 RSA 암호가 제안되었다.
동작 원리
공개적으로 교환할 발생기(Generator)를 생성한다.
이는 g라고 하고 우리가 mod 할 값 p는 소수로 지정한다.
(이때 A와 B가 교환하여 결합한 값이 서로 같다는 것을 확인하자.)
이때 공격자인 T가 있다고 가정해보자.
T는 A와 B사이에서 데이터를 가로채기 시작하는데
공격자가 가로챈 값들로는 절대 를 만들 수 없음을 알 수 있다.
( 공격자는 만들어봤자 밖에 만들지 못한다. )
핵심
디피-헬만법은 이산대수의 어려움을 이용한 알고리즘이다.
쉽게 말해 주어진 g, x, p 를 이용하여 y = g^x mod p 를 구하기는 쉽지만 g, y , p 값을 이용하여 원래의 x를 찾기 어렵다는 원리를 이용한 것이다.
예시
지금은 예시이기 때문에 매우 작은 숫자를 이용하였으나, 숫자가 수십~수백자리로 커지게 되면 2, 17, 8, 15, 9에 해당하는 숫자는 노출이 되어도 이를 역으로 11과 13을 유추해 내기가 매우매우 힘들다는 것이 수학적 안전성의 근거이다.
취약점
디피-헬만 키 교환은 단순히 안전한 키 교환에 의한 안전성에 의존하므로 단독으로 사용하기엔 부족하다.
디피-헬만은 수 많은 프로토콜에서 사용되고 있지만 모두 인증, 무결성, 부인방지 등의 추가적인 안전성을 더해서 사용한다.
전자 봉투
데이터는 대칭키(비밀키)를 이용해 암호화하고 대칭키를 상대방의 공개키로 암호화하여 전달하는 방식, 또는 대칭키가 암호화된 형태이다.
활용 목적
대칭키를 이용해 데이터를 암호화할 경우 대칭키의 전달 과정에서 키가 유출될 수 있는 키 배송 문제 발생한다.
비대칭키 암호화는 키 배송 문제를 해결해주지만, 키의 길이가 길어 암호화에 큰 부하 발생하고 속도가 느리다.
실질적인 암호화는 대칭키를 이용해서 빠르게 수행하되, 대칭키의 운송을 위해 비대칭키를 이용함으로써 속도와 안정성 문제 해결한다.
절차
활용 사례
공개키를 사용하는 수많은 프로토콜에서 흔히 이용됨 ( SSL/TLS )
문제점과 보완
암호학에서 공개키는 송신자 뿐만 아니라 모든 사람에게 공개된다고 가정
전자봉투만으론 데이터 위변조, 재전송 공격, 부인 방지 등에 대한 대책 부재
논스(nonce) :
블록체인에서 목표값 이하의 블록 해시를 찾기 위해 임시로 사용하는 숫자이다.
넌스, 난스 또는 임시값이라고도 한다.
시도 응답 인증 (Challenge Response Authentication) :
한 쪽에서 질문(Challenge)을 던지면 다른 한쪽에서 적절한 대답(Response)를 응답하게 함으로써 인증하는 방식을 말한다.
- 개념
일반적인 암호방식은 암호를 가로채게 되면 동일한 인증이 가능하다.
암호가 식별자나 시간에 따라, 인증 시 마다 다르다면 암호를 가로채더라도 의미가 없다.
고정적인 비밀번호나 비밀키를 공개하지 않고 문답형식으로 인증함으로써 중간자공격을 방지하는 모든 모델을 포함한다.- 예시
OTP : 특정 시점, 또는 특정 차수의 일회성 비밀번호를 요구하고, 받아서 동기화된 키값을 검증한다.
CAPTCHA : 왜곡·변형된 이미지를 보여주고, 사람이 인지한 해독값을 받아 인증한다.
군대 암구호 : 야간에 시각적으로 식별이 어려운 상황에서 일정 주기로 바뀌는 문어/답어를 통해 상호 인증한다.