Định dạng dây tink

Trang này mô tả định dạng có dây của Tink dành cho các 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 các ngôn ngữ bổ sung vào Tink và trình bảo trì các thư viện mã hoá 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 khán giả nói chung.

Chuyển đổi tuần tự tập hợp khoá

Tink sử dụng Google protobuf để chuyển đổi tuần tự các bộ khoá của mình.

  • Tập hợp khoá chuyển đổi tuần tự nhị phân là một proto Tập hợp khoá được tuần tự hoá được xác định trong tink.proto. Thuộc tính giá trị KeyData của một khoá là một proto được chuyển đổi tuần tự của loại khoá tương ứng.
  • Tập hợp khoá được tuần tự JSON là một 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 tệp nhị phân được chuyển đổi tuần tự.
  • Tập hợp khoá đã mã hoá là một proto EncryptedKeyst đượ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á chuyển đổi tuần tự nhị phân được mã hoá và một số siêu dữ liệu KeysetInfo chưa mã hoá (không bắt buộc).

Tiền tố đầu ra Tink

Hầu hết các dữ liệu gốc 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ã nhận dạng 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.

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

AEAD (mã xác thực điện tử)

Nói chung, Tink định dạng văn bản mật mã AEAD như sau:

prefix || IV || ciphertext || tag

trừ phi có quy định khác trong RFC tương ứng. prefix trống hoặc 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 quan (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 thị dưới dạng số nguyên chưa ký lớn 64 bit. Lược đồ HMAC này tuân theo bản nháp dành cho AES-CBC-HMAC từ Mcgrew.

AEAD xác định

Tink triển khai RFC 5297 cho AES-SIV, đặt vectơ khởi tạo tổng hợp (SIV) ở đầu bản mật mã. Dữ liệ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 liên quan, nhưng Tink chỉ hỗ trợ đúng một dữ liệu liên quan, 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à danh sách có một phần tử trống chứ không phải là danh sách trống.

Phát trực tuyến AEAD

Xem AES-CTR HMACAES-GCM-HKDF.

Mã hoá phong bì

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

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

Định dạng đầu ra của lớp 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 lớn cuối 32 bit.

Địa chỉ MAC

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

Bộ PRF

Tink tuân theo các RFC tương ứng. Xin 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 thuật toán vì không bao gồm độ dài dữ liệu đầu ra. Khoá PRF Set không bao giờ thêm tiền tố đầu ra Tink. Điều này đảm bảo đầu ra thực sự là một PRF.

Mã hoá kết hợp

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

prefix || encapsulated_key || encrypted_data

prefix trống hoặc tiền tố đầu ra Tink 5 byte. Mỗi loại khoá chứa thông tin về số lượng 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. Bộ mật mã HPKE bao gồm ba dữ liệu gốc sau đây.

  • Cơ chế đóng gói khoá (KEM)
  • Hàm dẫn xuất chính (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, Mục 10. Cách triển khai HPKE của Tink sử dụng các giá trị encapsulated_keyencrypted_data sau.

  • encapsulated_key
    • Khoá công khai được 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 được xác định theo HPKE KEM cụ thể được sử dụng
  • encrypted_data
    • Văn bản mật mã và thẻ (ví dụ: ciphertext || tag không có IV)
    • Được xác định là ct trong RFC 9180, Phần 4
    • Định dạng được xác định theo AEAD cụ thể của HPKE được sử dụng
X25519 KEM dựa trên Diffie-Hellman

Đố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 hoạt động 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 (KEM)

Tuỳ thuộc vào loại phím, Tink sử dụng các điểm đường cong elip nén và không né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, byte 0x04 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 làm số nguyên kích thước cố định sẽ được sử dụng. Đối với X25519, định nghĩa RFC 7748 được sử dụng (tọa độ x dưới dạng số nguyên kích thước cố định).

DEM

Đối với encrypted_data, Tink sử dụng định dạng giống với AEAD. Quá trình này bao gồm việc chỉ định IV.

Dẫn xuất chính

Trước tiên, toạ độ x x_ss của điểm chung sẽ được tính toán. 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. Primitives 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 sẽ là IEEE P1363 hoặc ASN.1 DER.

Định dạng của chữ ký IEEE P1363r || s, trong đó rs không có khoảng đệm 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 không có khoảng đệm là 32 byte.

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

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

Cụ thể, phương thức 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á bằng DER (các chữ ký được mã hoá BER thay thế không hợp lệ).

Điều này giúp ngăn chặn các cuộc tấn công về tính linh hoạt của chữ ký, thường ảnh hưởng đến các hệ thống tiền mã hoá.