Định dạng dây tink

Trang này mô tả định dạng dây của Tink cho khoá và đầu ra gốc. Tài liệu này dành cho các nhà mật mã học muốn thêm ngôn ngữ khác vào Tink và những người duy trì các thư viện mật mã cấp cao khác muốn có chế độ tương thích với dây. Nội dung này không dành cho người xem thuộc mọi lứa tuổi.

Tuần tự hoá bộ khoá

Tink sử dụng Google protobuf để chuyển đổi tuần tự các tập hợp khoá.

  • Tập hợp khoá tuần tự nhị phân là một nguyên mẫu Tập hợp khoá tuần tự được xác định trong tink.proto. Thuộc tính giá trị KeyData của một khoá là một proto đã chuyển đổi tuần tự của loại khoá tương ứng.
  • Tập hợp khoá được chuyển đổi tuần tự JSON là một tệp proto của Tập hợp khoá được chuyển đổi tuần tự ở định dạng JSON. Lưu ý rằng giá trị KeyData vẫn là một proto tuần tự tệp nhị phân.
  • Một tập hợp khoá đã mã hoá là một proto EncryptedKeyset được chuyển đổi tuần tự được xác định trong tink.proto. Tệp này chứa một tập hợp khoá tuần tự nhị phân đã mã hoá và một số siêu dữ liệu KeysetInfo không mã hoá (không bắt buộc).

Tiền tố đầu ra Tink

Hầu hết các nguyên hàm Tink đều hỗ trợ tiền tố đầu ra 5 byte bao gồm:

  • Phiên bản 1 byte: 0x01
  • Gợi ý khoá 4 byte: Đây là mã khoá của khoá được sử dụng.

Một số khoá cũ cũng có thể hỗ trợ byte phiên bản 0x00.

Xin lưu ý rằng tiền tố này không được xác thực và không thể dựa vào tiền tố này cho mục đích bảo mật. Tink sử dụng thông tin này làm gợi ý để tăng tốc độ giải mã hoặc xác minh.

AEAD

Nhìn chung, Tink định dạng văn bản đã mã hoá AEAD như sau:

prefix || IV || ciphertext || tag

trừ phi có quy định khác trong RFC tương ứng. prefix trống hoặc là tiền tố đầu ra Tink 5 byte.

AES-CTR-HMAC

Đối với AES-CTR-HMAC, Tink tính toán MAC bằng dữ liệu liên kết (AD) như sau:

AD || IV || ciphertext || bitlen(AD)

trong đó bitlen(AD) là độ dài của AD tính bằng bit, được biểu diễn dưới dạng số nguyên 64 bit big-endian chưa ký. Lược đồ HMAC này tuân theo bản nháp cho AES-CBC-HMAC của Mcgrew.

AEAD tất định

Tink triển khai RFC 5297 cho AES-SIV, đặt vectơ khởi tạo tổng hợp (SIV) ở đầu văn bản đã mã hoá. Kiểu gốc có thể thêm tiền tố đầu ra Tink 5 byte.

Mặc dù RFC 5297 hỗ trợ danh sách dữ liệu được liên kết, nhưng Tink chỉ hỗ trợ chính xác một dữ liệu được liên kết, tương ứng với danh sách có một phần tử trong RFC 5297. Dữ liệu liên kết trống là một danh sách có một phần tử trống chứ không phải một danh sách trống.

Truyền trực tuyến AEAD

Xem AES-CTR HMACAES-GCM-HKDF.

Mã hoá phong bì

Mã hoá phong bì mã hoá dữ liệu bằng khoá mã hoá dữ liệu DEK bằng các phương thức gốc AEAD của Tink. Phương thức mã hoá hoạt động như sau:

  • Hệ thống sẽ tạo một DEK mới bằng cách sử dụng một mẫu khoá (hoặc tham số khoá) nhất định.
  • DEK được chuyển đổi tuần tự thành một chuỗi byte. Định dạng chuyển đổi tuần tự của vùng đệm giao thức chuyển đổi tuần tự loại khoá proto. Ví dụ: đây là thông báo vùng đệm giao thức AesGcmKey được chuyển đổi tuần tự được xác định trong aes_gcm.proto cho DEK thuộc loại khoá AES GCM. Hãy xem phần tuần tự hoá vùng đệm giao thức để biết cách tuần tự hoá vùng đệm giao thức.
  • DEK đã chuyển đổi tuần tự được nhà cung cấp bên ngoài (ví dụ: GCP) mã hoá thành encrypted DEK.
  • DEK được dùng để mã hoá văn bản thô bằng dữ liệu được liên kết vào ciphertext. Vì vậy, ciphertext có định dạng giống hệt với nguyên hàm AEAD tương ứng với DEK.

Định dạng đầu ra của tính năng mã hoá phong bì như sau:

encrypted DEK length || encrypted DEK || ciphertext

encrypted DEK length có kích thước 4 byte, lưu trữ độ dài của encrypted DEK dưới dạng số nguyên big-endian 32 bit.

