암호화(encryption)는 정보를 노출시키지 않기 위해 특정 알고리즘을 이용하여 암호화된 형태로 변형하는 것을 말하며 이에 역행하는 과정을 복호화(decryption)라고 하며 이로써 암호화된 정보를 다시 읽을 수 있다.
군사와 정부의 은밀한 대화를 위하여 오랫동안 이용되어 왔고 근래에는 기업에서의 데이터 전달 및 개인의 정보를 저장하는데에도 자주 이용되고 있다.
보안이 필요한 정보를 특정 알고리즘을 통해 의미없는 문자열(이진수 덩어리)로 바꾸는 것을 의미하며 이로써 악의적인 목적으로 암호를 해독해 공격하는 것을 방지하는 것을 의미한다.
보안을 위해 시스템적인 보호 방법 보다 근본적인 해결방법이라 할 수 있다.
암호화에는 혼돈(Confusion)과 확산(Diffusion)이라는 조건이 필요하다.
– 혼돈(Confusion) : 원문의 내용을 짐작하기 어렵게 만들어야 한다.
– 확산(Diffusion) : 알고리즘의 패턴을 추론하기 어렵게 만들어야 한다.
: 암호화의 기본요소를 만족하기 위해 다음 두가지 암호화를 교차적으로 적용해 암호화 한다.
치환(Substitution) 암호화와 이동(Transposition) 암호화가 주로 사용되었다.
– Substitution : 단순히 문자를 다른문자로 치환하는 방법으로 혼돈의 조건이 만족된다.
ex) DCA =>HGE
– Transposition : 무작위로(실제로는 특정규칙이 존재) 문자를 다른문자로 치환하는 방법으로 확산의 조건이 만족된다.
ex) DCA =>CBD
컴퓨터의 등장으로 우리는 계산능력이 월등해졌고 이 앞에서 고전적인 암호화는 무용지물이 되었다.
따라서 안전성 보완을 위해 임의의 문자열값인 ‘암호화키’를 활용하게 되었다.
원리는 암호화키와 원문을 바이너리 형태로 변형한 후 배타적 논리합(XOR) 연산에 따라 암호화 & 복호화 를 하게된다.
위와 같은 원리로 암호화 키의 길이, 키의 사용횟수등의 제약이 없다면 복잡도를 무한히 증가시켜 거의 완벽한 암호화를 할 수 있으나 복호화 하는데 비용(시간소모)이 계속 커진다면 사용할 수가 없을 것이기 때문에 일정한 규격에 의한 암호화를 고려해야 한다.
이러한 암호화방식은 양자연산이 가능한 컴퓨팅 방식으로 인해 연산속도가 월등히 빨라진다면 위험하지 않느냐는 의문이 제기 되고는 있지만 양자연산을 통한 해독 알고리즘이 발전되기 전까지는 안전하다고 한다.
즉, 현재까지 주로 사용되는 방식의 암호화는 엄밀히 말하여 완벽한 안전을 보장하는 것이 아니라 현실적으로 풀기 어렵다는 조건부 안전에 의존하고 있다.
평문을 고정된 길이의 암호문(해시값)을 출력하게되는데 암호화 키를 사용하지 않아 항상 동일한 값이 출력된다.
그러므로 복호화가 필요한 경우에는 사용할 수 없으며 누군가의 신원인증을 위해 사용된다.
ex) 사용자 password의 데이터 베이스 저장
송신자와 수신자가 동일한 키를 가지고 암호화 / 복호화 하므로 암호화 키가 노출되지 않아야 하는 단점이 있으나 암호화 연산 속도가 빨라 효율적으로 시스템을 구축할 수 있다.
– 블록 암호 : 고정된 크기의 블록단위로 암·복호화 연산을 수행하며 각 블록의 연산에는 동일한 키가 이용된다. 전치와 환자를 반복시켜 암호화하면 평문의 통계적 성질이나 암호 키와의 관계가 나타나지 않아 안전한 암호를 구성할 수 있다.
– 스트림 암호 : 이진화된 평문 스트림과 이진 키스트림 수열의 XOR 연산으로 암호문을 생성하는 방식으로 주기, 선형 복잡도 등 안전성과 관련된 수학적 분석이 가능하고 알고리즘 구현이 쉬운 특징이 있다.
송신자는 수신자의 공개키에 해당하는 정보를 사용하여 데이터를 암호화하여 네트워크를 통해 전송하고 수신자는 자신의 공개키에 해당하는 비밀키로 암호화된 데이터를 복호화하여 평문을 복원한다.
다른 유저와 키를 공유하지 않더라도 암호를 통한 안전한 통신을 한다는 장점을 갖는다.
각 사용자는 자신에게 전송하기 위해 사용될 키를 공개하고, 공개된 키 정보로 암호화된 정보를 복호화할 수 있는 키를 비밀로 보유하고 있음으로써 누구나 암호화할 수 있지만 공개키에 대응되는 비밀키를 가진 당사자만 복호화할 수 있는 특징을 가진다.
공개키 암호는 수학적인 난제를 기반으로 설계되어 있고, 암호화나 복호화를 수행하기 위한 연산이 복잡한 수학 연산을 기반으로 구성되기 때문에 효율성은 비밀키 암호에 비해 높지 않다.
공개키 암호의 경우에는 모두가 확인할 수 있는 공개키에 대응되는 비밀키가 각 사용자만 알고 있는 정보이기 때문에 광범위한 인증 기능이 제공된다.
수신자가 받은 메시지가 송신자가 보낸 메시지와 동일한 것인지를 확인한다.
메시지 내용 변경, 순서 변경, 삭제 및 불법행위를 탐지하는 걸 의미한다.
관용(대칭키) 암호화 방식
평문을 미리 갖고 있던 비밀키로 암호화 하여 암호문을 수신자에게 전송하면 수신자도 암호문을 비밀키로 복호화 하는 것으로 복호화한 문장으로 메시지 변경 여부를 확인한다.
공개키 암호화 방식
누구나 메시지 인증 검사를 할 수 있지만 개인키를 아는 송신자만 인증을 생성할 수 있으므로 제 3자가 송신자를 가장하여 메시지 전송이 불가하다.
해시 함수를 이용한 메시지 인증 방식
메시지로부터 해시 함수 결과 값을 계산하고 수신한 해시값과 비교해 무결성 검증한다.
하지만 제 3자의 위조 인증을 인지를 알 수 없는 단점이 있다.
(제 3자가 공개된 해시 함수로 만든 위조된 메시지를 전송했을 때의 문제를 의미한다.)
따라서 비밀 정보를 해시함수에 추가하여 메시지와 함께 해시함수의 입력으로 사용한다.
여기서 수신자는 수신한 메시지와 공유한 비밀정보로 해시함수 계산하고 수신한 해시함수 값과 비교하여 메시지 인증 수행한다.
MAC을 이용한 메시지 인증 방식
MAC은 관용 암호방식을 이용하여 무결성 검증 코드를 만들어 메시지에 부가하는 방법이다.
송신자가 인증할 메시지를 비밀키로 암호화 하고 MAC 값을 계산한 후 메시지와 함께 수신하여 메시지를 인증한다.
해시 함수는 임의의 길이를 갖는 메시지를 입력받아 고정된 길이의 해시값을 출력하는 함수이다.
암호 알고리즘에는 키가 사용되지만 해시 함수는 키를 사용하지 않으므로 같은 입력에 대해서는 항상 같은 출력이 나오게 된다.
이러한 해시함수를 사용하는 목적은 메시지의 오류나 변조를 탐지할 수 있는 무결성을 제공하기 위해 사용된다.
어떤 입력 값에도 항상 고정된 길이의 해시값을 출력한다.
눈사태 효과 : 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다.
출력된 결과 값을 토대로 입력값을 유추할 수 없다.
One-way hash function(메시지 다이제스트 함수, 메시지 요약함수, 암호학적 해시 함수)에는 입력과 출력이 각각 1개씩 존재한다.
입력은 메시지(프리 이미지), 출력은 해시값(메시지 다이제스트, 핑거프린트) 이라고 한다.
메시지를 비트열로 취급하며 비트열을 해시값으로 변환한다.
임의 길이의 메시지로부터 고정 길이의 해시값이 만들어진다.
One-way 라는 의미는 해시값을 이용해서 다시 원래의 메시지를 만들 수 없다는 뜻이다.
메시지가 다르면 해시값도 다르다. -> 무결성
다른 메시지 2개로 같은 해시값이 나오면 Collision 발생한다.
이런 경우에 대비해서 해시함수는 충돌내성(collision resistance)를 가져야 한다.
무결성 점검은 새로운 해시값과 이전의 해시값(보통 서버에 있음)을 비교해봄으로써 확인된다.
해시 알고리즘으로 수정 또는 변경을 검출할 수는 있지만 거짓 행세를 검출하는 것은 불가능하기 때문에 무결성 외에 인증이라는 절차가 필요하게 되었다.
메시지 인증 코드는 데이터가 변조(수정, 삭제, 삽입 등) 되었는지를 검증할 수 있도록 데이터에 덧붙이는 코드이다.
원래의 데이터로만 생성할 수 있는 값을 데이터에 덧붙여서 확인하도록 하는 것이 필요하고, 변조된 데이터에 대해서 MAC 을 생성하여 MAC 도 바꿔치기할 가능성이 있으므로 MAC 의 생성과 검증은 반드시 비밀키를 사용하여 수행해야만 한다.
송신자 앨리스와 수신자 밥은 사전에 키를 공유해 둔다.
송신자 앨리스는 송금 의뢰 메시지를 기초로 해서 MAC 값을 계산한다(공유 키를 사용).
송신자 앨리스는 수신자 밥에게 송금 의뢰 메시지와 MAC 값을 보낸다.
수신자 밥은 수신한 송금 의뢰 메시지를 기초로 해서 MAC 값을 계산한다(공유 키를 사용).
수신자 밥은 앨리스로부터 수신한 MAC 값과 계산으로 얻어진 MAC 값을 비교한다.
수신자 밥은 2개의 MAC 값이
동일하면 송금 의뢰가 틀림없이 앨리스로부터 온 것이라고 판단한다(인증 성공).
동일하지 않다면 앨리스로부터 온 것이 아니라고 판단한다(인증 실패).
메시지 인증 코드에서는 송신자와 수신자가 키를 공유할 필요가 있다.
이 키는 적극적 공격자 맬로리에게 넘어가서는 안 된다.
만약 이 키가 맬로리의 손에 들어간다면, 맬로리도 MAC 값을 계산할 수 있기 때문에 자유롭게 변경이나 거짓 행세를 하는 것이 가능하게 된다.
실제로 대칭 암호 때의 '키 배송 문제' 와 같은 문제가 메시지 인증 코드에도 일어난다.
Society for Worldwide Internet Financial Telecommunication(국제은행간 통신 협회)의 약자로 국제적인 은행 간의 송금을 안전하게 행하기 위해 1973년에 설립된 단체이다.
SWIFT에서는 무결성을 확인하고 메시지를 인증하기 위해서, 메시지 인증 코드를 사용하고 있다.
IPsec 은 인터넷 기반의 통신 프로토콜인 IP(Internet Protocol)에 보안 기능을 첨가한 것으로 통신 내용의 인증과 무결성을 확인하기 위해 메시지 인증 코드를 이용하고 있다.
SSL/TLS 는 우리가 웹에서 온라인 쇼핑을 할 때 사용되는 통신 프로토콜로 통신 내용의 인증과 무결성 확인을 위해 메시지 인증 코드를 이용하고 있다.
대칭 키, 공개 키, 비밀 값 등을 이용하여 메시지 다이제스트를 생성하고 검증한다.
대칭 암호 사용
공개키 암호 사용
비밀 값 사용
트리플 DES 나 AES 와 같은 블록 암호를 사용해서 메시지 인증 코드를 실현할 수 있다.
블록 암호의 키를 메시지 인증 코드의 공유 키로 사용하고, CBC 모드를 써서 메시지 전체를 암호화한다.
메시지 인증 코드에서는 복호화를 할 필요가 없으므로 마지막 블록만 제외하고 나머지 블록들은 모두 폐기해 마지막 블록만 MAC 값으로 이용한다.
블록 암호를 이용한 인증코드
스트림 암호나 공개 키 암호 등을 사용해서 메시지 인증 코드를 실현할 수 있다.
코드를 생성하는 알고리즘에는 여러 가지가 있으나 NIST 명세 FIPS PUB 113 에서는 DES 사용을 권장한다.
⇒ DES 를 이용해서 메시지를 암호화하고 암호문의 끝부분에 있는 여러 비트들을 코드로 사용
16 비트 혹은 32 비트 코드가 전형적인 크기이다.
일 방향 해시 함수를 이용해서 메시지 인증 코드를 구성하는 방법을 HMAC 이라 한다.
사용하는 일 방향 해시 함수를 단 한 종류로 정해 놓고 있는 것은 아니며, 강한 일 방향 해시 함수라면 뭐든지 HMAC 에 이용할 수 있다.
새로운 일 방향 해시 함수가 고안된다면 그것을 사용할 수도 있다. 이와 같은 형태로 만들어진 알고리즘을 모듈형 알고리즘이라고 한다.
일 방향 해시 함수를 사용한 메시지 인증 코드의 예
암호기술이 첨가된 해시 함수는 일반적으로 대칭 암호 알고리즘인 DES보다 소프트웨적으로 속도가 빠르다.
암호기술이 포함된 해시 함수에 대한 코드들을 쉽게 구할 수 있다.
대칭 암호 알고리즘이나 MAC 에서 사용하는 대칭 암호 알고리즘까지 수출 규제를 받고 있는데 암호적 해시 함수에 대해서는 미국이나 다른 나라들이 수출 규제를 하고 있지 않다.
수정하지 않고 쓸 수 있는 해시 함수들을 만든다.
소프트웨어에서 잘 돌아가고 코드를 무료로 제공하고 널리 쓰일 수 있도록 한다.
더 빠르고 안전한 해시 함수가 있거나 필요하다면 기존의 해시 함수를 쉽게 교환할 수 있도록 한다.
심각하게 기능저하를 유발하지 않고 해시 함수의 원래 성능을 유지하도록 한다.
키를 보다 쉽게 다루고자 한다.
내장된 해시 함수가 충분히 강하다면 인증 메커니즘의 강도에 대한 암호해독의 정도를 확실히 파악할 수 있도록 한다.
도청, 보존해 둔 메시지와 MAC 값을 반복 송신하는 공격 방법이다.
순서 번호(sequence number) : 송신 메시지에 매회 1씩 증가하는 번호를 넣는다.
타임스탬프(timestamp) : 송신 메시지에 현재 시각을 넣는다.
비표(nonce) : 메시지를 수신하기에 앞서 수신자는 송신자에게 일회용의 랜덤 한 값(비표)을 건네준다.
키의 추측에 의한 공격
메시지 인증 코드에 대해서도 전사 공격과 생일 공격이 가능하다.
공격자에 의해 송수신에서 사용된 키를 추측당해서는 안 된다.
메시지 인증 코드에서 사용하는 키를 생성할 때에는 암호학적으로 안전하고 강한 의사 난수 생성기를 사용해야 한다.
앨리스로부터 메시지를 받은 밥이 '이 메시지는 앨리스가 보낸 것이다' 라는 것을 제3자인 검증자 빅터에게 증명하고 싶다고 하자.
그러나 메시지 인증 코드로 그 증명을 행할 수는 없다.
부인 방지가 가능하다는데!!!!!!!! 왜 부인 방지가 불가능하냐는 것인가??
밥이 MAC 값이 딸린 메시지를 받았다고 하자.
이 MAC 값은 앨리스와 밥이 공유하고 있는 키를 사용해서 계산한 것이다.
밥은 '이 메시지는 앨리스로부터 온 것이다' 라고 알 수 있다.
그러나 위에서 말한 것처럼 그것을 검증자 빅터에게 증명할 수는 없다.
즉, 송신자 앨리스는 의도적으로 혹은 자신이 불리하게 될 가능성 등을 고려하여 '나는 밥에게 그런 메시지를 보내지 않았어' 라고 빅터에게 주장할 수도 있다는 것이다. 이와 같은 주장을 부인(repudiation)이라고 한다.