OpenPGP で利用可能なアルゴリズム(RFC 9580 対応版)

OpenPGP の標準化について2024年7月に RFC 9580 が発行された。 この記事では拙作 gpgpdump の改定作業の目的のため OpenPGP で利用可能なアルゴリズムを列挙していく。

なお RFC 9580 の発行に伴い,以前の RFC 4880, RFC 5581, RFC 6637 は obsolete になった。 このブログでも前の「OpenPGP で利用可能なアルゴリズム(RFC 4880bis 対応版)」は obsolete とする。 また各アルゴリズムの横に が付いているものは RFC 9580 で新たに追加されたものである。

パケットバージョン

アルゴリズムとは直接関係ないが OpenPGP では暗号文や鍵や署名といったデータのかたまりを「パケット」と呼んでいる。 パケットは PGP/OpenPGP によって幾つかのバージョンがある。

現在有効なパケットバージョンの組み合わせは以下の通り。

Version of
Encrypted Data
Payload
Version of
Preceding
Symmetric Key ESK
(If Any)
Version of
Preceding Public
Key ESK (If Any)
Generate?
SED - v2 PKESK (RFC 2440) No
SED v4 SKESK v3 PKESK No
v1 SEIPD v4 SKESK v3 PKESK Yes
v2 SEIPD v4 SKESK v3 PKESK Yes
OpenPGP 暗号化メッセージのバージョン

v2 SEIPD は RFC 9580 で加わったもので認証付き暗号(AEAD)をサポートしている。

RFC 9580 では “Generate?” が Yes のパケット組み合わせのみ生成が許容される(MUST)。 それ以外は後方互換性のために残される。

Signing Key
Version
Signature Packet
Version
One-Pass Signature
Packet Version
Generate?
v3 v3 v3 No
v4 v3 v3 No
v4 v4 v3 Yes
v6 v6 v6 Yes
OpenPGP 鍵および署名のバージョン

ここにない v1 や v2 は最初期の PGP (RFC 1991) の頃のもの。 さらに,ここにない v5 は RFC 4880bis の議論の頃にあったもので RFC 9580 ではなくなってしまったようだ。 おそらく GnuPG には残ってると思うけど… 困ったね(笑)

v3 は RFC 2440 で, v4 は RFC 4880 で登場したもの。 さらに v6 は RFC 9580 で新たに加わったものである。

RFC 9580 では “Generate?” が Yes のパケット組み合わせのみ生成が許容される(MUST)。 それ以外は後方互換性のために残される。

共通鍵暗号アルゴリズム(Symmetric-Key Algorithms)

OpenPGP で利用可能な共通鍵暗号は以下の通り。 RFC 9580 で新たに追加されたアルゴリズムはない。 なお「鍵長」項目の括弧内はブロック長を指す。 いずれも単位は “bit” である。

IDアルゴリズム鍵長参考文献
0 Plaintext or unencrypted data
1 IDEA 128 (64) Narrow-Bicliques: Cryptanalysis of Full IDEA
2 TripleDES (or DES-EDE) with 168-bit key derived from 192 168 (64) SP800-67 Rev.2
3 CAST5 with 128-bit key 128 (64) RFC2144
4 Blowfish with 128-bit key, 16 rounds 128 (64) Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)
5,6 (Reserved)
7 AES with 128-bit key 128 (128) FIPS PUB 197
8 AES with 192-bit key 192 (128)
9 AES with 256-bit key 256 (128)
10 Twofish with 256-bit key 256 (128)
11 Camellia with 128-bit key 128 (128) RFC3713
12 Camellia with 192-bit key 192 (128)
13 Camellia with 256-bit key 256 (128)
100-110 Private/Experimental algorithm
253-255 (Reserved to avoid collision with Secret Key Encryption)
OpenPGP で使用可能な共通鍵暗号アルゴリズム一覧

ID は OpenPGP で定義されるもので “sym 1” のように表記する。

  • AES-128 (sym 7) が “MUST implement” で AES-256 (sym 9) が “SHOULD implement” となった
  • 後方互換性のために IDEA, TripleDES, CAST5 による復号を行ってもよい(MAY)が機密性の漏洩が疑われる非推奨のアルゴリズムであることを警告すべき(SHOULD)

ちなみに sym 11 から sym 13 の Camellia 暗号は日本製である。

