【问题标题】:PHP : openssl_encrypt result 32o string with 16o input stringPHP:openssl_encrypt 结果 32o 字符串和 16o 输入字符串
【发布时间】:2020-02-17 06:28:19
【问题描述】:

我的 openssl_encrypt 函数有问题。

在 aes-128-cbc 中,为什么函数返回一个 32 字节字符串和一个 16 字节字符串作为输入?

示例:

$binaryK0 = openssl_encrypt(hex2bin("00000000000000000000000000000000"),"AES-128-CBC", hex2bin("00112233445566778899AABBCCDDEEFF"),OPENSSL_RAW_DATA, hex2bin("00000000000000000000000000000000"));
echo "openssl_encrypt length:".strlen($binaryK0).'<br>';
$binaryK0 = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, hex2bin("00112233445566778899AABBCCDDEEFF"), hex2bin("00000000000000000000000000000000"), MCRYPT_MODE_CBC, hex2bin("00000000000000000000000000000000"));
echo "mcrypt_encrypt length:".strlen($binaryK0).'<br>';

结果: openssl_encrypt 长度:32 mcrypt_encrypt 长度:16

【问题讨论】:

  • openssl_encrypt 使用 Pkcs7 填充、mcrypt_encrypt 零字节填充、herehere。如果明文的长度对应于块大小的整数倍(AES 为 16 字节),如在贴出的代码中长度为 16 字节,则 Pkcs7-padding 会添加一个完整的块(对应于总长度为 32 字节),零字节填充不会增加任何内容(因此长度保持不变,为 16 个字节)。

标签: php openssl aes cbc-mode 128-bit


【解决方案1】:

谢谢托帕科。

根据您的意见,我们在 php openssl 源代码中进行调查。 我们找到“OPENSSL_NO_PADDING”选项,现在可以正常工作了。

$binaryK0 = openssl_encrypt(hex2bin("00000000000000000000000000000000"),"AES-128-CBC", hex2bin("00112233445566778899AABBCCDDEEFF"),**OPENSSL_NO_PADDING**, hex2bin("00000000000000000000000000000000"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多