Ed25519は、次のコマンドを使用して、特定の数のKDFラウンドでSSHキーを生成できます。
ssh-keygen -t ed25519 -a 21
(デフォルトは16)
ファイルの合計が与えられたら、id_ed25519
このid_ed25519.pub
ラウンド番号を見つける方法は?
答え1
個人の私有地なので参考にしてくださいキーファイル、秘密鍵ではありません。パスワードフレーズからキー暗号化キーを派生させるために使用されます。パスワードベースの鍵導出機能)。パスワードを変更すると、ラウンド数を変更できますssh-keygen -p
。
このプロパティを見つける方法がないようですssh-keygen
。ssh-keygen -l -v
キーの属性と関連するメタデータのみが表示され、キー暗号化方法は表示されません。
秘密鍵ファイル形式は、部分的に次の文書で説明されています。PROTOCOL.key
。私の答えはこれ、ソースコードの読み取り、実験的な観察に基づいています。
OpenSSH秘密鍵の主な形式-----BEGIN OPENSSH PRIVATE KEY-----
は2行と-----END OPENSSH PRIVATE KEY-----
。PROTOCOL.key
Base64でエンコードされたバイナリデータの内容を説明します。バイナリデータは、次のタイプのフィールドシーケンスです。
byte[]
:長さが事前に知られているバイト文字列です。string
:文字列の前の長さが4バイトのビッグエンディアン数でエンコードされたバイト文字列です。uint32
またはint
:4バイト数でエンコードされたビッグエンディアン数。
バイナリデータには、次のフィールドが含まれます。
- ヌルバイト
openssh-key-v1␀
を含むリテラル文字列()␀
byte[]
- パスワード名(例
aes256-ctr
:)(string
) - PBKDF名(OpenSSH 8.1以降:
bcrypt
またはnone
)(string
) - PBKDFオプション(
string
) - (残りの部分は気にしません)
PBKDF オプション自体は一連のフィールドで構成されます。の場合はbcrypt
次のようになります。
- 塩(
string
) - ラウンド数(
uint32
)
秘密鍵ファイルを視覚的に調べてKDF情報を見つける方法は次のとおりです。
$ <id_ed25519 grep -v '^-' | base64 -d | xxd -g1
00000000: 6f 70 65 6e 73 73 68 2d 6b 65 79 2d 76 31 00 00 openssh-key-v1..
00000010: 00 00 0a 61 65 73 32 35 36 2d 63 74 72 00 00 00 ...aes256-ctr...
00000020: 06 62 63 72 79 70 74 00 00 00 18 00 00 00 10 fe .bcrypt.........
00000030: 57 c1 fe c6 47 cf 63 34 ef 83 35 61 aa f6 31 00 W...G.c4..5a..1.
00000040: 00 00 15 00 00 00 01 00 00 00 33 00 00 00 0b 73 ..........3....s
00000050: 73 68 2d 65 64 32 35 35 31 39 00 00 00 20 7b c8 sh-ed25519... {.
…
最初から人が読むことができる3つの文字列(openssh-key-v1
、、、、aes256-ctr
)bcrypt
が表示されます。その後には、24バイトのPBKDFオプションを含む複合文字列があります00 00 00 18
。
- 塩の長さ(
00 00 00 10
)。 - ソルト(ソルト長で表される16バイト)。
- ラウンド数(
00 00 00 15
) — つまり、0x15 = 21 です。
直接スクリプトを作成するのではなく、プログラムでそれを抽出するPythonライブラリがあります。openssh-key-parser
。
$ pip install -U openssh-key-parser
…
$ python3 -m openssh_key id_ed25519 | jq '.header.kdf'
Key passphrase:
"bcrypt"
$ python3 -m openssh_key id_ed25519 | jq '.kdf_options.data.rounds'
Key passphrase:
21