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 |
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 |
ここにない 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) |
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 |
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 |
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 |
- 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 |
- 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 |
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 はパスフレーズからセッション鍵を生成するためのハッシュ化の手順である。
ID | S2K タイプ | 参考文献 | |
---|---|---|---|
0 | Simple S2K | ||
1 | Salted S2K | ||
2 | Reserved value | ||
3 | Iterated and Salted S2K | ||
4 | Argon2 | ✅ | RFC 9106 |
100-110 | Private/Experimental S2K |
ID は OpenPGP で定義されるもので “s2k 1” のように表記する。 Simple S2K (s2k 0) と Reserved value (s2k 2) は下位互換のために残されているもので,新たに暗号データや電子署名を作成する際に使用すべきではない。
OpenPGP では,パスフレーズ自体はいかなる形(ハッシュ値を含む)でも保存しない。 このため,パスフレーズを紛失してしまった場合は復元できない3。
データ圧縮(Compression Algorithms)
暗号化メッセージや電子署名を圧縮するためのアルゴリズムである。 RFC 9580 で新たに追加されたアルゴリズムはない。
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 を参照して実装すべきと書かれている。
ブックマーク
参考図書
- 暗号化 プライバシーを救った反乱者たち
- スティーブン・レビー (著), 斉藤 隆央 (翻訳)
- 紀伊國屋書店 2002-02-16
- 単行本
- 4314009071 (ASIN), 9784314009072 (EAN), 4314009071 (ISBN)
- 評価
20世紀末,暗号技術の世界で何があったのか。知りたかったらこちらを読むべし!
- PGP―暗号メールと電子署名
- シムソン ガーフィンケル (著), Garfinkel,Simson (原著), ユニテック (翻訳)
- オライリー・ジャパン 1996-04-01
- 単行本
- 4900900028 (ASIN), 9784900900028 (EAN), 4900900028 (ISBN)
- 評価
良書なのだが,残念ながら内容が古すぎた。 PGP の歴史資料として読むならいいかもしれない。
- 暗号技術入門 第3版 秘密の国のアリス
- 結城 浩 (著)
- SBクリエイティブ 2015-08-25 (Release 2015-09-17)
- Kindle版
- B015643CPE (ASIN)
- 評価
SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。
-
厳密には CFB モードの変形である。 ↩︎
-
pub 20 が禁止になった経緯については “GnuPG’s ElGamal signing keys compromised” を参照のこと。 ↩︎
-
ただし OpenPGP では試行回数によるロックアウトは定義されないため,無限にパスフレーズ解読を試みることができる。 ↩︎