RFC 9580 では共通鍵暗号を使った暗号化について,従来からある CFB モード1 に加えて認証付き暗号の暗号モードを使用できる。

認証付き暗号の暗号モード(AEAD Algorithms)

RFC 9580 で追加された認証付き暗号(Authenticated Encryption with Associated Data; AEAD)について利用可能な暗号モードは以下の通り。

ID暗号モード参考文献
1 EAX EAX: A Conventional Authenticated-Encryption Mode
2 OCB RFC 7253
3 GCM SP800-38D
100-110 Private/Experimental algorithm
OpenPGP で使用可能な認証付き暗号アルゴリズム一覧

RFC 9580 では OCB が “MUST implement” となる。

公開鍵暗号・署名アルゴリズム(Public-Key Algorithms)

OpenPGP で利用可能な公開鍵暗号・署名は以下の通り。

IDアルゴリズム参考文献
1 RSA (Encrypt or Sign) FIPS PUB 186-5
2 RSA Encrypt-Only
3 RSA Sign-Only
4-15 (Reserved)
16 Elgamal
(Encrypt-Only)
A public key cryptosystem and a signature scheme based on discrete logarithms
17 DSA FIPS PUB 186-4
18 ECDH public key algorithm SP800-56A Revision 3
19 ECDSA public key algorithm RFC 6090, FIPS PUB 186-5, SEC 1: Elliptic Curve Cryptography
20 (Reserved; formerly Elgamal Encrypt or Sign)
21 (Reserved for Diffie-Hellman (X9.42, as defined for IETF-S/MIME))
22 EdDSALegacy (deprecated) (Ed25519 を参照のこと)
23 (Reserved for AEDH)
24 (Reserved for AEDSA)
25 X25519 RFC 7748, FIPS PUB 186-5
26 X448
27 Ed25519 RFC 8032, FIPS PUB 186-5
28 Ed448
100-110 Private/Experimental algorithm
OpenPGP で使用可能な公開鍵暗号・署名アルゴリズム一覧

ID は OpenPGP で定義されるもので “pub 1” のように表記する。

  • RSA (pub 1,2,3), Elgamal (16), DSA (17) は非推奨 (deprecated) となった。更に暗号化専用および署名専用の RSA (pub 2,3) と Elgamal (16), DSA (17) の鍵は新たな生成が禁止になった(MUST NOT)。ただし RFC 4880 では Elgamal (16) と DSA (17) の実装が MUST なので,後方互換性を確保するのであれば,これらを実装する必要がある
  • X25519 (pub 25) および Ed25519 (pub 27) の実装が MUST になった
  • X448 (pub 26) および Ed448 (pub 28) の実装が MUST になった
  • EdDSALegacy (pub 22) は RFC 4880bis の頃に定義されたが,最終的に Ed25519 (pub 27) に置き換えられた。おそらく v4 鍵および署名パケットに対応するために残されているが非推奨(deprecated)になっている。新たに EdDSA 鍵を生成するなら Ed25519 (pub 27) または Ed448 (pub 28) を選択すべき
  • ElGamal Encrypt or Sign (pub 20) は,元々暗号化と署名の両方できるものだったが,脆弱性が見つかったため OpenPGP では使用禁止になった2

余談だが,現在対量子コンピュータ暗号を OpenPGP に組み込む議論が行われている。 興味がある方はそちらもどうぞ。

楕円曲線(ECC Curves for OpenPGP)

前節で挙げた楕円曲線暗号(Elliptic Curve Cryptography; ECC)アルゴリズムに対して RFC 9580 で利用可能な楕円曲線(Elliptic Curve)は以下の通り。 なお「鍵長」の単位はオクテット(byte)である。

