Poly1305
Főnév
Poly1305 (tsz. Poly1305s)
- (informatika) A Poly1305 egy kriptográfiai MAC (Message Authentication Code) algoritmus, amelyet Daniel J. Bernstein tervezett 2005-ben. Célja, hogy gyors, egyszerű és biztonságos üzenethitelesítési módszert nyújtson, különösen szoftveres környezetekben és modern titkosítási protokollokban. A Poly1305 önmagában nem titkosító algoritmus, hanem egy hitelesítő függvény, amely biztosítja, hogy az adatot nem módosították, és valóban az a fél küldte, akinek szánták.
A Poly1305 gyakran együtt használatos a ChaCha20 stream cipher-rel, így jön létre a széles körben alkalmazott ChaCha20-Poly1305 AEAD (Authenticated Encryption with Associated Data) konstrukció, amely például megtalálható a TLS 1.3, OpenSSH, WireGuard VPN, Signal és sok más biztonságos rendszerben.
🧠 Mi az a MAC?
A Message Authentication Code (MAC) egy rövid, rögzített hosszúságú érték, amit az üzenet alapján és egy titkos kulcs felhasználásával számolnak ki. A célja, hogy:
- Biztosítsa az üzenet hitelességét (azt a fél küldte, akitől származik),
- Biztosítsa az integritást (nem módosították közben az adatot),
- Megakadályozza a manipulációt vagy hamisítást.
🔐 A Poly1305 célja
A Poly1305 egy olyan MAC algoritmus, amely:
- Nagyon gyorsan végrehajtható bármilyen CPU-n,
- Nem igényel nehézkes műveleteket (mint pl. RSA vagy ECC),
- Erősen ellenáll a kriptográfiai támadásoknak (pl. forgácsolási támadás, üzenet-módosítás),
- Egyszerű és jól vizsgálható matematikai alapokon nyugszik.
📦 Technikai paraméterek
| Tulajdonság | Érték |
|---|---|
| Kimeneti méret | 128 bit (16 byte) |
| Kulcs méret | 256 bit (32 byte), amely két részből áll: 128-bit kulcs r, és 128-bit nonce-alapú s |
| Alapműveletek | 32-bites addíció, szorzás, moduló számítás |
| Hash alap | Szorzás és összeadás egy prím modulo alatt: 2^130 - 5 |
| Sebesség | Akár 1 ciklus/byte (x86 architektúrán) |
⚙️ Hogyan működik a Poly1305?
Bemenetek:
- Egy üzenet (tetszőleges hosszúságú),
- Egy kulcs: két 128 bites komponensből áll:
r: a fő szorzókulcs (128 bit), speciális bitmaszkkal korlátozva,
s: a kimenethez adott érték (128 bit), amelyet általában a titkosítóból (pl. ChaCha20) származtatnak.
Lépések:
- Az üzenetet 16 bájtos blokkokra bontjuk.
- Minden blokkhoz hozzáadunk egy bájtos 0x01 paddinget, hogy 17 bájtos számként kezeljük.
- Az így kapott számokat összeadjuk és modulo
2^130 - 5értékkel kezeljük. - Végül hozzáadjuk az
skulcsrészletet. - Az eredmény: 16 bájtos hitelesítési kód, amit az üzenethez mellékelhetünk.
🧪 Egyszerűsített példa
Tegyük fel, hogy az üzenet:
b"hello world"
és a kulcs r és s értékeit a ChaCha20 algoritmusból nyerjük ki. A Poly1305 ezt az üzenetet blokkokra bontja, 17 bájtos számként kezeli, elvégzi a polinomiális összeadást és modulózást, majd végül hozzáadja az s értéket → így jön létre az auth tag (MAC érték).
🔐 Poly1305 kulcskezelés – miért fontos?
A kulcs r részének sosem szabad ismétlődnie ugyanazzal az s értékkel. Ezért:
- A Poly1305 kulcsát mindig egyszeri (one-time) titkosító kulcsból kell generálni (pl. egy stream cipher első 32 byte-jából).
- A ChaCha20-Poly1305 AEAD esetén a kulcsot egy nonce és kulcs alapján származtatjuk ChaCha20 segítségével → ez biztonságos és hatékony.
⚠️ Milyen támadások ellen véd?
| Támadás | Védelmi módszer |
|---|---|
| Üzenet módosítása | MAC érvénytelen lesz |
| Replay támadás | Nonce használat → új MAC minden alkalommal |
| Forgácsolási támadás (bitflipping) | MAC nem fog stimmelni |
| Üzenet aláírás hamisítása | Ismeretlen r kulccsal lehetetlen |
✅ Poly1305 előnyei
| Előny | Magyarázat |
|---|---|
| Hihetetlenül gyors | Szoftveres környezetben akár 1 ciklus/byte |
| Matematikailag bizonyított | Moduláris aritmetikán alapul |
| Egyszerű implementáció | Nem igényel bonyolult logikát |
| Szabadon használható | Nincs szabadalmi védelem |
| Modern szabványok része | TLS 1.3, OpenSSH, WireGuard, libsodium stb. |
🧩 Poly1305 AEAD konstrukcióban
A Poly1305 nem titkosít, ezért AEAD konstrukcióban, például ChaCha20-Poly1305-ben kombinálják egy titkosítóval.
AEAD = Authenticated Encryption with Associated Data, azaz: - Titkosítás + Hitelesítés + Kapcsolódó (nem titkosított) adatok védelme.
ChaCha20-Poly1305 működése: 1. A titkosító (ChaCha20) titkosítja az üzenetet. 2. Az első 32 byte-jából kulcs készül a Poly1305 számára. 3. Poly1305 hash-t számol a titkosított adat + egyéb adatok (AAD) alapján. 4. A végső kimenet: ciphertext || auth_tag
📚 Hol használják a Poly1305-öt?
| Rendszer | Használat |
|---|---|
| TLS 1.2 / 1.3 | AEAD titkosítás (ChaCha20-Poly1305) |
| OpenSSH | Alapértelmezett hitelesítő algoritmus |
| WireGuard VPN | Gyors VPN-protokoll, ChaCha20-Poly1305-re építve |
| libsodium | Modern kriptográfiai könyvtár, alapeszközként használja |
| NaCl (Networking and Cryptography Library) | Első implementációja Poly1305-nek |
🔬 Példa Pythonban
from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305
import os
key = ChaCha20Poly1305.generate_key()
chacha = ChaCha20Poly1305(key)
nonce = os.urandom(12)
aad = b"header"
plaintext = b"titkos adat"
ciphertext = chacha.encrypt(nonce, plaintext, aad)
print("Titkosított adat:", ciphertext.hex())
# Visszafejtés
decrypted = chacha.decrypt(nonce, ciphertext, aad)
print("Visszafejtve:", decrypted.decode())
🧠 Összefoglalás
| Fogalom | Magyarázat |
|---|---|
| Poly1305 | Nagyon gyors MAC algoritmus, nem titkosító |
| Kimenet | 128 bites hitelesítési kód |
| Kulcs | 256 bit (r + s), egyszer használatos |
| Sebesség | Akár 1 ciklus/byte szoftverben |
| Alapműveletek | Összeadás, szorzás, mod 2^130 - 5 |
| Használat | AEAD konstrukciókban (pl. ChaCha20-Poly1305) |
| Védelmi szint | Magas – modern támadások ellen is biztonságos |
| Ajánlott | Minden olyan rendszerhez, ahol gyors és biztonságos MAC szükséges |
A Poly1305 ma az egyik leggyorsabb, legbiztonságosabb üzenet-hitelesítési megoldás, különösen ha ChaCha20 titkosítással együtt használjuk. Egyszerűsége, sebessége és kriptográfiai szilárdsága miatt mára szabvánnyá vált a legkritikusabb alkalmazásokban is.