我有一個 PHP 庫,它是 Openssl 的包裝器,其目標是讓新開發人員默認情況下更簡單、更安全地加密和解密數據。該庫成功處理許多不同的密碼和模式,但我無法讓 OCB 模式正常工作。我似乎能夠毫無問題地加密數據,但當我嘗試解密時,它openssl_decrypt()會返回false。當我檢查openssl_error_string()任何錯誤消息時,沒有任何錯誤消息。AES-128-CBC下面是一個 MVCE,演示了使用和執行相同的代碼AES-128-OCB。該AES-128-CBC示例按預期工作。沒有AES-128-OCB任何跡象表明失敗的原因。(我在示例中特意使用了 16 個字符的純文本字符串,以從方程中刪除空填充)。$ciphers = [ 'AES-128-CBC', 'AES-128-OCB'];$key = 'secretkey';$plainText = 'Testing testing!';foreach ($ciphers as $cipher) { printf('Cipher: %s%s', $cipher, PHP_EOL); $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher)); printf('IV: %s%s', $iv, PHP_EOL); printf('Text: %s%s', $plainText, PHP_EOL); $encryptedText = openssl_encrypt($plainText, $cipher, $key, OPENSSL_RAW_DATA, $iv); printf('Encrypted Text: %s%s', $encryptedText, PHP_EOL); $encodedText = base64_encode($encryptedText); printf('Encoded Text: %s%s', $encodedText, PHP_EOL); $decodedText = base64_decode($encodedText); printf('Decoded Text: %s%s', $decodedText, PHP_EOL); $decryptedText = openssl_decrypt($decodedText, $cipher, $key, OPENSSL_RAW_DATA, $iv); printf('Decrypted Text: '); var_dump($decryptedText); while ($msg = openssl_error_string()) { printf('Openssl Error: %s%s', $msg, PHP_EOL); } printf('%s%s', str_repeat('-', 60), PHP_EOL);}輸出:Cipher: AES-128-CBCIV: ?K?K?l4.?4;yText: Testing testing!Encrypted Text: vg??~6?D??R?????xd?^?,?[??p"~Encoded Text: dgUIZ5itfjazRLTiUvzIxsjNeGScXqksjFsaq7pwIn4=Decoded Text: vg??~6?D??R?????xd?^?,?[??p"~Decrypted Text: string(16) "Testing testing!"------------------------------------------------------------Cipher: AES-128-OCBIV: ??)?????XText: Testing testing!Encrypted Text: m??i??B[?d?Encoded Text: BW2IkWmo5kJbFgYf8YdkpQ==Decoded Text: m??i??B[?d?Decrypted Text: bool(false)------------------------------------------------------------我不是加密方面的專家,但在從事這項工作時學到了很多知識。我在 google 上搜索了 OCB 模式,并讓它與 PHP 和 Openssl 一起工作,但幾乎沒有關于這個主題的信息。
1 回答

三國紛爭
TA貢獻1804條經驗 獲得超7個贊
OCB是一種類似于 GCM 的經過身份驗證的加密算法,即在加密過程中生成一個標簽,該標簽用于在解密過程中進行身份驗證。OpenSSL 支持 OCB,因此高級 API 的實現與 GCM完全等效。
此 C 代碼返回與發布的 PHP 代碼相同的密文(假設相同的明文、密鑰和隨機數)。但是,C 代碼生成的標簽不是PHP 代碼生成的。$tag
它既不會附加到密文中,也不會像 GCM / CCM 那樣在第 6 個參數 ( ) 中返回。后者甚至會導致錯誤消息(無法為不支持 AEAD 的密碼提供經過身份驗證的標簽)。
2014 年 5 月的PHP 錯誤報告#67304為 GCM 提交了相同的錯誤(盡管 GCM 位于支持的算法列表中,但未提供標簽),這導致了 7.1 中對 GCM 和 CCM 的支持。(2016 年 12 月發布)。在 2016 年 1 月的相關 PHP RFC?OpenSSL AEAD 支持中,可以在“未來范圍:一旦擴展支持 OpenSSL 1.1,添加對 OCB 模式的支持”下閱讀。
總體而言,看起來 PHP 中的 OCB 可能還沒有完全實現,就像當時的 GCM / CCM 一樣,這最終是一個錯誤。
- 1 回答
- 0 關注
- 176 瀏覽
添加回答
舉報
0/150
提交
取消