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