Puncte:1

Este folosirea doar a unuia sau doi vectori de testare pentru ChaCha20 suficient pentru validarea algoritmului codificat?

drapel it

Pentru validarea algoritmului de criptare/decriptare ChaCha20 scris în VB.NET, caut mai mulți vectori de testare ChaCha20 care se bazează pe specificațiile finale pentru ChaCha20 care pot fi găsite Aici. Vezi vectorul de testare din subcapitolul 2.3.2. Acest vector de testare validează codul meu care oferă rezultatul exact specificat în vectorul de testare. (Există un vector aproape identic mai târziu în document, două blocuri cu contoare diferite, validează perfect și asta).

Vectorii de testare pe care i-am găsit în specificațiile schiței ChaCha20 nu dau exact același rezultat ca cel specificat în acești vectori de testare cu specificații preliminare. Ei folosesc un nonce de dimensiuni diferite în comparație cu specificația finală (draft 64 biți, final 96 biți) și starea contorului nu este specificată (presupun că este 0).

Bineînțeles, întrebarea este dacă doar unul sau doi vectori de testare sunt suficienți pentru a valida modul în care este codificat un algoritm de criptare, bănuiala mea este că mai mult este de preferat, dar să spun asta ca un adevărat amator de criptografie.

Ar fi grozav să aveți mai mulți vectori de testare bazați pe specificația finală ChaCha20 pentru a vă asigura că codul oferă rezultatele exacte necesare. Mulțumesc!

    2.3.2. Vector de testare pentru funcția ChaCha20 Block

   Pentru un vector de testare, vom folosi următoarele intrări la ChaCha20
   functie de blocare:

   o Cheie = 00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:
      14:15:16:17:18:19:1a:1b:1c:1d:1e:1f. Cheia este o secvență de
      octeți fără o structură anume înainte de a-l copia în
      starea ChaCha.

   o Nonce = (00:00:00:09:00:00:00:4a:00:00:00:00)

   o Număr de blocuri = 1.

   După configurarea stării ChaCha, arată astfel:

   Starea ChaCha cu setarea cheii.

       61707865 3320646e 79622d32 6b206574
       03020100 07060504 0b0a0908 0f0e0d0c
       13121110 17161514 1b1a1918 1f1e1d1c
       00000001 09000000 4a000000 00000000

   După rularea a 20 de runde (10 runde de coloană intercalate cu 10
   „rotunde diagonale”), starea ChaCha arată astfel:

   Starea ChaCha după 20 de runde

       837778ab e238d763 a67ae21e 5950bb2f
       c4f2d0c7 fc62bb2f 8fa018fc 3f5ec7b7
       335271c2 f29489f3 eabda8fc 82e46ebd
       d19c12b4 b04e16de 9e83d0cb 4e3c50a2

   În cele din urmă, adăugăm starea inițială la rezultat (vector simplu sau
   adăugare de matrice), dând astfel:

   Starea ChaCha la sfârșitul operațiunii ChaCha20

       e4e7f110 15593bd1 1fdd0f50 c47120a3
       c7f4d1c7 0368c033 9aaa2204 4e6cd4c3
       466482d2 09aa9f07 05d7c214 a2028bd9
       d19c12b5 b94e16de e883d0cb 4e3c50a2
Puncte:1
drapel in

Aș spune că acesta este parțial cazul. Din cauza rundelor, chiar și o singură operațiune de bloc va fi operată folosind de mai multe ori. De asemenea, un bloc nu primește nicio intrare specială: aveți un bloc care este mapat la un bloc de ieșire.

Cu toate acestea, aceasta nu este povestea completă. În primul rând, unele dintre calculele din runde pot necesita ceva mai multă magie decât de obicei. Dacă există cazuri marginale posibile, atunci acestea nu pot fi declanșate de o singură operațiune de bloc. Pe cele pe care ar trebui să le testați separat.

Mai important: în timp ce cele de mai sus testează operațiunea de blocare, nu testează operațiunea de streaming. Acest lucru este mult mai probabil să provoace probleme. Problema este că codificarea/decodificarea (de exemplu, octeți în cuvinte) și tamponarea sunt mai puțin triviale decât se așteaptă mulți. Deci, este logic să testați toate tipurile de dimensiuni de text simplu, de exemplu, și să vă asigurați că Actualizați funcțiile funcționează corect. Acest lucru nu este atât de diferit de testarea funcțiilor non-criptografice; te-ai aștepta la aceleași probleme cu operațiunile de codificare/decodare și I/O, de exemplu.

O problemă pe care am văzut-o de multe ori este că echipele de testare ignoră implementarea în sine. Este bine să testați conform specificațiilor oficiale de testare, dar dacă există alegeri specifice de proiectare pentru implementare, atunci acestea ar trebui testate și ele. De exemplu: s-ar putea ca o implementare să aibă un buffer overflow, chiar dacă toate testele oficiale rulează fără incidente. Nu voi repeta nicio poveste de groază aici, dar da...

În cele din urmă, deoarece acesta este un site de criptografie: dacă faceți vreo pretenție cu privire la protecția împotriva atacurilor pe canale secundare, atunci probabil că ar trebui să le testați și pe acestea. Desigur, ești oarecum norocos aici, deoarece Bernstein presupune în general acest tip de atacuri atunci când proiectează un cifr - dar implementările pot fi totuși vulnerabile.


Acestea fiind spuse, nu strică niciodată să rulezi implementarea pe un set mai extins. Doar luați orice bibliotecă existentă (sau două independente) și generați singur un set mare de vectori. Din nou, concentrați-vă pe cazurile marginale; nici să faci un pic de testare neclară nu strica niciodată.

DotNET Afficionado avatar
drapel it
Mulțumesc Maarten (am vrut să votez pentru răspunsul tău, dar noul membru aici la https://crypto.stackexchange.com/ are nevoie de 15 puncte, apoi poate vota pozitiv) este bine de știut. Deja testez cu bytestream-uri pe care le criptez și decriptez, apoi verific dacă sunt identice cu „text simplu” original, dar da, trebuie să automatizez acest lucru pentru a testa mulți bytestream-uri și pentru a vedea dacă mă întâlnesc cu niște cazuri marginale ciudate. Mă îngrijorează oarecum faptul că unii vectori de testare din specificațiile preliminare nu dau același rezultat.
DotNET Afficionado avatar
drapel it
De asemenea, îngrijorător este faptul că unele documentații VB.NET par incorecte în ceea ce privește rotația biților, aici se spune că chiar și pentru numerele întregi fără semn, al 32-lea bit ar fi mascat pentru a fi întotdeauna 0, ceea ce nu este cazul de fapt (nu ar avea sens pentru numerele întregi fără semn). ). Îngrijorat că ceva ciudat sau prost documentat în VB.NET creează un caz limită de care nu sunt conștient până când nu creează o problemă reală. Consultați: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/left-shift-operator
DotNET Afficionado avatar
drapel it
Această postare identifică, de asemenea, problema vectorilor de testare din schițele care nu funcționează (întotdeauna) chiar dacă vectorii cu specificațiile finale sunt perfecți, aici el identifică o problemă cu contorul, dar nu asta găsesc. Doar vectorul de testare cu toate zerourile (cheie, nonce și contor setat la toate zerourile) obține rezultatul corect, dacă folosesc exemplul în care cheia = 1 (adică ultimul cuvânt de 32 de biți din cheie, poziția 11 în ChaCha matrice, este setat la 1), obțin un rezultat final diferit. Vedeți https://crypto.stackexchange.com/questions/81337/chacha-matrix-tests-for-original-implementation-not-passing-due-to-bad-counter

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.