Ed25519 SSHキーのKDFラウンド番号を確認するには?

Ed25519 SSHキーのKDFラウンド番号を確認するには?

Ed25519は、次のコマンドを使用して、特定の数のKDFラウンドでSSHキーを生成できます。

ssh-keygen -t ed25519 -a 21(デフォルトは16)

ファイルの合計が与えられたら、id_ed25519このid_ed25519.pubラウンド番号を見つける方法は?

答え1

個人の私有地なので参考にしてくださいキーファイル、秘密鍵ではありません。パスワードフレーズからキー暗号化キーを派生させるために使用されます。パスワードベースの鍵導出機能)。パスワードを変更すると、ラウンド数を変更できますssh-keygen -p

このプロパティを見つける方法がないようですssh-keygenssh-keygen -l -vキーの属性と関連するメタデータのみが表示され、キー暗号化方法は表示されません。

秘密鍵ファイル形式は、部分的に次の文書で説明されています。PROTOCOL.key。私の答えはこれ、ソースコードの読み取り、実験的な観察に基づいています。

OpenSSH秘密鍵の主な形式-----BEGIN OPENSSH PRIVATE KEY-----は2行と-----END OPENSSH PRIVATE KEY-----PROTOCOL.keyBase64でエンコードされたバイナリデータの内容を説明します。バイナリデータは、次のタイプのフィールドシーケンスです。

  • 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-ctrbcryptが表示されます。その後には、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

関連情報