为了账号安全,请及时绑定邮箱和手机立即绑定

使用 OCB 模式时 Openssl 解密失败

使用 OCB 模式时 Openssl 解密失败

PHP
函数式编程 2023-10-15 15:07:40
我有一个 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 一样,这最终是一个错误。


查看完整回答
反对 回复 2023-10-15
  • 1 回答
  • 0 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信