Установить позицию байтового массива в произвольное целочисленное значение

0

Я реализую алгоритм шифрования 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)

  • 1
    И ваш ожидаемый результат будет?
  • 0
    9299dd089611fa47f130c4e92aaa09ff
Показать ещё 6 комментариев
Теги:

1 ответ

2
Лучший ответ

Вы должны использовать строковые манипуляционные процедуры для управления массивами необработанных байтов. См. Манипулирование байтами в PHP

Пытаться:

$bytes = substr_replace ($bytes, chr(0xFF), 15 , 1);

Также попробуйте:

$bytes[15] =  chr(0xff)
  • 0
    Обе эти работы. Великолепные решения. Спасибо!
  • 0
    Так что это был вопрос преобразования целого числа в символ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню