2015-02-20 2 views
0

Я реализую алгоритм шифрования AES, и мне нужно придумать способ увеличения моего iv. Я застрял на довольно простой вопрос:Установить положение байт-массива на произвольное целочисленное значение

Если у меня есть 16-байтовый, случайно сгенерированный массив, как я могу установить конкретный байт на произвольное значение?

Например, сказать, что я просто хочу arbitarily установить мой младший значащий байт 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));

Это дает выход как это (эти цифры не будут Перекрестная ссылка на то, что вы видите выше, но просто сосредоточиться на последнем байт):

массив (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)}

массив (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

И ваш ожидаемый результат будет? – Rizier123

+0

9299dd089611fa47f130c4e92aaa09ff – Alex

+0

«Другая попытка» имеет синтаксическую ошибку. – Halfstop

ответ

2

Вы должны использовать строковые манипуляционные процедуры, чтобы манипулировать необработанными байтовыми массивами. См Byte manipulation in PHP

Try:

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

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

$bytes[15] = chr(0xff) 
+0

Обе эти работы. Отличные решения. Благодаря! – Alex

+0

Итак, это вопрос преобразования целого числа в символ. – Tarik

+0

Да. Еще раз спасибо! – Alex