ΠΡΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ Π·Π° ΡΠΈΡΡΠΈΡΠ°ΡΠ΅ Kyber, ΠΊΠΎΡ ΠΏΠΎΠ±Π΅Π΄ΠΈ Π²ΠΎ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΡΠ° Π½Π° ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ ΠΎΡΠΏΠΎΡΠ½ΠΈ Π½Π° Π±ΡΡΡΠ°Π»Π½Π° ΡΠΈΠ»Π° Π½Π° ΠΊΠ²Π°Π½ΡΠ΅Π½ ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ, Π±Π΅ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΡΠ²Π°Π½Π° ΡΠ°Π½Π»ΠΈΠ²ΠΎΡΡ ΡΡΠΎ ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π½Π° Π½Π°ΠΏΠ°Π΄ΠΈΡΠ΅ ΠΎΠ΄ ΡΡΡΠ°Π½ΠΈΡΠ½ΠΈΡΠ΅ ΠΊΠ°Π½Π°Π»ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π°Ρ ΡΠ°ΡΠ½ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΌΠ΅ΡΠ΅ΡΠ΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π΄Π΅ΡΠΈΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΈΡΡΠΈΡΠ°Π½ ΡΠ΅ΠΊΡΡ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½Π°ΠΏΠ°ΡΠ°ΡΠΎΡ. ΠΡΠΎΠ±Π»Π΅ΠΌΠΎΡ Π²Π»ΠΈΡΠ°Π΅ ΠΈ Π½Π° ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½Π°ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΡ Π·Π° Π΅Π½ΠΊΠ°ΠΏΡΡΠ»Π°ΡΠΈΡΠ° Π½Π° ΠΊΠ»ΡΡΠ΅Π²ΠΈ CRYSTALS-Kyber KEM ΠΈ Π½Π° ΠΌΠ½ΠΎΠ³Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΡΠΈΡΡΠΈΡΠ°ΡΠ΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ΠΈ ΠΎΠ΄ ΡΡΠ΅ΡΠΈ ΡΡΡΠ°Π½ΠΈ Π½Π° Kyber, Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΡΠΈ ΡΠ° ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° pqcrypto ΡΡΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π²ΠΎ ΠΌΠ΅ΡΠΈΠ½ΡΠ΅ΡΠΎΡ Signal.
Π‘ΡΡΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π½Π»ΠΈΠ²ΠΎΡΡΠ°, ΠΊΠΎΡΠ° Π³ΠΎ Π΄ΠΎΠ±ΠΈ ΠΊΠΎΠ΄Π½ΠΎΡΠΎ ΠΈΠΌΠ΅ KyberSlash, Π΅ Π²ΠΎ ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠ°ΡΠ° Π·Π° ΠΏΠΎΠ΄Π΅Π»Π±Π° βt = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;β Π²ΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΡΠ°ΠΊΠ° , Π²ΠΎ ΠΊΠΎΡΠ° Π΄ΠΈΠ²ΠΈΠ΄Π΅Π½Π΄Π°ΡΠ° ΡΠ° ΡΠΎΠ΄ΡΠΆΠΈ ΡΠ°ΡΠ½Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ βtβ ΡΠΎ ΡΠΈΠΏ βdoubleβ, Π° Π΄Π΅Π»ΠΈΡΠ΅Π» Π΅ Π΄ΠΎΠ±ΡΠΎ ΠΏΠΎΠ·Π½Π°ΡΠ°ΡΠ° ΡΠ°Π²Π½Π° Π²ΡΠ΅Π΄Π½ΠΎΡΡ KYBER_Q. ΠΡΠΎΠ±Π»Π΅ΠΌΠΎΡ Π΅ ΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠ°ΡΠ° Π·Π° ΠΏΠΎΠ΄Π΅Π»Π±Π° Π½Π΅ Π΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎ, Π° Π²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ΅Π΄ΠΈΠ½ΠΈ Π±ΡΠΎΡΠΎΡ Π½Π° ΡΠΈΠΊΠ»ΡΡΠΈ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΎΡ ΡΡΠΎ ΡΠ΅ Π²ΡΡΠ°Ρ Π·Π° ΠΏΠΎΠ΄Π΅Π»Π±Π° Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ Π²Π»Π΅Π·Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. Π’Π°ΠΊΠ°, Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΡΠ°Π±ΠΎΡΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ ΠΈΠ΄Π΅ΡΠ° Π·Π° ΠΏΡΠΈΡΠΎΠ΄Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΡΡΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΏΡΠΈ ΠΏΠΎΠ΄Π΅Π»Π±Π°ΡΠ°.
ΠΠ°Π½ΠΈΠ΅Π» Π. ΠΠΎ Π΄Π²Π° ΠΎΠ΄ ΡΡΠΈΡΠ΅ ΡΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ, ΠΏΡΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ Π½Π° ΠΏΠ»ΠΎΡΠΊΠ°ΡΠ° 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 Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ),
- simbolicsoft/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-ΠΊΡΠΈΡΡΠ°Π»ΠΈ/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 (ΠΏΠΎΠΏΡΠ°Π²ΠΊΠ° Π±Π΅ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅Π½Π° Π½Π° libsignal Π½Π° 5 ΡΠ°Π½ΡΠ°ΡΠΈ, Π½ΠΎ ΡΠ°Π½Π»ΠΈΠ²ΠΎΡΡΠ° ΡΓ¨ ΡΡΡΠ΅ Π½Π΅ Π΅ ΠΏΠΎΠΏΡΠ°Π²Π΅Π½Π° Π²ΠΎ ΡΠ°ΠΌΠΈΠΎΡ pqcrypto-kyber).
ΠΠ·Π²ΠΎΡ: opennet.ru