如何将 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)
将十六进制字符串转换为原始二进制文件
虽然 dexhex
和 hexdec
进行十进制 <-> 十六进制转换,但在我的例子中它们失败了,因为我正在处理大量数字。
因此我推荐使用 GMP 扩展:
$gmp = gmp_init($hex, 16);
十六进制到 GMP,然后:
$dec = gmp_strval($gmp, 10);
GMP 编号以 10 为基数的 STRING 表示形式
$bin = gmp_strval($gmp, 2);
GMP 编号以 2 为基数 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)
将十六进制字符串转换为原始二进制文件
虽然 dexhex
和 hexdec
进行十进制 <-> 十六进制转换,但在我的例子中它们失败了,因为我正在处理大量数字。
因此我推荐使用 GMP 扩展:
$gmp = gmp_init($hex, 16);
十六进制到 GMP,然后:$dec = gmp_strval($gmp, 10);
GMP 编号以 10 为基数的 STRING 表示形式$bin = gmp_strval($gmp, 2);
GMP 编号以 2 为基数 STRING 表示法