این صفحه فرمت سیم تینک را برای کلیدها و خروجی های اولیه توضیح می دهد. هدف این اسناد رمزنگارانی است که میخواهند زبانهای دیگری را به Tink اضافه کنند و نگهبانان دیگر کتابخانههای رمزنگاری سطح بالا که خواهان حالت سازگار با سیم هستند. برای مخاطبان عام در نظر گرفته نشده است.
سریال سازی کیست
تینک از پروتوباف گوگل برای سریال سازی مجموعه کلیدهای خود استفاده می کند.
- مجموعه کلیدهای سریالی باینری یک مجموعه اولیه کلیدهای سریالی است که در tink.proto تعریف شده است. ویژگی مقدار KeyData یک کلید یک پروتو سریالی از نوع کلید مربوطه است.
- مجموعه کلیدهای سریالی JSON یک مجموعه کلیدی است که در قالب JSON سریال شده است. توجه داشته باشید که مقدار KeyData هنوز یک پروتوی سریالی باینری است.
- مجموعه کلیدهای رمزگذاری شده یک پروتو رمزگذاری شده سریالی است که در tink.proto تعریف شده است. این شامل یک مجموعه کلید سریالی باینری رمزگذاری شده و به صورت اختیاری برخی فراداده KeysetInfo رمزگذاری نشده است.
پیشوند خروجی Tink
بیشتر Tink های اولیه از یک پیشوند خروجی 5 بایتی پشتیبانی می کنند که شامل موارد زیر است:
- نسخه 1 بایتی:
0x01
- راهنمایی کلید 4 بایت: این شناسه کلید کلید استفاده شده است.
برخی از کلیدهای قدیمی ممکن است از نسخه بایت 0x00
نیز پشتیبانی کنند.
توجه داشته باشید که این پیشوند احراز هویت نیست و نمی توان برای اهداف امنیتی به آن اعتماد کرد. Tink از آن به عنوان یک اشاره برای سرعت بخشیدن به رمزگشایی یا تأیید استفاده می کند.
AEAD
به طور کلی، Tink متن های رمزی AEAD را به صورت زیر قالب بندی می کند:
prefix || IV || ciphertext || tag
مگر اینکه در RFC مربوطه مشخص شده باشد. prefix
یا خالی است یا پیشوند خروجی Tink 5 بایتی است.
AES-CTR-HMAC
برای AES-CTR-HMAC، Tink MAC را با داده های مرتبط (AD) به صورت زیر محاسبه می کند:
AD || IV || ciphertext || bitlen(AD)
که در آن bitlen(AD)
طول AD در بیت است که به صورت عدد صحیح بدون علامت 64 بیتی بزرگ-اندیان نمایش داده می شود. این طرح HMAC از پیشنویس AES-CBC-HMAC از مکگرو پیروی میکند.
AEAD قطعی
تینک RFC 5297 را برای AES-SIV پیاده سازی می کند و بردار اولیه سازی مصنوعی (SIV) را در ابتدای متن رمزگذاری می کند. اولیه ممکن است یک پیشوند خروجی Tink 5 بایتی اضافه کند.
در حالی که RFC 5297 لیستی از دادههای مرتبط را پشتیبانی میکند، Tink فقط از یک داده مرتبط پشتیبانی میکند، که مربوط به فهرستی با یک عنصر در RFC 5297 است. دادههای مرتبط خالی، فهرستی با یک عنصر خالی است و نه یک لیست خالی.
پخش جریانی AEAD
به AES-CTR HMAC و AES-GCM-HKDF مراجعه کنید.
رمزگذاری پاکت نامه
رمزگذاری پاکت، داده ها را با یک کلید رمزگذاری داده DEK
با استفاده از اصول اولیه AEAD Tink رمزگذاری می کند. رمزگذاری به صورت زیر عمل می کند:
- یک
DEK
جدید با استفاده از یک الگوی کلیدی داده شده (یا پارامترهای کلیدی) تولید می شود. -
DEK
به یک رشته بایت سریال تبدیل می شود. فرمت سریال سازی پروتکل سریال سازی بافر پروتکل از نوع پروتو. برای مثال، این یک پیام بافر پروتکلAesGcmKey
سریالی است که در aes_gcm.proto برای DEK از نوع کلید AES GCM تعریف شده است. برای نحوه سریال سازی بافر پروتکل سریال سازی بافر پروتکل را ببینید. -
DEK
سریال شده توسط یک ارائه دهنده خارجی (مثلاً GCP) به یکencrypted DEK
رمزگذاری می شود. -
DEK
برای رمزگذاری متن ساده با داده های مرتبط درciphertext
استفاده می شود. بنابراینciphertext
دقیقاً همان قالب اولیه AEAD مربوط بهDEK
را دارد.
فرمت خروجی رمزگذاری پاکت به شرح زیر است:
encrypted DEK length || encrypted DEK || ciphertext
encrypted DEK length
4 بایت است، طول encrypted DEK
را به عنوان یک عدد صحیح بزرگ-اندیان 32 بیتی ذخیره می کند.
MAC
Tink از RFCهای مربوطه پیروی می کند. Primitives ممکن است یک پیشوند خروجی 5 بایتی Tink به تگ اضافه کند.
مجموعه PRF
Tink از RFCهای مربوطه پیروی می کند. توجه داشته باشید که برای PRF Set نوع کلید با نوع کلید MAC همان الگوریتم با در نظر نگرفتن طول خروجی متفاوت است. کلیدهای PRF Set هرگز پیشوند خروجی Tink اضافه نمی کنند. این تضمین می کند که خروجی در واقع یک PRF است.
رمزگذاری ترکیبی
قالب کلی سیم برای رمزگذاری هیبریدی Tink به شرح زیر است:
prefix || encapsulated_key || encrypted_data
prefix
یا خالی است یا پیشوند خروجی Tink 5 بایتی است. هر نوع کلید حاوی اطلاعاتی درباره تعداد بایت برای تجزیه و نحوه تجزیه آن بایت ها از encapsulated_key
است.
HPKE (رمزگذاری کلید عمومی ترکیبی)
Tink از استاندارد HPKE تعریف شده در RFC 9180 پیروی می کند. یک مجموعه رمز HPKE شامل سه نمونه اولیه زیر است.
- مکانیسم کپسولاسیون کلید (KEM)
- تابع مشتق کلید (KDF)
- رمزگذاری تأیید شده با داده های مرتبط (AEAD)
استاندارد HPKE فرمت سیم عمومی را در RFC 9180، بخش 10 تعریف نمی کند. پیاده سازی HPKE Tink از مقادیر encapsulated_key
و encrypted_data
زیر استفاده می کند.
-
encapsulated_key
- کلید عمومی سریال فرستنده
- به عنوان
enc
در RFC 9180، بخش 4.1 تعریف شده است - قالب توسط HPKE KEM خاص مورد استفاده تعیین می شود
-
encrypted_data
- متن رمزی و برچسب (یعنی،
ciphertext || tag
بدون IV) - به عنوان
ct
در RFC 9180، بخش 4 تعریف شده است - قالب تعیین شده توسط HPKE AEAD خاص مورد استفاده
- متن رمزی و برچسب (یعنی،
X25519 KEM مبتنی بر Diffie-Hellman
برای X25519 DHKEM، مقدار enc
کلید عمومی 32 بایتی Diffie-Hellman فرستنده است.
ECIES-AEAD-HKDF
برای اجرای ECIES-AEAD-HKDF Tink، encapsulated_key
خروجی مکانیسم کپسوله سازی کلید (KEM) و encrypted_data
خروجی مکانیسم کپسوله سازی داده ها (DEM) است.
KEM
بسته به نوع کلید، Tink از نقاط منحنی بیضوی فشرده و غیرفشرده استفاده میکند که از استانداردهای رمزگذاری RFC 8422 / ANSI.X9-62.2005
پیروی میکند. برای نقاط فشرده نشده، بایت 0x04
با مختصات x
و y
به عنوان اعداد صحیح با اندازه ثابت دنبال می شود. برای مختصات فشرده، بایت 0x02
یا 0x03
و مختصات x
به عنوان یک عدد صحیح با اندازه ثابت استفاده می شود. برای X25519
، از تعریف RFC 7748 استفاده شده است ( مختصات x
به عنوان عدد صحیح اندازه ثابت).
DEM
برای encrypted_data
، Tink از همان قالب AEAD استفاده میکند. این شامل مشخص کردن یک IV است.
مشتق کلید
ابتدا مختصات x x_ss
نقطه مشترک محاسبه می شود. سپس کلید AEAD به صورت زیر تنظیم می شود:
HKDF(ikm = encapsulated_key || x_ss, salt = salt_of_key, info = context_info, length = dem_key_size)
که در آن encapsulated_key
خروجی کامل KEM به صورت بایت است.
امضای دیجیتال
Tink از RFCهای مربوطه پیروی می کند. Primitives ممکن است یک پیشوند خروجی 5 بایتی Tink را به تگ ایجاد شده اضافه کند.
ECDSA
بسته به فیلد EcdsaSignatureEncoding در کلید، فرمت یک امضای ECDSA یا IEEE P1363
یا ASN.1 DER
است.
فرمت امضای IEEE P1363
r || s
است r || s
، که در آن r
و s
دارای لایه صفر هستند و اندازه آن در بایت ها به ترتیب منحنی است. به عنوان مثال، برای منحنی NIST P-256
، r
و s
صفر تا 32 بایت هستند.
امضای DER با استفاده از ASN.1
کدگذاری می شود:
ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }
به طور خاص، رمزگذاری این است:
0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s
Tink از بهترین شیوهها برای تأیید امضا پیروی میکند، تنها با پذیرش امضاهای ECDSA کدگذاریشده DER (امضای کدگذاریشده BER جایگزین نامعتبر هستند).
این به جلوگیری از حملات چکشخواری امضا، که اغلب بر سیستمهای ارزهای دیجیتال تأثیر میگذارد، کمک میکند.