Coba jelasin // Ronde ganil dari Salsa20 dong

QR(0, 4,  8, 12)	// kolom 1

QR(1, 5,  9, 13)	// kolom 2

QR(2, 6, 10, 14)	// kolom 3

QR(3, 7, 11, 15)	// kolom 4

QR(0, 5, 10, 15)	// diagonal 1 (diagonal utama)

QR(1, 6, 11, 12)	// diagonal 2

QR(2, 7,  8, 13)	// diagonal 3

QR(3, 4,  9, 14)	// diagonal 4

Berikut penerapan ChaCha20 dalam C/C++.

#define ROTL(a,b) (((a) << (b)) | ((a) >> (32 - (b))))

#define 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))

void chacha_block(uint32_t out[16], uint32_t const in[16])

for (i = 0; i < 16; ++i)

// 10 perulangan × 2 ronde/perulangan = 20 ronde

for (i = 0; i < ROUNDS; i += 2) {

QR(x[0], x[4], x[ 8], x[12]); // kolom 0

QR(x[1], x[5], x[ 9], x[13]); // kolom 1

QR(x[2], x[6], x[10], x[14]); // kolom 2

QR(x[3], x[7], x[11], x[15]); // kolom 3

QR(x[0], x[5], x[10], x[15]); // diagonal 1 (diagonal utama)

QR(x[1], x[6], x[11], x[12]); // diagonal 2

QR(x[2], x[7], x[ 8], x[13]); // diagonal 3

QR(x[3], x[4], x[ 9], x[14]); // diagonal 4

for (i = 0; i < 16; ++i)

out[i] = x[i] + in[i];

ChaCha adalah dasar dari fungsi hash BLAKE, salah satu finalis dalam kompetisi fungsi hash NIST, dan turunan BLAKE2/3 yang diatur agar jauh lebih cepat. Ia juga menentukan varian dengan enam belas kata 64 bit (1024 bit status) dengan tetapan rotasi yang sesuai.