Я реализую алгоритм шифрования 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
Я занимаюсь этим часами, и я просто не могу понять это. Может ли кто-нибудь помочь? Спасибо.
EDIT: Я также попытался вывести массив следующим образом: echo var_dump(unpack('C*', $bytes));
Это дает такой результат (эти числа не будут ссылаться на то, что вы видите выше, но просто сосредоточьтесь на последнем байте):
array (16) {[1] => int (242) [2] => int (106) [3] => int (88) [4] => int (109) [5] => int (145) [6] => int (251) [7] => int (38) [8] => int (54) [9] => int (39) [10] => int (61) [11] => int (175) [12] => int (183) [13] => int (27) [14] => int (98) [15] => int (13) [16] => int (106)}
array (16) {[1] => int (242) [2] => int (106) [3] => int (88) [4] => int (109) [5] => int (145) [6] => int (251) [7] => int (38) [8] => int (54) [9] => int (39) [10] => int (61) [11] => int (175) [12] => int (183) [13] => int (27) [14] => int (98) [15] => int (13) [16] => int (50)}
Не следует показывать последний байт
[16] => int (255)
Вы должны использовать строковые манипуляционные процедуры для управления массивами необработанных байтов. См. Манипулирование байтами в PHP
Пытаться:
$bytes = substr_replace ($bytes, chr(0xFF), 15 , 1);
Также попробуйте:
$bytes[15] = chr(0xff)