0

GHASH

Video và bài đọc tham khảo:

I. Khái niệm

  • GHASH là một hàm băm tuyến tính trên trường hữu hạn GF(2^128).
  • Được dùng trong AES-GCM, một chuẩn mã hóa hiện đại vừa cung cấp bảo mật dữ liệu, vừa đảm bảo tính toàn vẹn dữ liệu (tính xác thực).
  • GHASH nhận đầu vào là các khối dữ liệu và một khóa phụ (hash subkey), sau đó thực hiện phép nhân đa thức trong GF(2^128) để tạo ra xác thực (tag).

Trường hữu hạn

Trước hết, tôi sẽ giải thích một cách cơ bản về trường hữu hạn theo cách mà tôi hiểu. Để có thể thuận tiện hơn thì tôi đã thu nhỏ phạm vi lại.

Xét trường hữu hạn GF(2^8).

Hãy tưởng tượng ta có một hộp đồ chưa chỉ chứa 2 loại viên gạch để sắp xếp

  • Gạch đen = 0
  • Gạch trắng = 1

=> Ta sắp xếp thành một hàng dài các viên gạch (1 bytes). Và dựa theo cách sắp xếp thứ tự của các viên gạch màu đen và trắng thì ta sẽ được một giá trị bất kì, chính là một số trong GF(2^256).

Vậy nghĩa là ta sẽ có 2^8 giá trị khi sắp xếp các viên gạch => GF(2^8) có đúng 256 giá trị

Luật cộng trong GF

Theo XOR:

1 + 1 = 0
1 + 0 (0 + 1) = 1
0 + 0 = 0

Luật nhân trong GF

Khi làm phép nhân thì sẽ hơi phức tạp hơn một chút

  • Ta xe chuỗi 8 viên gạch như là một đa thức VD: 1010 1100 = x^8 + x^6 + x^4 + x ^ 3
  • Sau khi nhân xong, ta sẽ chia cho một đa thức đặc biệt (gọi là đa thức bất khả quy) để kết quả vẫn nằm trong 256 giá trị của GF(2^8)

II. Cách GHASH hoạt động

Chuẩn bị viên gạch đặc biệt H

  • H được tạo bằng cách chạy AES với một khối toàn số 0.
  • Ta có thể coi H như một “viên gạch phép thuật” để nhân với dữ liệu.

Dữ liệu đầu vào

  • Bao gồm bản mã (ciphertext) và dữ liệu bổ sung (AAD – Additional Authenticated Data).
  • Chia thành từng khối 128-bit (chuỗi 128 gạch đen trắng).

Phép nhân trong GF(2^128)

  • GHASH lấy từng khối dữ liệu, nhân với H theo luật trong GF(2^128).
  • Sau đó cộng dồn tất cả lại (theo luật cộng mod 2).
Kết quả cuối cùng ta được một chuỗi 128-bit, gọi là tag. Tag này đi kèm với
dữ liệu để người nhận kiểm tra xem dữ liệu có bị thay đổi không.

Nếu các bạn xem các video mà tôi để ở đầu bài viết này, có thể nhận ra một điều là các khối block ciphertext (dữ liệu đã được mã hóa) nối liền với nhau bao gồm cả AAD. Block cipher này làm đầu vào cho phép nhân của block cipher tiếp theo do đó đảm bảo tính liên kết chặt chẽ.

Chỉ cần ta sửa bất kì giá trị một bit ở block cipher nào thì nó sẽ dẫn đến kết quả tính toán cuối cùng, giá trị của Tag sẽ khác đi. Tôi sẽ lấy một ví dụ để cho bạn hình dung cơ chế này rõ hơn


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.