Keys

OpenSSH 如何使用 bcrypt 設置 IV?

  • April 21, 2018

我為測試目的生成了一個加密的 OpenSSH 私鑰:

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABCX18gzzE
urqzviTpYwDuLjAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIL3fL8j3ilzDkr/O
7rBBCIYaH/pE1VvU3r2IEy7M2vBaAAAAoAHqj8gYr4dNtxmQyoC+md10ZwY+GOuWIYmOxl
vDYQkGZWYAU4zeiu+GnWhJr935cR1IrJUdsPWkjtdYRh4HksY5DjFngSHxEYr5/HyfJN52
tCN4zoxVe9bHyWVAs/XdnfHAMSUL7f+tXXhSIOitwggn1/bUDqX3bYMk8qtEYbDweE0lS4
Q5TcIJEn3A255WyCJ+WKXTglTaKpDNXCucV9E=
-----END OPENSSH PRIVATE KEY-----

(密鑰類型為 ed25519;密碼為“密鑰”)

PROTOCOL.key描述了密鑰的格式。在對其進行解碼時,他們使用了 160 輪的 bcrypt。

引用PROTOCOL.key

KDF 用於從密碼片語派生密鑰 IV(和密碼所需的其他值)。然後使用這些值來加密未加密的私鑰列表。

這有點模糊。IV / 密鑰是如何生成的?他們是一樣的嗎?

如果我正確閱讀程式碼,它確實使用密鑰作為 IV,以下是相關功能:

sshkey.c 中的 sshkey_parse_private2 是執行 KDF 並解密私鑰 blob 的函式。KDF取sshkey_parse_private2內呼叫的第一個解密函式是cipher_init,如下:

r = cipher_init(&ciphercontext, cipher, key, keylen, key + keylen, ivlen, 0)) != 0)

cipher.c 中該函式的格式:

cipher_init(struct sshcipher_ctx **ccp, const struct sshcipher *cipher, const u_char *key, u_int keylen, const u_char *iv, u_int ivlen, int do_encrypt)

這意味著傳遞給 cipher_init 的 IV 只是 key + keylen

此外,bcrypt 的輪數是 16

引用自:https://crypto.stackexchange.com/questions/58536