如何将 openssl_encrypt 原始输出转换为二进制字符串?

How to convert openssl_encrypt raw output to binary string?

我正在用 openssl_encrypt 加密一些数字,例如:

<?php

$input = 123;
$binary = decbin($input);

echo $binary; // outputs: 1111011

$cipher = 'aes-128-ecb';
$key = openssl_random_pseudo_bytes(32);

$encodedRaw = openssl_encrypt($binary, $cipher, $key, true);

echo $encodedRaw; // outputs: D�f�e↓v�ne��|۵�

现在,因为一切都是数字,而 encodedRaw 只是一些二进制流(转换为一些奇怪的类似随机的字符),我试图将其转换回二进制 (01) 格式。

$binary2 = bindec($encodedRaw);

echo $binary2; // outputs: 0

似乎 bindec() 失败并且 returns 为假,PHP 神奇地将其转换为 0。为了证实这一点,我用 20 个随机 $ 输入创建了一个循环,它们在最后一步都返回了 0

如何将 openssl_encrypt 输出转换为二进制字符串(由 0 和 1 组成)?

decbin return 是一个由“0”和“1”字符组成的字符串。
bindec 则相反。它需要一串“0”和“1”字符。

它与 return 由 openssl_encrypt 编辑的二进制数据无关。

如果您想以人类可读的形式打印 $encodedRaw,您可以使用 unpack,例如到 return 一个十六进制字符串:

var_dump(unpack('h*', $encodedRaw));

要打印类似于 bindec 输出的字符串,您可以这样做:

$binStr = "";
foreach(str_split(unpack('h*', $encodedRaw)[1]) as $v) {
    $binStr .= decbin(hexdec($v));
}
echo $binStr;

亚历克斯回答的附录

  • $hex = unpack('h*', $cipherText)[1] 将原始二进制转换为十六进制
  • $cipherText = pack('h*', $hex) 将十六进制字符串转换为原始二进制文件

虽然 dexhexhexdec 进行十进制 <-> 十六进制转换,但在我的例子中它们失败了,因为我正在处理大量数字。

因此我推荐使用 GMP 扩展:

  • $gmp = gmp_init($hex, 16); 十六进制到 GMP,然后:
  • $dec = gmp_strval($gmp, 10); GMP 编号以 10 为基数的 STRING 表示形式
  • $bin = gmp_strval($gmp, 2); GMP 编号以 2 为基数 STRING 表示法