CRYPTO.MN
Түлхүүр солилцоо

X25519

X25519 нь Curve25519-д суурилсан, хоёр талд аюулгүйгээр ижил нууц утга үүсгэх боломж олгодог хурдан, орчин үеийн Diffie–Hellman түлхүүр солилцооны алгоритм юм.

Стандарт
RFC 7748
Elliptic Curves for Security
Түлхүүрийн урт
32 byte

Чухал анхааруулга

X25519 нь хувийн түлхүүрийг дамжуулахгүйгээр shared secret үүсгэх боломж олгодог боловч дангаараа бүрэн хамгаалагдсан харилцаа үүсгэхгүй. - **Баталгаажуулалт шаардлагатай:** нийтийн түлхүүрийг хэн эзэмшиж байгааг баталгаажуулахгүй бол man-in-the-middle халдлагад өртөж болно. - **Shared secret-ийг шууд ашиглахгүй:** HKDF зэрэг түлхүүр гарган авах функцээр боловсруулна. - **Бага утгатай гаралтыг шалгах:** X25519 ажиллагааны гаралт бүхэлдээ тэг байвал протоколын түвшинд алдаа гэж үзэж, холболтыг зогсоох шаардлагатай. - **Хувийн түлхүүрийг хамгаалах:** хувийн түлхүүрийг лог, эх код эсвэл зөвшөөрөлгүй хадгалалтад оруулж болохгүй. - **Квантын эрсдэл:** хангалттай хүчин чадалтай квант компьютер Shor-ийн алгоритмыг хэрэгжүүлж чадвал X25519-ийн аюулгүй байдлын математик үндсийг эвдэх боломжтой. Иймээс X25519 нь пост-квант алгоритм биш.

Юу вэ?

X25519 нь Curve25519 эллиптик муруйн бүлэгт суурилсан, эллиптик муруйн Diffie–Hellman (ECDH) түлхүүр солилцооны алгоритмын тодорхойлолт юм. Үүнийг Daniel J. Bernstein зохион бүтээсэн Curve25519-ийн суурь дээр боловсруулсан.

X25519-ийн үндсэн зорилго нь хоёр тал хоорондоо хувийн түлхүүрээ дамжуулахгүйгээр ижил нийтлэг нууц утга (shared secret) тооцоолох боломж олгох явдал юм.

Харилцагч тал бүр өөрийн хувийн утгаас нийтийн түлхүүр үүсгэж, нийтийн түлхүүрээ нөгөө талд дамжуулна. Дараа нь өөрийн хувийн түлхүүр болон нөгөө талын нийтийн түлхүүрийг ашиглан ижил shared secret тооцоолно.

X25519 нь түлхүүр солилцооны алгоритм болохоос өгөгдлийг шууд шифрлэх алгоритм эсвэл тоон гарын үсгийн алгоритм биш. Үүссэн shared secret-ийг HKDF зэрэг түлхүүр гарган авах функцээр боловсруулж, AES-GCM эсвэл ChaCha20-Poly1305 зэрэг симметрик шифрлэлтийн түлхүүр үүсгэхэд ашиглаж болно.

X25519-ийн гол давуу тал нь хурд, 32 байтын нийтийн түлхүүрийн формат, хэрэгжүүлэхэд харьцангуй хялбар байдал болон тохиромжтой хэрэгжүүлэлт ашигласан үед хажуугийн сувгийн халдлагын эрсдэлийг бууруулах боломж юм.

Хэрхэн ажилладаг вэ?

X25519 нь хоёр талд ижил shared secret үүсгэх боломж олгодог математик үйлдэлд тулгуурладаг.

  1. Хувийн түлхүүр үүсгэх

    А болон Б тал тус бүр криптографийн зориулалттай санамсаргүй үүсгүүрээр 32 байтын хувийн түлхүүрийн утга үүсгэнэ. X25519 хэрэгжүүлэлт нь RFC 7748-д заасан scalar боловсруулах дүрмийг мөрдөнө.

  2. Нийтийн түлхүүр үүсгэх

    Тал бүр өөрийн хувийн түлхүүрээс нийтийн түлхүүр тооцоолно.

    - А тал: өөрийн хувийн түлхүүрээс Public Key A үүсгэнэ. - Б тал: өөрийн хувийн түлхүүрээс Public Key B үүсгэнэ.

  3. Нийтийн түлхүүр солилцох

    А болон Б тал зөвхөн нийтийн түлхүүрүүдээ солилцоно. Хувийн түлхүүрүүдийг хооронд нь дамжуулахгүй.

  4. Ижил нийтлэг нууц утга тооцоолох

    А тал өөрийн хувийн түлхүүр болон Б талын нийтийн түлхүүрийг ашиглана. Б тал мөн өөрийн хувийн түлхүүр болон А талын нийтийн түлхүүрийг ашиглана.

    Математикийн хувьд хоёр тал ижил shared secret-д хүрнэ:

    Shared Secret A = X25519(Private Key A, Public Key B)

    Shared Secret B = X25519(Private Key B, Public Key A)

    Зөв нийтийн түлхүүрүүд болон хүчинтэй хувийн түлхүүр ашигласан үед хоёр үр дүн ижил байна.

  5. Шифрлэлтийн түлхүүр гарган авах

    Shared secret-ийг шууд өгөгдөл шифрлэх түлхүүр болгон ашиглахын оронд HKDF зэрэг key derivation function-оор боловсруулж, шаардлагатай симметрик түлхүүрүүдийг гарган авна.

  6. Харилцагчийн жинхэнэ эсэхийг баталгаажуулах

    X25519 дангаараа нийтийн түлхүүрийн эзэмшигч хэн болохыг батлахгүй. Баталгаажуулалтгүй солилцоог халдагч өөрийн нийтийн түлхүүрээр зуучлан сольж, man-in-the-middle халдлага хийх боломжтой. Иймээс X25519-ийг TLS сертификат, тоон гарын үсэг эсвэл баталгаажуулалт бүхий протоколтой хамт ашиглах шаардлагатай.

