【问题标题】:How to convert openssl_encrypt raw output to binary string?如何将 openssl_encrypt 原始输出转换为二进制字符串?
【发布时间】:2016-05-21 03:09:32
【问题描述】:

我正在用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() 失败并返回 false,它被 PHP 神奇地转换为 0。为了确认这一点,我创建了一个包含 20 个随机 $input 的循环,它们在最后一步都返回了 0

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

【问题讨论】:

  • 1) echo false 什么都不输出,0 已经是东西了。 2) 请参阅the manual 了解bindec 的期望;它实际上并不处理原始二进制字符串。
  • 那么如何将原始二进制字符串转换为二进制字符串呢?

标签: php base


【解决方案1】:

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

openssl_encrypt返回的二进制数据无关。

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

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

要打印类似于bindec 输出的字符串,您可以执行以下操作:

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

【讨论】:

  • 看来foreach 循环产生的结果与gmp_strval 与base 2 参数不同。你的可能是错误的。无论如何,你让我朝着正确的方向前进,谢谢。
  • 好吧,我手边没有gmp,但它似乎只适用于数字,不确定它如何适用于任意二进制数据。阅读我指出的文档也很重要。例如使用unpack('H*'...),您将得到一个二进制字符串,其中高字节和低字节交换了。
【解决方案2】:

Alex 回答者的附录

  • $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 表示

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 2016-07-29
    • 2017-09-28
    • 1970-01-01
    • 2013-09-19
    • 2012-01-06
    • 2021-02-24
    相关资源
    最近更新 更多