yigityalim
projelerel kitabılabişe alpaylaş
xgithub
siteprojelerel kitabılaboratuvardeğişiklik günlüğü
hakkındakullanımlarşimdiişe alpaylaş
diğerxgithublinkedine-posta
metarssllms.txtsitemap
© 2026 Yiğit Yalım. Tüm hakları saklıdır.
/
Laboratuvarlara Dön
10 May 2026·kriptografi

ChaCha20 Inner State Stepper

ChaCha20'nin 4×4 state matrix'ini quarter-round bazında adım adım izle. Key + nonce verilebilir, 320 sub-op'un her birinde hangi hücrelerin değiştiğini gör.

chacha20 · stream-cipher · rfc-7539

ÖncekiBase64 Encoder / DecoderSonrakiCIDR Subnet Hesaplayıcı

ChaCha20 stream cipher'ın güzelliği, sadeliğinde: 16 adet 32-bit değer, ARX (add–rotate–xor) operasyonları, 20 round. Tüm gizem quarter round dediğimiz 4 satırlık fonksiyon ve column → diagonal dönüşümünden ibaret.

Bu lab algoritmayı sub-op düzeyinde ayrıştırır. Her tıklama tam 1 satır ARX uygular; key/nonce'u rastgeleleştirebilir, 1× / 4× / 16× hızlarda otomatik oynatabilirsin. 320 sub-op = 80 quarter round = 10 double round = full ChaCha20.

ChaCha20 — inner state stepper · 0/320 sub-op

Educational only. RFC 7539 inner permutation görselleştirmek için TS'te yeniden yazıldı — WebCrypto round state vermiyor. Üretimde crypto.subtle veya @noble/ciphers kullan.

key (32 bayt)
nonce (12 bayt)
counter (u32)
round 1/10 (col)QR 1/4sub-op —
—
00 · const61707865
01 · const3320646e
02 · const79622d32
03 · const6b206574
04 · key03020100
05 · key07060504
06 · key0b0a0908
07 · key0f0e0d0c
08 · key13121110
09 · key17161514
10 · key1b1a1918
11 · key1f1e1d1c
12 · ctr00000000
13 · nonce09000000
14 · nonce4a000000
15 · nonce00000000
constantskeycounternoncesky ring = active QR · amber = changed this step
encrypt · plaintext ⊕ keystream = ciphertext
plaintext · 15 bayt
48656c6c6f20436861436861323021
keystream · ChaCha20(key, nonce, counter)
8adc91fd9ff4f0f51b0fad50ff15d637
ciphertext
c2b9fd91f0d4b39d7a4cc531cd25f7
decrypt · ciphertext ⊕ keystream
= Hello ChaCha20!
48656c6c6f20436861436861323021

Counter'ı değiştir — keystream tamamen değişir, ciphertext da değişir. Aynı key/nonce çifti ile farklı counter her zaman farklı bir 64-byte blok üretir. Aynı XOR hem encrypt hem decrypt yapar.

State'in yapısı

4×4 grid'in her hücresi farklı bir rolü temsil eder, kart üzerindeki renk kodu:

  • Sabitler (gri, ilk satır): "expand 32-byte k" ASCII'sinin 4 word'ü — 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574. Hiç değişmez (başlangıçta), her ChaCha20 instance'ı aynı.
  • Anahtar (mavi, 2. + 3. satır): 256-bit anahtarın 8 word'ü, little-endian.
  • Sayaç (mor, 12. hücre): 32-bit blok sayacı. ChaCha20 her 64-byte keystream bloğu için bir kere çalışır; sayaç 0, 1, 2, ... ile blok ayırt etmek için kullanılır.
  • Nonce (kehribar, 13-15): 96-bit nonce, little-endian.

Quarter round

Tek satırlık tanım, 4 sub-op:

QR(a, b, c, d) — quarter round
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)

Sadece toplama, XOR, sola döndürme — sabit zamanlı, branchless, donanım dostu.

Column → Diagonal

Bir double round'da:

  1. Column round: dikey 4 sütuna QR uygula → QR(0,4,8,12), QR(1,5,9,13), QR(2,6,10,14), QR(3,7,11,15)
  2. Diagonal round: çapraz dörtlülere QR uygula → QR(0,5,10,15), QR(1,6,11,12), QR(2,7,8,13), QR(3,4,9,14)

10 double round = 20 round. Sonunda working state initial state'e eklenir, little-endian serialize edilir → 64-byte keystream bloğu.

Ne öğretir

  • ChaCha20'de "kara kutu" yok — her primitive operasyon görünür; bir matematik öğrencisi yarım saatte tahta üstünde takip edebilir
  • Diagonal round, column round'un yapamadığını yapar: diffusion. Aynı sütundaki bilginin tüm sütunlara karışmasını sağlar
  • Constant-time olması donanımdan değil kod yapısından gelir — sadece add/xor/rotate, hiçbir şart, hiçbir tablo lookup
  • AES'ten farklı olarak yazılım dostu (S-box yok, hızlı CPU karşılığı yok); mobil ve embedded'da daha iyi

Üretimde kullanma

Bu implementation sadece görselleştirme için — RFC 7539'a uygun ama timing-attack korumalı değil, side-channel hardened değil.

Gerçek şifreleme için:

  • Tarayıcı: crypto.subtle (Node 19+ dahil) — ChaCha20-Poly1305 desteklenmiyor olabilir, AES-GCM kullan
  • Pure JS: @noble/ciphers veya @stablelib/chacha20poly1305
  • Node: crypto.createCipheriv('chacha20-poly1305', ...) (OpenSSL altta)