PGP가 사용하는 네 가지 키
PGP(Pretty Good Privacy)는 정보 보안을 위해 네 가지 유형의 키를 활용합니다. 바로 일회성 세션 대칭 키(Session Key), 공개 키(Public Key), 개인 키(Private Key), 그리고 패스프레이즈 기반 대칭 키입니다.
세션 키 생성
각 세션 키는 하나의 메시지에만 연결되며, 해당 메시지를 암호화하고 복호화하는 용도로만 사용됩니다. 메시지의 암호화·복호화는 대칭 암호화 알고리즘으로 수행된다는 점이 핵심입니다. 128비트 키가 필요하기 때문에, CAST-128 알고리즘을 이용해 무작위 128비트 숫자를 생성합니다.
난수 생성기의 입력값은 128비트 키(사용자의 키 입력을 기반으로 만들어진 난수)와, 암호화할 평문으로 취급되는 두 개의 64비트 블록으로 구성됩니다. CFB(Cipher Feedback) 모드를 통해 두 개의 64비트 암호문 블록을 생성한 뒤 이를 연결하여 128비트 세션 키를 만듭니다. 여기에 사용되는 알고리즘은 ANSI X12.17에 명시된 방식을 기반으로 합니다.
키 식별자(Key Identifier)
한 사용자가 여러 개의 공개 키/개인 키 쌍을 가질 수 있으며, 각 키 쌍에는 고유한 식별자(ID)가 필요합니다. 각 공개 키의 키 ID는 해당 공개 키의 하위 64비트로 정의됩니다. 즉, 공개 키 KUa의 키 ID는 (KUa mod 264)입니다. 이 정도의 길이면 키 ID가 중복될 확률이 매우 낮아 충분히 안전합니다.
키 ID는 PGP 디지털 서명에도 활용됩니다. 발신자는 여러 개인 키 중 하나를 선택해 메시지 다이제스트를 암호화할 수 있으므로, 수신자 입장에서는 어떤 키가 사용되었는지 반드시 알아야 하기 때문입니다.
키 링(Key Ring)
키 ID는 PGP 서비스에서 매우 중요한 역할을 합니다. 기밀성과 인증을 모두 지원하는 PGP 메시지에는 두 개의 키 ID가 포함되어 있다고 볼 수 있습니다.
키의 체계적인 저장과 관리
이러한 키들을 효율적으로 활용하려면 체계적인 저장과 관리가 필수적입니다. PGP는 각 노드에 두 가지 데이터 구조를 제공합니다. 하나는 해당 노드가 소유한 공개 키/개인 키 쌍을 저장하는 구조이고, 다른 하나는 이 노드가 아는 다른 사용자들의 공개 키를 저장하는 구조입니다.
키 링은 하나의 테이블처럼 생각할 수 있으며, 각 행은 해당 사용자가 소유한 공개 키/개인 키 쌍 하나를 나타냅니다. 각 행은 다음과 같은 요소로 구성됩니다.
타임스탬프(Timestamp) − 해당 키 쌍이 생성된 날짜와 시간입니다.
키 ID(Key ID) − 해당 항목의 공개 키 중 하위 64비트입니다.
공개 키(Public Key) − 키 쌍 중 공개 키에 해당하는 부분입니다.
개인 키(Private Key) − 키 쌍 중 개인 키에 해당하는 부분입니다.
사용자 ID(User ID) − 일반적으로 사용자의 이메일 주소를 의미합니다.
개인 키 링은 사용자 ID, 키 ID 또는 둘 다를 기준으로 색인(indexing)할 수 있습니다. 다만 보안상의 이유로 실제 키 값 자체는 키 링에 저장하지 않고, 패스프레이즈 검증 절차를 거쳐야만 복호화할 수 있는 암호화된 형태로 보관합니다.