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 HMAC và AES-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ứcAesGcmKey
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àoencrypted DEK
.DEK
dùng để mã hoá văn bản thuần tuý có dữ liệu liên kết vàociphertext
. Vì vậy,ciphertext
có định dạng giống hệt với dữ liệu gốc AEAD tương ứng vớiDEK
.
Đị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_key
và encrypted_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
- Văn bản mật mã và thẻ (ví dụ:
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 P1363
là r || s
, trong đó r
và s
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
, r
và s
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á.