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