Pgp
libsodium v s gnupg curve25519 兼容性
我正在嘗試基於密碼鋼創建確定性 GPG 密鑰。我已經實現了一個用於(反)序列化 PGP 數據包的庫,現在我正在嘗試使用 libsodium 中生成的密鑰來導入 GPG。
Libsodium 給了我一個 32 字節的公鑰和一個 32 字節的密鑰。這也是 PGP 似乎使用的 - 除了 PGP 為公鑰添加前綴 0x40 以表明它沒有使用點壓縮(因此變為 33 個字節)。
ed25519 密鑰工作正常,但curve25519 密鑰不起作用,當嘗試導入生成的密鑰時,GPG 要求輸入密碼 - 儘管沒有指定 KDF。libsodium 生成的點似乎與 GPG 不兼容。
一些我不明白的隨機事情,可能與此有關: - GPG 點是 32 字節,但它們是未壓縮的。那麼它們不應該是 32 + 32 字節嗎?從我能讀到的所有內容看來,X 和 Y 都應該是 32 個字節。- Libsodium 可能正在使用壓縮點,但它們的點不是以 02 或 03 開頭 - 我讀到的這些點用於指示哪個 Y 被用作鍵。它們也是 32 個字節,如果您考慮一個額外的字節來指示壓縮,這也太小了。
有誰知道這些曲線之間到底有什麼不同以及我可以做些什麼來修復它?
找到了解決方案。所需要的只是反轉curve25519秘密點中的字節。顯然 PGP 為此使用小端,而 ed25519 使用大端。