楕円曲線名適用アルゴリズム鍵長
NIST P-256 ECDSA, ECDH 32 SP800-56A Revision 3, FIPS PUB 186-5
NIST P-384 ECDSA, ECDH 48
NIST P-521 ECDSA, ECDH 66
brainpoolP256r1 ECDSA, ECDH 32 RFC 5639
brainpoolP384r1 ECDSA, ECDH 48
brainpoolP512r1 ECDSA, ECDH 64
Ed25519Legacy EdDSALegacy (EdDSA) 32 RFC8032, FIPS PUB 186-5
Ed25519 Ed25519 (EdDSA) 32
Ed448 Ed448 (EdDSA) 57
Curve25519Legacy ECDH 32 RFC7748
X25519 X25519 (ECDH) 32
X448 X448 (ECDH) 56
OpenPGP で使用可能な楕円曲線一覧
  • Ed25519Legacy と Ed25519 は同じ楕円曲線で Ed448 と併せて RFC 8032 EdDSA アルゴリズムで用いる(ECDSA では使えない)
  • Curve25519Legacy と X25519 は同じ楕円曲線で X448 と併せて RFC 7748 で規定されている。これらの楕円曲線を使った ECDH 鍵は同じサイズの EdDSA 鍵と組み合わせて使う
  • Ed25519, Ed448, X25519, X448 以外の楕円曲線は Curve OID で管理される。 Ed25519, Ed448, X25519, X448 については同名のアルゴリズム ID と紐付いているため Curve OID による管理外となる
  • Ed25519Legacy は同名のアルゴリズム ID で用いる。また v4 鍵および署名パケットでのみ使用可能。 v6 パケットの場合は Ed25519 を用いる
  • Curve25519Legacy は ECDH アルゴリズムかつ v4 鍵および署名パケットでのみ使用可能。 v6 パケットの場合は X25519 を用いる

具体的な実装例については「そろそろ GnuPG でも ECC を標準で使うのがいいんじゃないかな」で紹介している

ECDH 鍵導出のパラメータ(ECDH Parameters)

ECDH (pub 18) では鍵導出のためのハッシュアルゴリズムと鍵カプセル化のための共通鍵暗号アルゴリズムをパラメータとして持つ。 各アルゴリズムの組み合わせは以下の通り。

Curve Hash Algorithm symmetric Algorithm
NIST P-256 SHA2-256 AES-128
NIST P-384 SHA2-384 AES-192
NIST P-521 SHA2-512 AES-256
brainpoolP256r1 SHA2-256 AES-128
brainpoolP384r1 SHA2-384 AES-192
brainpoolP512r1 SHA2-512 AES-256
Curve25519Legacy SHA2-256 AES-128
ECDH KDF/KEK パラメータ
  • v6 鍵パケットの場合,上のアルゴリズムの組み合わせを使用しなければならない(MUST)
  • v4 鍵パケットの場合,上のアルゴリズムの組み合わせを使用すべき(SHOULD)

一方向ハッシュ関数アルゴリズム(Hash Algorithms)

OpenPGP で利用可能なハッシュ関数は以下の通り。 RFC 9580 で新たに追加されたアルゴリズムはない。

IDアルゴリズム参考文献
1 MD5 RFC1321
2 SHA-1 FIPS PUB 180-4
3 RIPE-MD/160 The hash function RIPEMD-160
4-7 (Reserved)
8 SHA2-256 FIPS PUB 180-4
9 SHA2-384
10 SHA2-512
11 SHA2-224
12 SHA3-256 FIPS PUB 202
13 (Reserved)
14 SHA3-512
100-110 Private/Experimental algorithm
OpenPGP で使用可能な一方向ハッシュ関数一覧

ID は OpenPGP で定義されるもので “hash 1” のように表記する。

  • SHA2-256 (hash 8) が “MUST implement” となった。また SHA2-384 (hash 9), SHA2-512 (hash 10) の実装が推奨される(SHOULD)
  • v4 鍵および署名パケットのの鍵指紋や MDC (Modification Detection Code) を除き SHA-1 (hash 2) を必要とするメッセージを作成してはならない(SHOULD NOT)
  • MD5 (hash 1), SHA-1 (hash 2), RIPE-MD/160 (hash 3) を用いて署名を作成してはならない(MUST NOT)
  • ECDH KDF および S2K KDF のハッシュ関数として MD5 (hash 1), SHA-1 (hash 2), RIPE-MD/160 (hash 3) を用いてパケットを生成してはならない(MUST NOT)
  • v6 以降のパケットで S2K KDF のハッシュ関数として MD5 (hash 1), SHA-1 (hash 2), RIPE-MD/160 (hash 3) を用いて秘密鍵を復号してはならない(MUST NOT)
  • MD5 (hash 1), SHA-1 (hash 2), RIPE-MD/160 (hash 3) に依存する最近の署名を検証してはならない(MUST NOT)
  • MD5 (hash 1), SHA-1 (hash 2), RIPE-MD/160 (hash 3) に依存する古い署名を検証してはならない(SHOULD NOT)
    • 署名の作成日が使用されたアルゴリズムの既知の脆弱性が発見された日より前で,メッセージが常に安全な管理下にあったと確信できる場合は除く

