In RFC7539 § 2.3.2.Вектор теста для функции блока ChaCha20 показывает «состояние ChaCha в конце операции ChaCha20».Я могу получить это с помощью PHP 7.2.8 и OpenSSL таким образом:
<?php
<span class="math-container">$key = implode(range(chr(0x00), chr(0x1f)), '');
$</span>nonce = "\x00\x00\x00\x09\x00\x00\x00\x4a\x00\x00\x00\x00";
$counter = 1;
<span class="math-container">$ciphertext = openssl_encrypt(
str_repeat("\0", 64),
'chacha20',
$</span>key,
OPENSSL_RAW_DATA,
pack('V', <span class="math-container">$counter) . $</span>nonce
);
<span class="math-container">$ciphertext = bin2hex(preg_replace('#(.)(.)(.)(.)#', '$</span>4<span class="math-container">$3$</span>2<span class="math-container">$1', $</span>ciphertext));
<span class="math-container">$ciphertext = chunk_split($</span>ciphertext, 8, ' ');
<span class="math-container">$ciphertext = chunk_split($</span>ciphertext, 32 + 4);
echo $ciphertext;
Я пытаюсь сделать то же самое с черновиком для XChaCha § 2.2.1.Тестовый вектор для функции блокировки HChaCha20 , и у меня возникли некоторые трудности.Мой код:
<?php
<span class="math-container">$key = implode(range(chr(0x00), chr(0x1f)), '');
$</span>nonce = "\x00\x00\x00\x09\x00\x00\x00\x4a\x00\x00\x00\x00\x31\x41\x59\x27";
// <span class="math-container">$nonce = strrev(substr($</span>nonce, 0, 4)) . substr($nonce, 4);
<span class="math-container">$ciphertext = openssl_encrypt(
str_repeat("\0", 64),
'chacha20',
$</span>key,
OPENSSL_RAW_DATA,
$nonce
);
<span class="math-container">$ciphertext = bin2hex(preg_replace('#(.)(.)(.)(.)#', '$</span>4<span class="math-container">$3$</span>2<span class="math-container">$1', $</span>ciphertext));
<span class="math-container">$ciphertext = chunk_split($</span>ciphertext, 8, ' ');
<span class="math-container">$ciphertext = chunk_split($</span>ciphertext, 32 + 4);
echo $ciphertext;
Глядя на черновик, кажется, что это должно работать, согласно этому графику:
cccccccc cccccccc cccccccc cccccccc
kkkkkkkk kkkkkkkk kkkkkkkk kkkkkkkk
kkkkkkkk kkkkkkkk kkkkkkkk kkkkkkkk
bbbbbbbb nnnnnnnn nnnnnnnn nnnnnnnn
ChaCha20 State: c=constant k=key b=blockcount n=nonce
cccccccc cccccccc cccccccc cccccccc
kkkkkkkk kkkkkkkk kkkkkkkk kkkkkkkk
kkkkkkkk kkkkkkkk kkkkkkkk kkkkkkkk
nnnnnnnn nnnnnnnn nnnnnnnn nnnnnnnn
HChaCha20 State: c=constant k=key n=nonce
т.е.счетчик блоков просто заменяется дополнительными битами одноразового номера.
Я отмечаю, что метод, который я использую, чтобы заставить его работать в первом примере, делает pack('V', $counter)
, который дает 01000000 вместо 00000001, поэтомувроде как, может быть, мне нужно сделать strrev
на этих первых четырех байтах, но это не помогло (см. закомментированную строку во втором блоке кода).
Есть идеи?