MAC

Tink tuân theo các RFC tương ứng. Các dữ liệu gốc có thể thêm tiền tố đầu ra Tink 5 byte vào thẻ.

Tập hợp PRF

Tink tuân theo các RFC tương ứng. Lưu ý rằng đối với Tập hợp PRF, loại khoá khác với loại khoá MAC của cùng một thuật toán do không bao gồm độ dài đầu ra. Khoá đặt PRF không bao giờ thêm tiền tố đầu ra Tink. Điều này đảm bảo rằng kết quả thực sự là một PRF.

Mã hoá kết hợp

Định dạng dây chung cho phương thức mã hoá kết hợp Tink như sau:

prefix || encapsulated_key || encrypted_data

prefix trống hoặc là tiền tố đầu ra Tink 5 byte. Mỗi loại khoá chứa thông tin về số byte cần phân tích cú pháp và cách phân tích cú pháp các byte đó từ encapsulated_key.

HPKE (Mã hoá khoá công khai kết hợp)

Tink tuân theo tiêu chuẩn HPKE được xác định trong RFC 9180. Một bộ mật mã HPKE bao gồm 3 hàm gốc sau.

  • Cơ chế đóng gói khoá (KEM)
  • Hàm dẫn xuất khoá (KDF)
  • Mã hoá đã xác thực với dữ liệu liên kết (AEAD)

Tiêu chuẩn HPKE không xác định định dạng dây chung trong RFC 9180, Phần 10. Việc triển khai HPKE của Tink sử dụng các giá trị encapsulated_keyencrypted_data sau.

  • encapsulated_key
    • Khoá công khai đã chuyển đổi tuần tự của người gửi
    • Được xác định là enc trong RFC 9180, Phần 4.1
    • Định dạng do KEM HPKE cụ thể sử dụng xác định
  • encrypted_data
    • Văn bản đã mã hoá và thẻ (tức là ciphertext || tag không có IV)
    • Được xác định là ct trong RFC 9180, Mục 4
    • Định dạng do AEAD HPKE cụ thể sử dụng xác định
KEM dựa trên Diffie-Hellman X25519

Đối với DHKEM X25519, giá trị enc là khoá công khai Diffie-Hellman 32 byte của người gửi.

ECIES-AEAD-HKDF

Đối với việc triển khai ECIES-AEAD-HKDF của Tink, encapsulated_key là đầu ra của Cơ chế đóng gói khoá (KEM) và encrypted_data là đầu ra của Cơ chế đóng gói dữ liệu (DEM).

KEM

Tuỳ thuộc vào loại khoá, Tink sử dụng các điểm trên đường cong elip được nén và không nén, tuân theo các tiêu chuẩn mã hoá RFC 8422/ANSI.X9-62.2005. Đối với các điểm không nén, 0x04 byte theo sau là x và toạ độ y dưới dạng số nguyên có kích thước cố định. Đối với toạ độ nén, byte 0x02 hoặc 0x03 và toạ độ x dưới dạng số nguyên có kích thước cố định được sử dụng. Đối với X25519, định nghĩa RFC 7748 được sử dụng (toạ độ x dưới dạng số nguyên có kích thước cố định).

DEM

Đối với encrypted_data, Tink sử dụng định dạng giống như AEAD. Điều này bao gồm việc chỉ định một IV.

Trích xuất khoá

Trước tiên, hệ thống sẽ tính toán toạ độ x x_ss của điểm được chia sẻ. Sau đó, khoá cho AEAD được đặt thành:

HKDF(ikm = encapsulated_key || x_ss, salt = salt_of_key, info = context_info, length = dem_key_size)

trong đó encapsulated_key là đầu ra KEM đầy đủ dưới dạng byte.

Chữ ký số

Tink tuân theo các RFC tương ứng. Các dữ liệu gốc có thể thêm tiền tố đầu ra Tink 5 byte vào thẻ được tạo.

ECDSA

Tuỳ thuộc vào trường EcdsaSignatureEncoding trong khoá, định dạng của chữ ký ECDSA là IEEE P1363 hoặc ASN.1 DER.

Định dạng của chữ ký IEEE P1363r || s, trong đó rs được thêm số 0 vào cuối và có cùng kích thước tính bằng byte với thứ tự của đường cong. Ví dụ: đối với đường cong NIST P-256, rs được thêm 0 vào để có kích thước 32 byte.

Chữ ký DER được mã hoá bằng ASN.1:

ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }

Cụ thể, mã hoá là:

0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s

Tink tuân theo các phương pháp hay nhất để xác minh chữ ký, bằng cách chỉ chấp nhận chữ ký ECDSA được mã hoá DER (chữ ký được mã hoá BER thay thế là không hợp lệ).

Điều này giúp ngăn chặn các cuộc tấn công bằng chữ ký dễ bị thay đổi, thường ảnh hưởng đến các hệ thống tiền mã hoá.