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