我正在实施AES加密算法,我需要想出一种方法来增加我的iv。我抓住了一个非常简单的问题:
如果我有一个随机生成的16字节数组,如何将特定字节设置为任意值?
例如,假设我只想将我的最低有效字节设置为0xff:
<?php
$bytes = openssl_random_pseudo_bytes(16);
echo bin2hex($bytes) . "<br>";
$bytes[15] = 0xff; // arbitrarily set this byte
echo bin2hex($bytes) . "<br>";
?>
这会产生这样的输出(显然是错误的):
9299dd089611fa47f130c4e92aaa09dc
9299dd089611fa47f130c4e92aaa0932
我试图接受这个输出:
9299dd089611fa47f130c4e92aaa09ff
我已经在这里工作了几个小时,我无法弄明白。有人可以帮忙吗?谢谢。
编辑:我还试图像这样输出数组:echo var_dump(unpack('C*', $bytes));
这会产生这样的输出(这些数字不会与你上面看到的相交,但只关注最后一个字节):
array(16){[1] =&gt; int(242)[2] =&gt; int(106)[3] =&gt; int(88)[4] =&gt; INT(109) [5] =&GT; int(145)[6] =&gt; int(251)[7] =&gt; int(38)[8] =&gt; int(54)[9] =&gt; int(39)[10] =&gt; int(61)[11] =&gt; int(175)[12] =&gt; int(183)[13] =&gt; INT(27) [14] =&GT; int(98)[15] =&gt; int(13)[16] =&gt; int(106)}
数组(16){ [1] =&GT; int(242)[2] =&gt; int(106)[3] =&gt; int(88)[4] =&gt; int(109)[5] =&gt; int(145)[6] =&gt; int(251)[7] =&gt; int(38)[8] =&gt; int(54)[9] =&gt; INT(39) [10] =&GT; int(61)[11] =&gt; int(175)[12] =&gt; int(183)[13] =&gt; int(27)[14] =&gt; int(98)[15] =&gt; int(13)[16] =&gt; int(50)}
不应该是最后一个字节显示
[16] =&GT; INT(255)
答案 0 :(得分:2)
您应该使用字符串操作例程来操作原始字节数组。见Byte manipulation in PHP
尝试:
$bytes = substr_replace ($bytes, chr(0xFF), 15 , 1);
还可以尝试:
$bytes[15] = chr(0xff)