使用 OCB 模式时 Openssl 解密失败

我有一个 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-CBC

IV: �K�K�l4.�4;y

Text: 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-OCB

IV: ��)����ƢX

Text: 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 一起工作,但几乎没有关于这个主题的信息。


函数式编程
浏览 111回答 1
1回答

三国纷争

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 一样,这最终是一个错误。
打开App,查看更多内容
随时随地看视频慕课网APP