Mă jucam cu cifrurile de flux și găsim acest Pagina Wikipedia ChaCha20 (varianta ChaCha). Ceea ce am pierdut este cum să testez acest cod. Nu există vectori de testare nicăieri pe pagina respectivă și nu pot găsi niciunul. Am scris următorul cod C:
#definiți ROTL(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
#definiți QR(a, b, c, d) ( \
a += b, d ^= a, d = ROTL(d,16), \
c += d, b ^= c, b = ROTL(b,12), \
a += b, d ^= a, d = ROTL(d, 8), \
c += d, b ^= c, b = ROTL(b, 7))
#define RUPELE 20
void chacha_block(uint32_t out[16], uint32_t const in[16])
{
int i;
uint32_t x[16];
pentru (i = 0; i < 16; ++i)
x[i] = în[i];
// 10 bucle à 2 runde/bucla = 20 de runde
pentru (i = 0; i < ROUNDE; i += 2) {
// Runda impară
QR(x[0], x[4], x[8], x[12]); // coloana 0
QR(x[1], x[5], x[9], x[13]); // coloana 1
QR(x[2], x[6], x[10], x[14]); // coloana 2
QR(x[3], x[7], x[11], x[15]); // coloana 3
// Chiar rotund
QR(x[0], x[5], x[10], x[15]); // diagonala 1 (diagonala principală)
QR(x[1], x[6], x[11], x[12]); // diagonala 2
QR(x[2], x[7], x[8], x[13]); // diagonala 3
QR(x[3], x[4], x[9], x[14]); // diagonala 4
}
pentru (i = 0; i < 16; ++i)
afară[i] = x[i] + în[i];
}
}
void main(){
const char* constant = "expand 32-byte k";
uint32_t inwhole[16];
inwhole[0] = ((uint32_t*)constant)[0];
inwhole[1] = ((uint32_t*)constant)[1];
inwhole[2] = ((uint32_t*)constant)[2];
inwhole[3] = ((uint32_t*)constant)[3];
în întregime[4] = 0;//key[0];
inwhole[5] = 0;//key[1];
inwhole[6] = 0;//key[2];
inwhole[7] = 0;//key[3];
inwhole[8] = 0;//key[4];
inwhole[9] = 0;//key[5];
în întregime[10] = 0;//key[6];
inwhole[11] = 0;//key[7];
//Număr zero și nonce
în întregime[12] = 0;
în întregime[13] = 0;
în întregime[14] = 0;
în întregime[15] = 0;
uint32_t out[16];
chacha_block(out, inwhole);
printHex((char*)out2,16*4);
//Aceasta se tipărește:
//76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43687616151876161518616151864
}
Nu am putut găsi niciun vector de testare pentru a valida acest prim bloc al fluxului de chei.
De asemenea, mi s-a părut confuz că este următorul bloc keystream menit să fie generat prin trecerea ieșirii anterioare înapoi la chacha_block
funcţie?
De asemenea, această cifră trebuie utilizată pentru a xor blocurile keystream cu date (acest lucru nu a fost menționat în mod explicit în articol)?