CRYPTOGRAPHY
AEAD

AES-GCM

Нэгэн зэрэг шифрлэлт болон бүрэн бүтэн байдал хангадаг горим.

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

Нэг л key-ээр nonce-ийг хэзээ ч давтаж ашиглаж болохгүй (never reuse a nonce with the same key). Давтвал confidentiality бүрэн эвдэрч, хоёр ciphertext-ийг XOR хийж plaintext-ийн мэдээлэл гаргаж авах боломжтой болохоос гадна GHASH-ийн authentication key сэргээгдэж бүх ирээдүйн зурвасыг хуурамчаар баталгаажуулах эрсдэлтэй.

Юу вэ?

AES блок шифрийг Galois/Counter Mode-той хослуулсан authenticated encryption (AEAD) горим — өгөгдлийг зөвхөн шифрлэхээс гадна өөрчлөгдөөгүй эсэхийг баталгаажуулдаг.

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

AES-ийг CTR горимоор ажиллуулан шифрлэлт хийхийн зэрэгцээ GHASH функцээр authentication tag тооцоолж, нэг өнгөрөлтөд хоёуланг гүйцэтгэнэ.

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

  • TLS 1.2/1.3-ийн стандарт cipher suite
  • SSH
  • Дискний шифрлэлт

Техникийн үзүүлэлт

Түлхүүрийн урт
128 эсвэл 256 bit
Nonce-ийн урт
96 bit (12 byte) — стандарт хэмжээ; санамсаргүй эсвэл тоолуур (counter) байж болно
Баталгаажуулах tag-ийн урт
128 bit (16 byte) — баталгаажуулалтын тэмдэг (authentication tag)

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

  • Нэг key-ээр nonce-ийг давтах — ялангуяа санамсаргүй 96-bit nonce-ийг нэг key дор хэт олон удаа (~2^32 орчим) үүсгэх нь давхцлын магадлалыг (birthday bound) эрсдэлтэй түвшинд хүргэдэг
  • Authentication tag-ийг бүрэн шалгахаас өмнө тайлагдсан (decrypt хийсэн) өгөгдлийг ашиглах эсвэл хэрэглэгчид харуулах
  • Ciphertext-ийн хамт nonce-ийг хадгалахгүй орхих — decrypt хийхэд яг тэр nonce давхар шаардлагатай
  • Нэг key-ээр хэт их хэмжээний өгөгдөл шифрлэж, key rotation хийхгүй удаан ашиглах

Жишээ код

// Node.js — AES-256-GCM: nonce (IV) бүрийг ЗААВАЛ шинээр, санамсаргүй үүсгэнэ
import { randomBytes, createCipheriv, createDecipheriv } from "node:crypto";

const key = randomBytes(32);       // 256-bit key
const nonce = randomBytes(12);     // 96-bit nonce — key бүрд ДАХИН АШИГЛАХГҮЙ

const cipher = createCipheriv("aes-256-gcm", key, nonce);
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
const authTag = cipher.getAuthTag();  // 128-bit tag — nonce-тэй хамт дамжуулна

// Тайлахдаа яг тэр nonce, authTag-аа дамжуулж, tag шалгалт амжилтгүй бол
// decipher.final() throw хийнэ — гаралтыг ашиглахаас өмнө энэ алдааг барина.
const decipher = createDecipheriv("aes-256-gcm", key, nonce);
decipher.setAuthTag(authTag);
const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);

Эх сурвалж

Стандарт: NIST SP 800-38D