Aes
使用 AES-GCM 加密的 TLS 1.3 應用程序數據如何“通過網路”發送?
出於教育原因,我一直在嘗試手動解密一些 TLS 1.3 流量,但偶然發現了一個障礙。到目前為止,我已經能夠完成大部分密鑰計劃,包括從 ECDHE 密鑰中獲取正確的握手流量秘密。但是,我無法找到有關密文和身份驗證標記如何在應用程序數據消息中格式化的太多資訊。
這是完整的記錄。
1703030017bf687d10e2f209661418d92aaf3626dfe5670f3127d6ed
這是伺服器握手流量的秘密:
475a0f3b5a86d4797e24545c2eb6388de9507e5e0bc367c74c3e78e0d8033f34b721a2e3a1d89ec5990287954402fc43
Wireshark 告訴我,解密此消息會產生明文
08 00 00 02 00 00
,對應於 Encrypted Extensions 消息。據我所知,“關聯數據”應該是字節
17 03 03 00 17
,其餘記錄是密文+身份驗證標籤。RFC 8446 說 TLS_AES_256_GCM_SHA384 密碼套件在 RFC 5116 中定義,但 RFC 5116 說:本文件沒有為 AEAD 輸入和輸出指定任何特定的編碼,因為編碼不會影響 AEAD 算法提供的安全服務。
然而,我所有解密數據的嘗試都未能通過身份驗證,這導致我有兩種可能性:
- **我派生的交通密鑰是錯誤的。**我知道我的 HKDF-Expand-Label 常式可以正常工作,因為所有其他機密都是正確派生的,並且與 OpenSSL 記錄的值相匹配。但是,誠然,我不能 100% 確定正確的密鑰和 IV 長度是多少。目前我使用的是 32 字節的密鑰和 12 字節的 IV。我不知道這是否是 TLS 1.3 使用的。
- **我讀錯了身份驗證標籤/密文。**我無法找到任何關於正確格式的參考資料,所以我在這方面的所有嘗試都只是猜測。特別是,我不確定這個密碼套件的身份驗證標籤有多長,儘管Google搜尋表明它是 12 個字節。
我究竟做錯了什麼?
事實證明我犯的不是一個而是兩個錯誤!
- 我沒有閱讀 RFC 中解釋每條記錄的隨機數是通過對 IV 進行異或序列號來計算的部分。
- 我使用了不正確的標籤長度 12 而不是 16。