создание внутреннего состояния HChaCha20 с помощью существующей реализации ChaCha20 - PullRequest
1 голос
/ 16 мая 2019

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 на этих первых четырех байтах, но это не помогло (см. закомментированную строку во втором блоке кода).

Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...