Lỗ hổng trong việc triển khai thuật toán mã hóa hậu lượng tử Kyber

Trong quá trình triển khai thuật toán mã hóa Kyber, thuật toán đã giành chiến thắng trong cuộc cạnh tranh về các thuật toán mã hóa chống lại lực lượng vũ phu trên máy tính lượng tử, một lỗ hổng đã được xác định cho phép các cuộc tấn công kênh bên tạo lại các khóa bí mật dựa trên việc đo thời gian hoạt động trong quá trình giải mã của bản mã do kẻ tấn công cung cấp. Sự cố này ảnh hưởng đến cả việc triển khai tham chiếu cơ chế đóng gói khóa CRYSTALS-Kyber KEM và nhiều thư viện mã hóa hỗ trợ Kyber của bên thứ ba, bao gồm thư viện pqcrypto được sử dụng trong Signal Messenger.

Bản chất của lỗ hổng có tên mã KyberSlash là việc sử dụng phép chia “t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;” trong quá trình giải mã tin nhắn , trong đó số bị chia chứa giá trị bí mật “t” với loại “double” và ước số là giá trị công khai nổi tiếng KYBER_Q. Vấn đề là thời gian của thao tác chia không phải là hằng số và trong các môi trường khác nhau, số chu kỳ CPU được thực hiện để chia phụ thuộc vào dữ liệu đầu vào. Như vậy, dựa trên những thay đổi về thời gian thực hiện, người ta có thể hình dung được bản chất của dữ liệu dùng trong phép chia.

Daniel J. Bernstein, một chuyên gia nổi tiếng trong lĩnh vực mật mã, đã có thể chuẩn bị một minh chứng thực tế để chứng minh rằng cuộc tấn công có thể được thực hiện trong thực tế. Ở hai trong ba thử nghiệm được tiến hành, khi chạy mã trên bo mạch Raspberry Pi 2, có thể tạo lại hoàn toàn khóa riêng Kyber-512 dựa trên việc đo thời gian giải mã dữ liệu. Phương pháp này cũng có thể được điều chỉnh cho phù hợp với khóa Kyber-768 và Kyber-1024. Để thực hiện thành công một cuộc tấn công, điều cần thiết là văn bản mật mã do kẻ tấn công chỉ định phải được xử lý bằng cách sử dụng cùng một cặp khóa và thời gian thực hiện của hoạt động có thể được đo chính xác.

Một rò rỉ khác (KyberSlash2) đã được xác định trong một số thư viện, điều này cũng xảy ra do sử dụng giá trị bí mật khi thực hiện phép chia. Sự khác biệt so với tùy chọn đầu tiên nằm ở lệnh gọi ở giai đoạn mã hóa (trong hàm poly_compress và polyvec_compress) chứ không phải trong quá trình giải mã. Tuy nhiên, tùy chọn thứ hai có thể hữu ích cho một cuộc tấn công chỉ trong trường hợp thủ tục này được sử dụng trong các hoạt động mã hóa lại trong đó đầu ra của bản mã được coi là bí mật.

Lỗ hổng đã được sửa trong thư viện:

  • zig/lib/std/crypto/kyber_d00.zig (22/XNUMX),
  • pq-crystals/kyber/ref (30/XNUMX),
  • tượng trưngsoft/kyber-k2so (19 tháng XNUMX),
  • cloudflare/circle (8 tháng XNUMX),
  • aws/aws-lc/crypto/kyber (ngày 4 tháng XNUMX),
  • liboqs/src/kem/kyber (8 tháng XNUMX).

Các thư viện ban đầu không bị ảnh hưởng bởi lỗ hổng bảo mật:

  • nhàm chán/tiền điện tử/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,
  • tinh thể pq/kyber/avx2,
  • pqclean/crypto_kem/kyber*/avx2.

Lỗ hổng vẫn chưa được vá trong các thư viện:

  • antontutoveanu/crystals-kyber-javascript,
  • Argyle-Phần mềm/kyber,
  • debian/src/liboqs/không ổn định/src/kem/kyber,
  • kudelskisecurity/crystals-go,
  • mupq/pqm4/crypto_kem/kyber* (Vào ngày 20 tháng 1, chỉ có XNUMX phiên bản của lỗ hổng được sửa),
  • PQClean/PQClean/crypto_kem/kyber*/aarch64,
  • PQClean/PQClean/crypto_kem/kyber*/clean,
  • Randombit/botan (Vào ngày 20 tháng 1, chỉ có XNUMX lỗ hổng được sửa),
  • Rustpq/pqcrypto/pqcrypto-kyber (bản sửa lỗi đã được thêm vào libsignal vào ngày 5 tháng XNUMX, nhưng lỗ hổng bảo mật vẫn chưa được sửa trong chính pqcrypto-kyber).

Nguồn: opennet.ru

Thêm một lời nhận xét