Π ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Kyber, ΡΠΏΠ΅ΡΠ΅Π»ΠΈΠ» ΠΊΠΎΠ½ΠΊΡΡΡΠ° Π·Π° ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ, ΡΡΡΠΎΠΉΡΠΈΠ²ΠΈ Π½Π° Π°ΡΠ°ΠΊΠΈ ΠΎΡ ΠΊΠ²Π°Π½ΡΠΎΠ²ΠΈ ΠΊΠΎΠΌΠΏΡΡΡΠΈ, Π΅ ΠΎΡΠΊΡΠΈΡΠΎ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π°ΡΠ°ΠΊΠΈ ΡΡΠ΅Π· ΡΡΡΠ°Π½ΠΈΡΠ½ΠΈ ΠΊΠ°Π½Π°Π»ΠΈ Π·Π° ΠΏΡΠ΅ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈΡ ΠΎΡ Π°ΡΠ°ΠΊΡΠ²Π°ΡΠΈΡ ΡΠΈΡΡΠΎΠ²Π°Π½ ΡΠ΅ΠΊΡΡ. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π·Π°ΡΡΠ³Π° ΠΊΠ°ΠΊΡΠΎ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½Π°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π·Π° ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΠΎΠ²Π΅ CRYSTALS-Kyber KEM, ΡΠ°ΠΊΠ° ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ½ΡΠ½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Ρ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° Kyber, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° pqcrypto, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π² ΠΌΠ΅ΡΠΈΠ½Π΄ΠΆΡΡΠ° Signal.
Π‘ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡΠ°, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΎ ΠΈΠΌΠ΅ KyberSlash, Π΅ Π² ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° Π·Π° Π΄Π΅Π»Π΅Π½ΠΈΠ΅ βt = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;β, ΠΏΡΠΈ ΠΊΠΎΡΡΠΎ Π΄Π΅Π»ΠΈΠΌΠΎΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° ΡΠ΅ΠΊΡΠ΅ΡΠ½Π°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ βtβ Ρ ΡΠΈΠΏ βdoubleβ, Π° Π΄Π΅Π»ΠΈΡΠ΅Π»ΡΡ Π΅ ΠΎΠ±ΡΠΎΠΏΠΎΠ·Π½Π°ΡΠ°ΡΠ° ΠΏΡΠ±Π»ΠΈΡΠ½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ KYBER_Q. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π΅, ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° Π·Π° Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π΅ Π΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° ΠΈ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ΅Π΄ΠΈ Π±ΡΠΎΡΡ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Π½ΠΈΡΠ΅ ΡΠΈΠΊΠ»ΠΈ Π·Π° Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ Π²Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ. Π’Π°ΠΊΠ°, Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π²ΡΠ² Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π° Π·Π° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΏΡΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΡΠΎ.
ΠΠ°Π½ΠΈΠ΅Π» ΠΠ΅ΡΠ½ΡΠ΅ΠΉΠ½ (Daniel J. Bernstein), ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π΅ΠΊΡΠΏΠ΅ΡΡ Π² ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΡΠ°, ΡΡΠΏΡ Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈ ΡΠ°Π±ΠΎΡΠ½Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° Π°ΡΠ°ΠΊΠ° Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°. Π Π΄Π²Π° ΠΎΡ ΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°, ΠΏΡΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΏΠ»Π°ΡΠΊΠ°ΡΠ° Raspberry Pi 2, ΡΡΠΏΡ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΡΠ·Π΄Π°Π΄Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π·Π°ΠΊΡΠΈΡΠΈΡΡ ΠΊΠ»ΡΡ Kyber-512 Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅. ΠΠ΅ΡΠΎΠ΄ΡΡ ΠΌΠΎΠΆΠ΅ ΡΡΡΠΎ Π΄Π° Π±ΡΠ΄Π΅ Π°Π΄Π°ΠΏΡΠΈΡΠ°Π½ Π·Π° ΠΊΠ»ΡΡΠΎΠ²Π΅ Kyber-768 ΠΈ Kyber-1024. ΠΠ° ΡΡΠΏΠ΅ΡΠ½ΠΎΡΠΎ ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π°ΡΠ°ΠΊΠ°ΡΠ° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Π²Π°Π½ΠΈΡΡ ΠΎΡ Π°ΡΠ°ΠΊΡΠ²Π°ΡΠΈΡ ΡΠΈΡΡΠΎΠ²Π°Π½ ΡΠ΅ΠΊΡΡ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΡΡΠ°ΡΠ° Π΄Π²ΠΎΠΉΠΊΠ° ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ Π΄Π° ΠΌΠΎΠΆΠ΅ ΡΠΎΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠΈ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ°.
Π Π½ΡΠΊΠΎΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π΅Π½ΠΎ ΠΎΡΠ΅ Π΅Π΄Π½ΠΎ ΠΈΠ·ΡΠΈΡΠ°Π½Π΅ (KyberSlash2), ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠΎ Π²ΡΠ·Π½ΠΈΠΊΠ²Π° ΠΏΠΎΡΠ°Π΄ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΊΡΠ΅ΡΠ½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΏΡΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π Π°Π·Π»ΠΈΠΊΠΈΡΠ΅ ΠΎΡ ΠΏΡΡΠ²ΠΈΡ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ΅ ΡΠ²Π΅ΠΆΠ΄Π°Ρ Π΄ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ (Π² ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ poly_compress ΠΈ polyvec_compress), Π° Π½Π΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·ΡΠΈΡΡΠΎΠ²Π°Π½Π΅ΡΠΎ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π²ΡΠΎΡΠΈΡΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π·Π° Π°ΡΠ°ΠΊΠ° ΡΠ°ΠΌΠΎ Π² ΡΠ»ΡΡΠ°ΠΈΡΠ΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°ΡΠ° Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ ΠΈΠ·Ρ ΠΎΠ΄ΡΡ Π½Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½ΠΈΡ ΡΠ΅ΠΊΡΡ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»Π΅Π½.
Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡΡΠ° Π²Π΅ΡΠ΅ Π΅ ΠΎΡΡΡΡΠ°Π½Π΅Π½Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅:
- zig/lib/std/crypto/kyber_d00.zig (22 Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ),
- pq-crystals/kyber/ref (30 Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ),
- symbolicsoft/kyber-k2so (19 Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ),
- cloudflare/circl (8 ΡΠ½ΡΠ°ΡΠΈ),
- aws/aws-lc/crypto/kyber (4 ΡΠ½ΡΠ°ΡΠΈ),
- liboqs/src/kem/kyber (8 ΡΠ½ΡΠ°ΡΠΈ).
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ Π½Π΅ ΡΠ° ΠΏΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ΠΈ Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ:
- boringssl/crypto/kyber,
- filippo.io/mlkem768,
- formosa-crypto/libjade/tree/main/src/crypto_kem,
- kyber/common/amd64/avx2,
- formosa-crypto/libjade/tree/main/src/crypto_kem/kyber/common/amd64/ref,
- pq-crystals/kyber/avx2,
- pqclean/crypto_kem/kyber*/avx2.
Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡΡΠ°Π²Π° Π½Π΅ΠΈΠ·ΠΏΡΠ°Π²Π΅Π½Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅:
- antontutoveanu/crystals-kyber-javascript,
- Argyle-Software/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/crystals-go,
- mupq/pqm4/crypto_kem/kyber* (20 Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ ΡΠ°ΠΌΠΎ 1 Π²Π°ΡΠΈΠ°Π½Ρ ΠΎΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡΠ° Π΅ ΡΠΈΠΊΡΠΈΡΠ°Π½),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (20 Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ ΡΠ°ΠΌΠΎ 1 Π²Π°ΡΠΈΠ°Π½Ρ ΠΎΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡΠ° Π΅ ΡΠΈΠΊΡΠΈΡΠ°Π½),
- rustpq/pqcrypto/pqcrypto-kyber (5 ΡΠ½ΡΠ°ΡΠΈ ΠΏΠΎΠΏΡΠ°Π²ΠΊΠ°ΡΠ° Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π² libsignal, Π½ΠΎ Π² pqcrypto-kyber ΡΠ°ΠΌΠ°ΡΠ° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ ΡΠΈΠΊΡΠΈΡΠ°Π½Π°).
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
