Keys
OpenSSH 如何使用 bcrypt 設置 IV?
我為測試目的生成了一個加密的 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