鍵指紋作成で使われるハッシュ関数アルゴリズム(Fingerprints)

鍵指紋作成で使われるハッシュ関数アルゴリズムは以下の通り。

Key Version Fingerprint Algorithm
v3 MD5
v4 SHA1
v6 SHA256
鍵指紋作成で使われるハッシュ関数アルゴリズム

その他のアルゴリズム

S2K (String-to-Key)

S2K はパスフレーズからセッション鍵を生成するためのハッシュ化の手順である。

IDS2K タイプ参考文献
0 Simple S2K
1 Salted S2K
2 Reserved value
3 Iterated and Salted S2K
4 Argon2 RFC 9106
100-110 Private/Experimental S2K
OpenPGP で使用可能な S2K アルゴリズム一覧

ID は OpenPGP で定義されるもので “s2k 1” のように表記する。 Simple S2K (s2k 0) と Reserved value (s2k 2) は下位互換のために残されているもので,新たに暗号データや電子署名を作成する際に使用すべきではない。

OpenPGP では,パスフレーズ自体はいかなる形(ハッシュ値を含む)でも保存しない。 このため,パスフレーズを紛失してしまった場合は復元できない3

データ圧縮(Compression Algorithms)

暗号化メッセージや電子署名を圧縮するためのアルゴリズムである。 RFC 9580 で新たに追加されたアルゴリズムはない。

IDアルゴリズム参考文献
0 Uncompressed  
1 ZIP RFC1951
2 ZLIB RFC1950
3 BZip2 bzip2
100-110 Private/Experimental algorithm
OpenPGP で使用可能なデータ圧縮アルゴリズム一覧

ID は OpenPGP で定義されるもので “comp 1” のように表記する。

  • 非圧縮(comp 0)は “MUST implement” である
  • ZLIB (comp 2) は “SHOULD implement” となっていて, ZIP (comp 1) については “SHOULD be able to decompress using” と復号時の後方互換性のみ確保されていればいいようだ

乱数生成器(Random Number Generator)

基本的に getrandom() システムコールのような OS が標準で提供している暗号学的に安全な疑似乱数生成器(CSPRNG)を使うべき,とある。 もしそれらが使えない(信用できない)場合でも,新しいものを自作するのではなく RFC 4086 を参照して実装すべきと書かれている。

ブックマーク

参考図書

photo
暗号化 プライバシーを救った反乱者たち
スティーブン・レビー (著), 斉藤 隆央 (翻訳)
紀伊國屋書店 2002-02-16
単行本
4314009071 (ASIN), 9784314009072 (EAN), 4314009071 (ISBN)
評価     

20世紀末,暗号技術の世界で何があったのか。知りたかったらこちらを読むべし!

reviewed by Spiegel on 2015-03-09 (powered by PA-APIv5)

photo
PGP―暗号メールと電子署名
シムソン ガーフィンケル (著), Garfinkel,Simson (原著), ユニテック (翻訳)
オライリー・ジャパン 1996-04-01
単行本
4900900028 (ASIN), 9784900900028 (EAN), 4900900028 (ISBN)
評価     

良書なのだが,残念ながら内容が古すぎた。 PGP の歴史資料として読むならいいかもしれない。

reviewed by Spiegel on 2014-10-16 (powered by PA-APIv5)

photo
暗号技術入門 第3版 秘密の国のアリス
結城 浩 (著)
SBクリエイティブ 2015-08-25 (Release 2015-09-17)
Kindle版
B015643CPE (ASIN)
評価     

SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。

reviewed by Spiegel on 2015-09-20 (powered by PA-APIv5)


  1. 厳密には CFB モードの変形である。 ↩︎

  2. pub 20 が禁止になった経緯については “GnuPG’s ElGamal signing keys compromised” を参照のこと。 ↩︎

  3. ただし OpenPGP では試行回数によるロックアウトは定義されないため,無限にパスフレーズ解読を試みることができる。 ↩︎