Định dạng dây tink

Trang này mô tả định dạng dây của Tink cho các khoá và dữ liệu đầu ra cơ bản. Chiến lược phát hành đĩa đơn Tài liệu này nhắm đến những nhà mật mã học muốn thêm các ngôn ngữ khác vào Dịch vụ cập nhật và bảo trì các thư viện mật mã cấp cao khác muốn có dây chế độ tương thích. Video này không dành cho mọi đối tượng người dùng.

Chuyển đổi tuần tự tập hợp phím

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

  • Một bộ khoá nhị phân được chuyển đổi tuần tự là một proto của Bộ khoá được chuyển đổi 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 khoá chuyển đổi tuần tự proto của kiểu khoá tương ứng.
  • Tập hợp khoá được chuyển đổi tuần tự JSON là một Bộ 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 chuyển đổi tuần tự nhị phân.
  • Bộ khoá được 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á được chuyển đổi tuần tự nhị phân đã mã hoá và một số siêu dữ liệu KeysetInfo không mã hoá.

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 ý về 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.

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

AEAD

Nói chung, Tink định dạng thuật toán mật mã AEAD là:

prefix || IV || ciphertext || tag

trừ khi 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 với 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 thị dưới dạng lớn-end 64 bit số nguyên chưa ký. Sơ đồ HMAC này tuân theo bản nháp dành cho AES-CBC-HMAC của Mcgrew.

AEAD xác định

Tink triển khai RFC 5297 cho AES-SIV, đưa mã tổng hợp vectơ khởi tạo (SIV) ở đầu bản 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 các 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à danh sách có một phần tử trống chứ không phải một phần tử trống danh sách.

Truyền trực tuyến AEAD

Xem HMAC AES-CTRAES-GCM-HKDF.

Mã hoá phong bì

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

  • Một DEK mới sẽ được tạo bằng một mẫu khoá (hoặc tham số chính) 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ự chuyển đổi tuần tự vùng đệm giao thức của proto loại khoá. Ví dụ: đây là một 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 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 được chuyển đổi tuần tự được mã hoá bởi một nhà cung cấp bên ngoài (ví dụ: GCP), thành encrypted DEK.
  • DEK dùng để mã hoá văn bản thuần tuý cùng dữ liệu liên quan thành ciphertext Vì vậy, ciphertext có định dạng giống hệt như dữ liệu gốc AEAD tương ứng với DEK.

Định dạng đầu ra của phương thức mã hoá phong bì như sau:

encrypted DEK length || encrypted DEK || ciphertext

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

MAC

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

Bộ PRF

Tink tuân theo các RFC tương ứng. Lưu ý: Đối với PRF, hãy đặt loại khoá sẽ khác từ loại khoá MAC của cùng thuật toán bằng cách không đưa vào độ dài đầu ra. Các khoá Đặt PRF không bao giờ thêm tiền tố đầu ra là Tink. Điều này đảm bảo dữ liệu đầu ra thực sự PRF.

Mã hoá kết hợp

Sau đây là định dạng dây chung cho tính năng mã hoá kết hợp của Tink:

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 những byte đó 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 ba dữ liệu nguyên gốc sau.

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

Tiêu chuẩn HPKE không xác định định dạng dây chung trong mục RFC 9180, Mục 10. Quy trình triển khai HPKE của Tink sử dụng các Các giá trị encapsulated_keyencrypted_data.

  • 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, Mục 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 HPKE AEAD cụ thể được sử dụng
X25519 KEM dựa trên Diffie-Hellman

Đối với X25519 DHKEM, giá trị enc là giá trị 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à kết quả của Cơ chế đóng gói chính (KEM) và encrypted_data là dữ liệu đầ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 đường cong elip được nén và không nén theo tiêu chuẩn mã hoá RFC 8422/ANSI.X9-62.2005. Cho điểm không nén, byte 0x04 đứng trước xy phối trí dưới dạng số nguyên kích thước cố định. Đối với toạ độ được nén, byte 0x02 hoặc 0x03 và toạ độ x làm số nguyên có 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 làm 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 với AEAD. bao gồm chỉ định IV.

Từ dẫn xuất khoá

Trước tiên, toạ độ x x_ss của điểm chung được tính. Chìa khoá cho Sau đó, 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. Bản gốc có thể thêm đầ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 là được đệm bằng 0 và có cùng kích thước tính bằng byte với thứ tự của đường cong. Cho Ví dụ: đối với đường cong NIST P-256, rs được đệm 0 thành 32 byte.

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

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

Cụ thể, chế độ mã hoá:

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 Các chữ ký ECDSA mã hoá DER (các chữ ký 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 có tính dễ uốn của chữ ký, vốn thường ảnh hưởng đến hệ thống tiền mã hoá.