PGPメッセージ交換形式

PGPメッセージ交換形式

[1] メッセージ本文を署名あるいは暗号化する形式です。 ASCII Armor と呼ばれる形式で本文を包み込みます。

RFC 1991 <urn:ietf:rfc:1991> (PGP 2.x) で定義されています。 RFC 2440 <urn:ietf:rfc:2440> (OpenPGP) がその改訂版を 定義しています。

現在ではメッセージへの埋め込み方(謎)としては、 PGP/MIME を使うのが適切でしょう。

仕様書

radix-64

[4] PGP のデータは binary であるので、 7bit の SMTP 配送路 ・RFC 822 メッセージでは直接おくれません。 ですから、 radix-64 という形式で ASCII 文字の列に変換します。 radix-64 は、 MIME では Base64 と呼ばれています。

ASCII Armor

[6] ASCII Armor は、次のものから構成されます。

以下、 BNF は適当にでっちあげたものです。 RFC 1991 は言葉による定義のみです。

  1. ascii-armor = headerline header data checksum tail

頭行 Armor Headerline

  1. headerline = "-----" data-type "-----" CRLF

data-type は次のものです。

'BEGIN PGP MESSAGE' 署名・暗号化・圧縮ファイル [RFC1991] [RFC2440]

'BEGIN PGP PRIVATE MESSAGE' 秘密鍵 [RFC2440]

'BEGIN PGP PUBLIC KEY BLOCK' 公開鍵 [RFC1991] [RFC2440]

'BEGIN PGP MESSAGE, PART X/Y' 多部分メッセージ。Y 個のファイルに分割されてる armor の X 個目のファイル。 [RFC1991]

'BEGIN PGP MESSAGE, PART X' 多部分メッセージ。 X 番目。 MESSAGE-ID Armor 頭 (2440 ママ。 MessageID が正しい?) が必須。 [RFC2440]

'BEGIN PGP SIGNATURE' detached 署名, OpenPGP/MIME 署名, クリア署名に使う。 PGP 2.X では、 detached 署名には 'BEGIN PGP MESSAGE' を使ってた。 [RFC2440]

  1. header = *header-field
  2. header-field = key ":" value CRLF
  3. key = <RFC 822 field-name>
  4. value = <RFC 822 field-body>

頭は、利用者又は PGP プログラムが使う情報の領域です。 データの一部ではありません。重要な情報を入れる場所ではありません。

RFC 822 頭と同様と定義されています。未知の頭領域は 無視するべきものです。

RFC 2440 は RFC 822 の話はしてません。

  1. header-field = key ":" SP value CRLF

Charset charset。既定値 UTF-8。実装は無視しても良い。 [RFC2440]

Comment は利用者定義の注釈 [RFC1991] [RFC2440]

Hash クリア署名に使われているハッシュ関数の読点区切り一覧 [RFC2440]

MessageID 印字可能文字32文字の列。 PART X Armor 頭を 使う多部分メッセージの各部分で共通の文字列。 受信者側が識別できるのに十分なくらい固有なもの。 checksum とか暗号化ハッシュ関数を使えばいいらしい。 多部分なとき以外は使うべきじゃない [RFC2440]

Version は符号化に使った [Open]PGP の版 [RFC1991] [RFC2440]

Armor checksum

24ビット CRC を radix-64 で ASCII 文字化したものです。

尻尾 Armor Tail

頭行の BEGIN を END に替えたものです。

クリア署名 [RFC2440]

  1. cleartext-signed = cleartext-header armor-header CRLF data cleartext-armor
  2. cleartext-header = '-----BEGIN PGP SIGNED MESSAGE-----' CRLF
  3. armor-header = <One or more "Hash" Armor Headers> ;; RFC 2440 ママ
  4. data = *OCTET ;; dash-escaped signed data
  5. cleartext-armor = <ascii-armor started with 'BEGIN PGP SIGNATURE'>

Armor 頭で Hash が指定されていれば、それは署名に使った 要約算法です。 PGP 2.x との互換性のために省略しても構いません。 既定値は MD5 です。

複数の要約算法を使っている時は、読点区切り一覧にします。

dash-escaped クリア文

行頭に "-" がある場合に、 "- -" に置き換えたものです。

メッセージ要約はもとのものに対して計算するもので、 dash-escaped 形式に対して計算するものではありません。

署名時には改行正規形 CRLF を使います。行末の TAB は クリア署名の計算時には無視します。 '-----BEGIN PGP SIGNATURE-----' の前の CRLF はデータに含みません。

ハッシュ関数

RFC 2440 9.4 節曰く:

IDAlgorithmText Name
1MD5MD5
2SHA-1SHA1
3RIPE-MD/160RIPEMD160
4Reserved for double-width SHA (experimental)
5MD2MD2
6Reserved for TIGER/192TIGER192
7Reserved for HAVAL (5 pass160-bit)HAVAL-5-160
100 to 110Private/Experimental algorithm.

Implementations MUST implement SHA-1. Implementations SHOULD implement MD5.

参考