ChaCha20
256 битийн түлхүүр ашиглан мэдээллийг урсгал хэлбэрээр шифрлэдэг, программ хангамжид үр ашигтай ажиллах симметрик шифр.
- Стандарт
- RFC 8439
- Түлхүүрийн урт
- 256 бит
- Nonce-ийн урт
- 96 бит
- 12 байт
- Баталгаажуулах tag
- 128 бит
- 16 байт
Чухал анхааруулга
- Нэг нууц түлхүүртэй хамт nonce-ийг дахин ашиглаж болохгүй.
- Давтан ашиглавал мэдээллийн нууцлал алдагдах эрсдэлтэй.
- ChaCha20 дангаараа мэдээллийн бүрэн бүтэн байдлыг баталгаажуулдаггүй тул бодит системд ChaCha20-Poly1305 зэрэг баталгаажуулалттай шифрлэлтийн горим ашиглана.
- Нууц түлхүүрийг аюулгүй хадгалж, баталгаажуулалт амжилтгүй болсон мэдээллийг ашиглаж болохгүй.
Юу вэ?
ChaCha20 нь Даниел Бернштейний зохион бүтээсэн симметрик stream cipher юм. Энэ алгоритм нь 256 битийн нууц түлхүүр ашиглан мэдээллийг шифрлэж, ижил түлхүүр болон тохирох nonce, counter-ийн тусламжтайгаар тайлдаг. ChaCha20-Poly1305 хослол нь мэдээллийн нууцлалын зэрэгцээ өөрчлөгдсөн эсэхийг шалгах боломж олгодог.
Хэрхэн ажилладаг вэ?
ChaCha20 нь 256 битийн түлхүүр, 96 битийн nonce болон 32 битийн counter ашиглан 512 битийн түлхүүрийн урсгалын блокууд үүсгэдэг. ARX (Addition, Rotation, XOR) үйлдлээр дотоод төлөвийг 20 үе шаттай хувиргаж, гарсан урсгалыг эх мэдээлэлтэй XOR үйлдлээр нэгтгэн шифрлэнэ. Тайлах үед ижил түлхүүр, nonce болон counter ашиглан ижил урсгалыг үүсгэдэг. Нэг түлхүүрийн хүрээнд nonce-ийг давтаж болохгүй.
Хаана ашиглагддаг вэ?
- TLS 1.3
- WireGuard VPN
- QUIC протокол
- ChaCha20-Poly1305 ашигладаг аюулгүй мессеж болон өгөгдөл дамжуулах системүүд
Түгээмэл алдаа
- Nonce-ийг нэг түлхүүрийн хүрээнд давтан ашиглах
- Нууц түлхүүрийг код дотор шууд бичиж хадгалах
- Криптографийн түлхүүр үүсгэхдээ Math.random() ашиглах
- ChaCha20 дангаараа мэдээллийн бүрэн бүтэн байдлыг хамгаална гэж үзэх
- Poly1305-ийн баталгаажуулалтыг шалгалгүйгээр тайлагдсан мэдээллийг ашиглах
- Nonce болон түлхүүрийг хамгаалалтгүй сувгаар дамжуулах
- RFC 8439 стандартын бус өөрийн хэрэгжүүлэлт ашиглах
Жишээ код
from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305
import os
# 256 битийн түлхүүр үүсгэх
key = ChaCha20Poly1305.generate_key()
cipher = ChaCha20Poly1305(key)
# 96 бит буюу 12 байтын nonce
nonce = os.urandom(12)
plaintext = b"Nuuts medeelel"
aad = b"message-v1"
# Шифрлэх: ciphertext + authentication tag
encrypted = cipher.encrypt(nonce, plaintext, aad)
# Тайлах ба баталгаажуулах
decrypted = cipher.decrypt(nonce, encrypted, aad)
assert decrypted == plaintext
print("Амжилттай тайлж, баталгаажууллаа")