Хаана ашиглагддаг вэ?

  • **TLS 1.3** TLS 1.3-ийн key share механизмд X25519-ийг түр зуурын түлхүүр солилцооны сонголтоор ашиглаж болно. Энэ нь клиент болон серверт холболтын нууц түлхүүрийг аюулгүй тохиролцоход тусалдаг. **Signal протокол** Signal-ийн түлхүүрийн тохиролцооны механизмд Curve25519/X25519 төрлийн түлхүүрийн солилцооны ажиллагаа ашиглагддаг. Энэ нь мессежийн шифрлэлтийн түлхүүр үүсгэхэд оролцдог. **SSH** SSH протоколд curve25519-sha256 зэрэг түлхүүр солилцооны аргууд бий. Эдгээр нь X25519-ийг ашиглан холболтын shared secret тооцоолох боломж олгодог. **WireGuard** WireGuard нь Curve25519-ийг түлхүүр солилцооны үндсэн криптографийн бүрэлдэхүүн болгон ашигладаг. **Орчин үеийн аюулгүй мессеж болон сүлжээний протоколууд** X25519-ийг түр зуурын түлхүүр солилцоонд ашиглан хоёр талд холболтод зориулсан нууц утга үүсгэх боломжтой. Протоколын бусад хэсэг нь баталгаажуулалт
  • түлхүүр гарган авалт болон өгөгдлийн шифрлэлтийг хариуцна.

Түгээмэл алдаа

  • - **X25519-ийг шууд шифрлэлтийн алгоритм гэж ойлгох:** X25519 нь shared secret үүсгэх түлхүүр солилцооны алгоритм.
  • - **Нийтийн түлхүүрийг баталгаажуулахгүй байх:** ингэснээр халдагч түлхүүр солилцоог зуучлах эрсдэлтэй.
  • - **Shared secret-ийг шууд AES түлхүүр болгох:** оронд нь HKDF зэрэг зориулалтын key derivation function ашиглана.
  • - **Хувийн түлхүүрийг дахин ашиглах бодлогогүй байх:** түр зуурын түлхүүр ашиглах эсэх болон түлхүүрийн амьдралын хугацааг протоколын шаардлагаар шийдэх хэрэгтэй.
  • - **Тэг shared secret-ийг зөвшөөрөх:** үр дүн бүхэлдээ тэг байвал аюулгүй байдлын шаардлагын дагуу алдаа болгон боловсруулна.
  • - **Nonce болон tag-ийг X25519-ийн параметр гэж үзэх:** эдгээр нь дараагийн AEAD алгоритмын параметрүүд юм.
  • - **Пост-квант аюулгүй гэж үзэх:** X25519 нь сонгодог компьютерт зориулсан криптографийн арга юм.

Жишээ код

JavaScript
import { generateKeyPairSync, diffieHellman, hkdfSync } from "node:crypto";

// А талын түлхүүрийн хос
const alice = generateKeyPairSync("x25519");

// Б талын түлхүүрийн хос
const bob = generateKeyPairSync("x25519");

// Нийтийн түлхүүрүүдийг солилцсон гэж үзнэ
const secretAlice = diffieHellman({
  privateKey: alice.privateKey,
  publicKey: bob.publicKey,
});

const secretBob = diffieHellman({
  privateKey: bob.privateKey,
  publicKey: alice.publicKey,
});

// Хоёр тал ижил shared secret үүсгэнэ
console.log("Secrets match:", secretAlice.equals(secretBob));

// Shared secret-ээс зориулалтын түлхүүр гарган авах
const salt = Buffer.alloc(32, 0); // Зөвхөн сургалтын жишээ
const info = Buffer.from("example-x25519-key");

const keyAlice = Buffer.from(
  hkdfSync("sha256", secretAlice, salt, info, 32)
);

const keyBob = Buffer.from(
  hkdfSync("sha256", secretBob, salt, info, 32)
);

console.log("Derived keys match:", keyAlice.equals(keyBob));