제 13장 PGP 암호 기술을 조합하는 기술
13.1 주요 내용 전자메일은 우리가 생각하는 것만큼 안전하지 않다 암호학적인 측면에서 보면 매우 취약하다. 전자메일에 대한 인증과 기밀성 서비스가 매우 중요해졌다 두 가지 중요한 전자메일 PGP(Pretty Good Privacy) S/MIME (Secure/Multipurpose Internet Mail Extensions)
주요내용 PGP의 개요 키 쌍의 작성 암호화와 복호화 디지털 서명 작성과 검증 디지털 서명 작성과 암호화 복호화와 디지털 서명 검증 신뢰 망
13.2 PGP의 개요 암호 알고리즘을 조정하는 정보 조각 평문을 암호문으로 전환 암호문을 복호화하는 역할 디지털 서명 구조 키를 이용한 해시 함수 인증
13.2.1 PGP란 1990년경에 필립 짐머만(Philip Zimmermann)이 만들었다 현재도 전 세계에서 널리 사용되고 있는 암호 소프트웨어이다. PGP라는 이름은 Pretty Good Privacy(매우 좋은 프라이버시)의 약자이다.
13.2.2 PGP의 인기 비결 다양한 기종에서 작동되는 여러 버전을 만들었으며 이것을 전 세계에 무료로 제공했다. 엄격하고 공개적인 검증을 거친 알고리즘들을 기반으로 하고 있다. 매우 다양한 계층과 영역에서 사용할 수 있다. 통제기관으로부터 자유스러움을 느끼고 싶은 사람들이 선호한다 OpenPGP는 인터넷 표준화 트랙 과정에 있다.
13.2.3 PGP의 기능 PGP는 현대 암호 소프트웨어에 필요한 기능을 거의 전부 갖추고 있다. 대칭 암호 공개 키 암호 디지털 서명 일방향 해시 함수 인증서 압축 텍스트 데이터 큰 파일의 분할과 결합 키 고리의 관리
13.2.4 암호키와 키 고리 PGP에서 사용하는 4종류의 키 대칭 암호용 일회용 세션키 비대칭 암호용 공개 키 비대칭 암호용 개인 키(위의 공개 키와 쌍이 되는 키) 패스문-기반(passphrase-based) 대칭키
키의 3 가지 필수사항 추측할 수 없는 세션 키를 생성하는 방법이 필요하다 사용자가 공개 키/개인 키 쌍을 여러 개 가질 수 있어야 한다 각 PGP 사용자는 상대방의 공개 키를 보관하는 파일 뿐만 아니라 자신의 공개 키/개인 키 쌍을 보관하는 파일도 갖고 있어야 한다.
일회용 세션 키 생성 세션 키는 단일 메시지를 암호화/복호화 할 목적으로만 사용한다. 메시지 암호화/복호화에 대칭암호 알고리즘을 사용 CAST-128 비트 키를 사용 IDEA는 128 비트 키를 사용 3DES는 168 비트 키를 사용 여기서는 CAST-128을 사용해서 설명
키 식별자 메시지 암호화에 사용한 세션 키는 암호화된 형태로 첨부하여 보낸다. 세션 키 자체는 수신자의 공개 키로 암호화한다. 수신자만이 세션 키를 복호화 할 수 있고 메시지도 복호화 할 수 있는 것이다. 사용자들은 여러 쌍의 공개 키/개인 키를 가지고 있으므로, 한 사용자의 공개 키에 범위 안에서는 유일하도록 식별자(identifier)를 붙여놓아 구별이 가능하도록 한다
키 고리 각 노드에서 한 쌍의 데이터구조를 제공해야한다. 개인 키 고리(private-key ring): 노드가 소유한 공개 키/개인 키 쌍들을 저장하기 위한 것 공개 키 고리(public-key ring) 이 노드가 알고 있는 다른 사용자들의 공개 키를 저장하기 위한 것
개인 키 고리에 속하는 항목 타임스탬프: 이 키 쌍이 생성된 날짜/시간 키 ID: 이 항목에 대한 공개 키를 식별하기 위한 64비트 값 공개 키: 키 쌍의 공개 키 부분 개인 키: 키 쌍의 개인 키 부분; 이 필드는 암호화된다. 사용자 ID: 보통 이것은 사용자의 전자메일 주소이다(예, gildogn@novel.co.kr). 그러나 사용자는 다른 이름을 키 쌍에 연결시키거나(예, Gildong, HGdong, HongGilDong 등) 동일한 사용자 ID를 한 번 이상 재사용하기 위해 이 필드를 이용할 수 있다.
일반적인 개인 키 고리 구조
일반적인 공개 키 고리 구조
패스문 기반 대칭키 개인 키 값을 더 안전하게 보관할 수있는 방법 필요하다 개인키 자체는 키 고리에 저장하지 않는 것이 바람직하다. 오히려 이 키는 CAST-128(혹은 IDEA나 3DES)로 암호화해서 저장하는 것이 더 안전하다. 사용자가 개인키를 회수하기위해 개인 키 고리를 복구할 때, 사용자는 패스문을 입력해야 한다
13.3 키 쌍의 작성 PGP를 사용해서 암호화나 디지털 서명을 하려면, 우선 자신의 키 쌍을 작성할 필요가 있다
GnuPG 1.4.6을 이용해서 키 쌍을 작성하고 있는 모습
공개 키의 예
PGP Desktop 9.5를 이용해서 키 쌍을 작성하고 있는 모습
PGP Desktop 9.5를 이용해서 키 쌍을 작성하고 있는 모습
PGP Desktop 9.5를 이용해서 키 쌍을 작성하고 있는 모습
PGP Desktop 9.5를 이용해서 키 쌍이 생성되는 도중
PGP Desktop 9.5를 이용해서 생성된 키
13.4 암호화와 복호화 하드웨어로 난수를 생성할 경우, 열이나 음의 변화 등의 예측이나 재현이 사실상 불가능한 자연 현상을 센서로 감지해서 그 결과를 기초로 난수열을 생성한다. 이런 하드웨어를 난수 생성기(random number generator; RNG)라 부른다.
13.4.1 암호화 메시지를 하이브리드 암호 시스템을 이용하여 암호화하고 송신 데이터(텍스트 데이터)로 변환한다
세션 키의 생성과 암호화 (1) 의사난수 생성기를 사용해서 세션 키를 생성한다. (2) 세션 키를 공개 키 암호로 암호화한다. 사용하는 키는 수신자의 공개 키이다.
메시지의 압축과 암호화 (3) 메시지를 압축한다. (4) 압축한 메시지를 대칭 암호로 암호화한다. 사용하는 키는 절차(1)의 세션 키이다. (5) 암호화한 세션 키(절차(2))와, 암호화한 메시지(절차(4))를 결합한다. (6) 절차(5)의 결과를 텍스트 데이터로 변환한다. 변환한 결과가 송신 데이터가 된다.
PGP에 의한 암호화
13.4.2 복호화 PGP에 의한 복호화의 모습
개인 키의 복호화 PGP의 개인 키는 이용자의 키 고리 안에 보존되어 있다. 키 고리의 도난에 대비해서 개인 키는 암호화된 상태로 보존된다. 보존에는 「패스 문을 기초로 한 암호화」(PBE)가 이용된다
개인 키를 암호화하는 절차 (1) 수신자는 복호화를 위한 패스 프레이즈를 입력한다. (2) 패스 프레이즈의 해시 값을 취해 개인 키를 복호화하기 위한 키를 생성한다. (3) 키 고리 안에 있는 암호화되어 있는 개인 키를 복호화한다.
세션 키의 복호화 (4) 수신 데이터(텍스트 데이터)를 이진 데이터로 변환한다. (5) 2진 데이터를, 암호화되어 있는 세션 키와 압축+암호화되어 있는 메시지로 분해한다. (6) 암호화되어 있는 세션 키를 공개 키 암호로 복호화한다. 이 때 절차(3)에서 생성한 수신자의 개인 키를 사용한다.
메시지의 복호화와 신장 (7) 절차(5)에서 얻은 압축+암호화되어 있는 메시지를 대칭 암호로 복호화한다. 이 때 절차(6)에서 생성한 세션 키를 사용한다. (8) 절차(7)에서 얻은 압축되어 있는 메시지를 푼다. (9) 이것으로 메시지를 얻을 수 있다.
PGP에 의한 복호화
암호화와 복호화
13.5 디지털 서명 작성과 검증 이번에는 디지털 서명 작성과 검증이다.
13.5.1 디지털 서명 작성 메시지와 그 메시지에 대한 서명을 결합해서 송신 데이터(텍스트 데이터)로 변환한다
개인 키의 복호화 (1) 송신자는 서명을 위한 패스 프레이즈를 입력한다. (2) 패스 프레이즈의 해시 값을 취해 개인 키를 복호화하기 위한 키를 생성한다. (3) 키 고리 안에 있는 암호화되어 있는 개인 키를 복호화한다.
디지털 서명의 작성 (4) 일방향 해시 함수를 사용해서 메시지의 해시 값을 계산한다. (5) 절차(4)에서 얻은 해시 값에 서명한다. 이것은 절차(3)에서 얻은 개인 키를 사용해서 암호화하는 것에 상당한다. (6) 절차(5)에서 작성한 디지털 서명과 메시지를 결합한다. (7) 절차(6)의 결과를 압축한다. (8) 절차(7)의 결과를 텍스트 데이터로 변환한다. (9) 절차(8)의 결과가 송신 데이터가 된다.
PGP에 의한 디지털 서명 작성
13.5.2 디지털 서명의 검증 PGP에 의한 디지털 서명에 대한 검증 절차
보내 온 해시 값의 복원 (1) 수신 데이터(텍스트 데이터)를 이진 데이터로 변환한다. (2) 압축되어 있는 데이터를 푼다. (3) 신장한 데이터를 서명되어 있는 해시 값과 메시지로 분해한다. (4) 서명되어 있는 해시 값(암호화되어 있는 해시 값)을 송신자의 공개 키를 사용해서 복호화하고, 보내 온 해시 값을 복원한다.
해시 값의 비교 (5) 절차(3)에서 분해한 메시지를 일방향 해시 함수에 부여하여 해시 값을 계산한다. (6) 절차(4)에서 얻은 해시 값과 절차(5)에서 얻은 해시 값을 비교한다. (7) 절차(6)의 결과가 같으면 디지털 서명의 검증에 성공한 것이 되고, 같지 않으면 검증에 실패한 것이 된다. 이것이 디지털 서명의 검증 결과이다. (8) 절차(3)에서 분해한 메시지가 송신자의 메시지이다.
PGP에 의한 디지털 서명 검증
디지털 서명의 작성과 검증
13.6 디지털 서명과 암호 마지막으로 암호와 디지털 서명을 조합해 보자. .
디지털 서명 작성과 암호화 메시지에 대한 디지털 서명 작성도 하고 메시지의 압축+암호화 두 가지 모두 수행한다. 이 두 가지를 결합하고, 송신 데이터(텍스트 데이터)로 변환한다. 송신 데이터를 텍스트 데이터로 할지 어떨지는 PGP를 사용할 때에 선택할 수 있다.
PGP에 의한 디지털 서명 작성과 암호화
암호화 암호화의 대상이 되는 것은 메시지뿐만 아니라, 디지털 서명과 메시지를 결합한 데이터이다.
13.6.1 복호화와 디지털 서명 검증 수신 데이터의 복호화+압축풀기와, 그 결과로 얻어진 메시지에 대한 디지털 서명 검증 두 가지를 수행한다. 최종적으로 얻어지는 것은 메시지와 디지털 서명 검증 결과이다.
PGP에 의한 복호화와 디지털 서명 검증
복호화 복호화에서 얻어지는 것은 메시지뿐만 아니라 디지털 서명과 메시지를 결합한 데이터이다.
디지털 서명의 검증 디지털 서명 작성과 암호화, 복호화와 디지털 서명 검증이라는 일련의 과정에서 해시 값, 세션 키, 메시지가 어떻게 변화해 가는가를 그림 13-12에 나타내었다.
13.7 신뢰 망 공개 키의 정당성을 확인하기 위해 PGP가 이용하는 「신뢰 망」이라는 방법에 대해서 설명한다.
13.7.1 공개 키의 정당성 입수한 공개 키가 정말로 자신이 생각하고 있는 인물의 것인지 어떤지(공개 키의 정당성)를 판단하는 것은 중요하다. 공개 키는 man-in-the-middle 공격에 의해 살짝 바꿔치기 되어 있을 가능성이 있기 때문이다. PGP에서는 인증기관을 사용하지 않는다. PGP에서는 신뢰 망(web of trust)이라는 방법을 이용한다 이것은 PGP 사용자가 서로의 공개 키에 대해 서로 디지털 서명을 하는 방법이다.
신뢰망 인증기관을 설치하지 않고 개인끼리 신뢰를 확립한다」라고 하는 것이 신뢰 망의 포인트이다. 바꿔 말하면 자신이 어느 키를 신용할지를 자신이 결정할 수 있다는 것이다.
PGP의 신뢰 망 구성 케이스1 : 자기 자신의 디지털 서명에 의해 확인한다. 케이스2 : 자신이 항상 신뢰하고 있는 사람의 디지털 서명에 의해 확인한다. 케이스3 : 자신이 부분적으로 신뢰하고 있는 사람들의 디지털 서명에 의해 확인한다.
케이스1 : 자기 자신의 디지털 서명에 의해 확인한다. (1) 밥의 디지털 서명을 검증하기 위해 PGP는 앨리스의 공개 키 고리로부터 밥의 공개 키를 찾는다. (2) 앨리스의 공개 키 고리에는 밥의 공개 키가 포함되어 있다. 이것은 지난 번 데이트 후, 앨리스가 밥에게서 받아서 자신의 공개 키 고리에 저장한 밥의 공개 키이다. (3) PGP는 밥의 공개 키에 앨리스의 디지털 서명이 붙어 있는 것을 발견한다. 이것은 지난 번 데이트 후 앨리스가 한 디지털 서명이다. (4) 앨리스의 디지털 서명을 검증하기 위해 PGP는 앨리스의 공개 키 고리로부터 앨리스 자신의 공개 키를 찾는다.
케이스1 : 자기 자신의 디지털 서명에 의해 확인한다. (5) 물론 앨리스의 공개 키 고리에는 앨리스의 공개 키가 포함되어 있다. 자기 자신의 공개 키이기 때문이다. (6) PGP는 앨리스의 공개 키를 사용해서 밥의 공개 키에 되어져 있는 앨리스의 디지털 서명을 검증한다. 검증에 성공하면 이것은 정당한 밥의 공개 키라고 확인할 수 있게 된다. (7) PGP는 정당한 밥의 공개 키를 사용해서 밥의 메일에 서명된 밥의 디지털 서명을 검증한다.
케이스2 : 자신이 항상 신뢰하고 있는 사람의 디지털 서명에 의해 확인한다. 앨리스는 트랜트를 매우 신뢰하고 있어서, 「트랜트는 암화와 디지털 서명을 잘 알고 있고, 누군가의 공개 키에 자신의 디지털 서명을 하는 것의 의미도 잘 이해하고 있다. 그가 디지털 서명을 한 공개 키는 반드시 정당한 것임에 틀림없다」라고까지 생각하고 있다. PGP를 사용하면 트랜트에 대한 앨리스의 신뢰도를 표현할 수 있다. 즉, 트랜트의 공개 키에 대해 「나는 트랜트의 디지털 서명을 항상 신뢰한다」라는 정보를 부가하고, 그 정보에 대해 앨리스가 디지털 서명을 붙이면 되는 것이다.
소유자 신뢰(owner trust) 값 PGP에서는 각 사용자가 공개 키의 소유자에 대한 소유자 신뢰(owner trust) 값을 설정할 수 있다
소유자 신뢰(owner trust) 값
케이스3 : 자신이 부분적으로 신뢰하고 있는 사람들의 디지털 서명에 의해 확인한다. 복수인의 소유자 신뢰의 합계로 공개 키의 정당성을 확인하는 방법
13.7.2 공개 키의 정당성과 소유자 신뢰 「공개 키는 정당한가」라는 문제와, 「소유자를 신뢰하는가」라고 하는 문제는 전혀 다르다는 것에 주의하기 바란다. 공개 키는 정당하지만, 소유자는 신뢰하지 않는다고 하는 것은 충분히 있을 수 있다.
13.7.3 소유자 신뢰 값 앨리스는 앨리스 자신의 공개 키에 디지털 서명하고 있다 (소유자 신뢰 값은 「완전히 신뢰한다」). 앨리스는 밥의 공개 키에 디지털 서명하고 있다 (소유자 신뢰 값은 「신뢰하지 않는다」). 앨리스는 트랜트의 공개 키에 디지털 서명하고 있다 (소유자 신뢰 값은 「항상 신뢰한다」). 앨리스는 딥의 공개 키에 디지털 서명하고 있다 (소유자 신뢰 값은 「부분적으로 신뢰한다」).
13.7.3 소유자 신뢰 값 앨리스는 프래드의 공개 키에 디지털 서명하고 있다 (소유자 신뢰 값은 「부분적으로 신뢰한다」). 트랜트는 캐롤의 공개 키에 디지털 서명하고 있다. 딥은 조지의 공개 키에 디지털 서명을 하고 있다. 프래드는 조지의 공개 키에 디지털 서명하고 있다. 프래드는 해럴드의 공개 키에 디지털 서명하고 있다. 밥은 잉게의 공개 키에 디지털 서명하고 있다.
앨리스의 「신뢰 망」