Salsa20
Varian ChaCha

| --- | --- |
Fungsi seperempat ronde ChaCha. Empat salinan paralel membuat satu ronde.
Informasi umum
Pendesain: Daniel J. Bernstein
Pertama kali dipublikasikan: 2008
Penerus: Salsa20
Terkait dengan: Rumba20
Detail penyandian
Ukuran kunci: 128 atau 256 bit
Ukuran status: 512 bit
Struktur: ARX (tambah-putar-XOR)
Ronde: 20
Kecepatan: 3,95 siklus per bita pada Intel Core 2 Duo
Pada tahun 2008, Bernstein memublikasikan keluarga ChaCha yang bersaudara dengan Salsa dan bertujuan untuk meningkatkan penghamburan per ronde sekaligus memiliki kinerja yang sama atau lebih baik. Makalah Aumasson dkk. juga menyerang ChaCha dan berhasil hingga satu ronde lebih sedikit: untuk 256 bit, ChaCha6 dengan kompleksitas 2139 dan ChaCha7 dengan kompleksitas 2248. Untuk 128 bit, ChaCha6 dalam 2107 juga tercapai, tetapi mengeklaim bahwa serangan tersebut gagal memecahkan ChaCha7 128 bit.
Seperti Salsa20, status awal ChaCha terdiri dari 128 bit tetapan, 256 bit kunci, 64 bit pencacah, dan 64 bit nilai yang hanya dipakai sekali (nonce) dan ditata sebagai matriks 4×4 dari kata 32 bit. Namun, ChaCha menata ulang beberapa kata dalam status awalnya:
| 0 | 1 | 2 | 3 |
| --- | --- | --- | --- |
| "expa" | "nd 3" | "2-by" | "te k" |
Kunci
Kunci
| Letak | Letak | Nonce | Nonce |
Tetapan yang dipakai sama dengan Salsa20 ("expand 32-byte k"). ChaCha mengganti seperempat ronde Salsa20 QR(a, b, c, d) dengan berikut:
a += b; d ^= a; d <<<= 16;
c += d; b ^= c; b <<<= 12;
a += b; d ^= a; d <<<= 8;
c += d; b ^= c; b <<<= 7;
Perhatikan bahwa versi ini memperbarui tiap kata dua kali, sedangkan seperempat ronde Salsa20 hanya memperbarui tiap kata sekali. Selain itu, seperempat ronde ChaCha menghamburkan perubahan lebih cepat. Rata-rata, setelah mengganti satu bit input, seperempat ronde Salsa20 akan mengganti 8 bit keluaran, sedangkan ChaCha akan mengganti 12,5 bit keluaran.
Seperempat ronde ChaCha memiliki jumlah pertambahan, XOR, dan geseran melingkar yang sama dengan seperempat ronde Salsa20. Namun, karena dua geseran melingkar kelipatan 8, ada pengoptimalan pada beberapa arsitektur, termasuk x86. Terlebih lagi, pemformatan input telah ditata untuk mendukung pengoptimalan penerapan SSE yang efisien. Alih-alih pergantian ronde kolom dan ronde baris, yang dipakai adalah pergantian ronde kolom dan diagonal. Seperti Salsa20, ChaCha menata enam belas kata 32 bit dalam matriks 4×4. Berikut indeks elemen matriks dari 0 sampai 15.
| 0 | 1 | 2 | 3 |
| --- | --- | --- | --- |
| 0 | 1 | 2 | 3 |
| 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 |
ChaCha20 menggunakan 10 perulangan ronde ganda. Ronde ganda ChaCha adalah sebagai berikut:
// Ronde ganil
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
// Ronde genap
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))
#define ROUNDS 20
 
void chacha_block(uint32_t out[16], uint32_t const in[16])
{
	int i;
	uint32_t x[16];

	for (i = 0; i < 16; ++i)	
		x[i] = in[i];
	// 10 perulangan × 2 ronde/perulangan = 20 ronde
	for (i = 0; i < ROUNDS; i += 2) {
		// Ronde ganjil
		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
		// Ronde genap
		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.