این صفحه قالب سیمی Tink برای کلیدها و خروجی اولیه را شرح میدهد. این مستندات برای رمزنگارانی که میخواهند زبانهای بیشتری به Tink اضافه کنند و نگهدارندگان سایر کتابخانههای رمزنگاری سطح بالا که میخواهند حالت سازگار با سیم داشته باشند، در نظر گرفته شده است. این مستندات برای مخاطبان عمومی در نظر گرفته نشده است.
سریالسازی مجموعه کلید
تینک از پروتوباف گوگل برای سریالسازی مجموعه کلیدهای خود استفاده میکند.
- یک مجموعه کلید سریالی شده باینری، یک پروتو سریالی شده Keyset است که در tink.proto تعریف شده است. ویژگی مقدار KeyData یک کلید، یک پروتو سریالی شده از نوع کلید مربوطه است.
- یک keyset سریالی شده با JSON، یک Keyset proto سریالی شده با فرمت JSON است. توجه داشته باشید که مقدار KeyData همچنان یک proto سریالی شده باینری است.
- یک مجموعه کلید رمزگذاری شده، یک پروتوتایپ سریالی شده EncryptedKeyset است که در tink.proto تعریف شده است. این پروتوتایپ شامل یک مجموعه کلید سریالی شده باینری رمزگذاری شده و به صورت اختیاری برخی فرادادههای رمزگذاری نشده KeysetInfo است.
پیشوند خروجی تینک
بیشتر توابع اولیه Tink از پیشوند خروجی ۵ بایتی پشتیبانی میکنند که شامل موارد زیر است:
- نسخه ۱ بایتی:
0x01 - راهنمای کلید ۴ بایتی: این شناسه کلید مورد استفاده است.
برخی از کلیدهای قدیمی ممکن است از بایت نسخه 0x00 نیز پشتیبانی کنند.
توجه داشته باشید که این پیشوند احراز هویت نشده و نمیتوان برای اهداف امنیتی به آن اعتماد کرد. تینک از آن به عنوان یک راهنما برای سرعت بخشیدن به رمزگشایی یا تأیید استفاده میکند.
AEAD
به طور کلی، تینک متنهای رمز AEAD را به صورت زیر قالببندی میکند:
prefix || IV || ciphertext || tag
مگر اینکه در RFC مربوطه طور دیگری مشخص شده باشد. prefix یا خالی است یا یک پیشوند خروجی Tink 5 بایتی است.
AES-CTR-HMAC
برای AES-CTR-HMAC، تینک MAC را با دادههای مرتبط (AD) به صورت زیر محاسبه میکند:
AD || IV || ciphertext || bitlen(AD)
که در آن bitlen(AD) طول AD بر حسب بیت است که به صورت یک عدد صحیح بدون علامت ۶۴ بیتی big-endian نمایش داده میشود. این طرح HMAC از پیشنویس AES-CBC-HMAC از Mcgrew پیروی میکند.
AEAD قطعی
تینک RFC 5297 را برای AES-SIV پیادهسازی میکند و بردار اولیه مصنوعی (SIV) را در ابتدای متن رمز قرار میدهد. ممکن است یک پیشوند خروجی تینک ۵ بایتی به آن اضافه شود.
در حالی که RFC 5297 از فهرستی از دادههای مرتبط پشتیبانی میکند، Tink دقیقاً فقط از یک داده مرتبط پشتیبانی میکند که معادل فهرستی با یک عنصر در RFC 5297 است. یک داده مرتبط خالی، فهرستی با یک عنصر خالی است و نه یک فهرست خالی.
پخش آنلاین AEAD
به AES-CTR HMAC و AES-GCM-HKDF مراجعه کنید.
رمزگذاری پاکت
رمزگذاری پاکتی، دادهها را با کلید رمزگذاری داده DEK با استفاده از اصول اولیه AEAD تینک رمزگذاری میکند. رمزگذاری به شرح زیر عمل میکند:
- یک
DEKجدید با استفاده از یک الگوی کلید (یا پارامترهای کلیدی) داده شده تولید میشود. -
DEKبه صورت یک رشته بایتی سریالی میشود. فرمت سریالیسازی، سریالیسازی بافر پروتکل از نوع کلید proto است. برای مثال، این یک پیام سریالیسازی شده بافر پروتکل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 ۴ بایت است که طول encrypted DEK را به عنوان یک عدد صحیح ۳۲ بیتی big-endian ذخیره میکند.
مک
تینک از RFC های مربوطه پیروی میکند. اولیهها ممکن است یک پیشوند خروجی تینک ۵ بایتی به تگ اضافه کنند.
مجموعه PRF
تینک از RFC های مربوطه پیروی میکند. توجه داشته باشید که برای PRF Set، نوع کلید با نوع کلید MAC همان الگوریتم متفاوت است و طول خروجی را شامل نمیشود. کلیدهای PRF Set هرگز پیشوند خروجی تینک را اضافه نمیکنند. این تضمین میکند که خروجی در واقع یک PRF است.
رمزگذاری ترکیبی
قالب کلی سیم برای رمزگذاری ترکیبی Tink به شرح زیر است:
prefix || encapsulated_key || encrypted_data
prefix یا خالی است یا یک پیشوند خروجی Tink با طول ۵ بایت. هر نوع کلید شامل اطلاعاتی در مورد تعداد بایتهای مورد نیاز برای تجزیه و نحوه تجزیه آن بایتها از encapsulated_key است.
HPKE (رمزگذاری کلید عمومی ترکیبی)
تینک از استاندارد HPKE تعریف شده در RFC 9180 پیروی میکند. یک دنباله رمز HPKE شامل سه عنصر اولیه زیر است.
- مکانیزم کپسولهسازی کلید (KEM)
- تابع مشتقگیری کلید (KDF)
- رمزگذاری احراز هویت شده با دادههای مرتبط (AEAD)
استاندارد HPKE در بخش 10 از RFC 9180، قالب سیمی عمومی تعریف نمیکند. پیادهسازی HPKE تینک از مقادیر encapsulated_key و encrypted_data زیر استفاده میکند.
-
encapsulated_key- کلید عمومی سریالی فرستنده
- در RFC 9180، بخش ۴.۱ به عنوان
encتعریف شده است - قالب تعیینشده توسط HPKE KEM خاص مورد استفاده
-
encrypted_data- متن رمز شده و برچسب (یعنی
ciphertext || tagبدون IV) - در RFC 9180، بخش ۴ به عنوان
ctتعریف شده است - قالب تعیینشده توسط HPKE AEAD خاص مورد استفاده
- متن رمز شده و برچسب (یعنی
KEM مبتنی بر دیفی-هلمن X25519
برای X25519 DHKEMs، مقدار enc کلید عمومی ۳۲ بایتی دیفی-هلمن فرستنده است.
ECIES-AEAD-HKDF
برای پیادهسازی ECIES-AEAD-HKDF توسط Tink، encapsulated_key خروجی مکانیزم کپسولهسازی کلید (KEM) و encrypted_data خروجی مکانیزم کپسولهسازی دادهها (DEM) است.
کِم
بسته به نوع کلید، Tink از نقاط منحنی بیضوی فشرده و غیرفشرده، مطابق با استانداردهای کدگذاری RFC 8422 / ANSI.X9-62.2005 استفاده میکند. برای نقاط غیرفشرده، بایت 0x04 و مختصات x و y به عنوان اعداد صحیح با اندازه ثابت دنبال میشوند. برای مختصات فشرده، بایت 0x02 یا 0x03 و مختصات x به عنوان یک عدد صحیح با اندازه ثابت استفاده میشوند. برای X25519 ، از تعریف RFC 7748 استفاده میشود (مختصات x به عنوان عدد صحیح با اندازه ثابت).
مدلسازی سهبعدی (DEM)
برای encrypted_data ، تینک از همان قالب 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 به صورت بایت است.
امضاهای دیجیتال
تینک از RFC های مربوطه پیروی میکند. اولیهها ممکن است یک پیشوند خروجی تینک ۵ بایتی به برچسب تولید شده اضافه کنند.
ECDSA
بسته به فیلد EcdsaSignatureEncoding در کلید، قالب امضای ECDSA یا IEEE P1363 است یا ASN.1 DER .
قالب امضای IEEE P1363 به صورت 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
تینک از بهترین شیوههای تأیید امضا پیروی میکند و فقط امضاهای ECDSA کدگذاریشده با DER را میپذیرد (امضاهای کدگذاریشده با BER جایگزین نامعتبر هستند).
این امر به جلوگیری از حملات انعطافپذیری امضا، که اغلب بر سیستمهای ارز دیجیتال تأثیر میگذارند ، کمک میکند.
مقادیر پیش هش Mu ML-DSA خارجی
تابع اولیهی Prehash یک پیام را به یک مقدار prehash تبدیل میکند که تابع اولیهی SignPrehash سپس آن را امضا میکند. برای ML-DSA در حالت External Mu ، همانطور که در RFC 9881 توضیح داده شده است، مقدار prehash برابر با ۶۹ بایت با طرحبندی زیر است:
0xff || key_id (4 bytes, big-endian) || mu (64 bytes)
-
muنماینده پیام ML-DSA است که به صورتSHAKE256(tr || 0x00 || 0x00 || message, 64)محاسبه میشود، که در آنtrهش ۶۴ بایتی کلید عمومی،0x00اول جداکننده دامنه FIPS 204 برای ML-DSA خالص و0x00دوم طول رشته زمینه (خالی) است. از آنجا کهtrاز کلید عمومی مشتق شده است،muبه صورت رمزنگاری به آن کلید متصل است -- اگرچه بررسی اتصال نیاز به پیام اصلی دارد. - پیشوند ۵ بایتی، فریمبندی Tink است و بخشی از
muنیست. این پیشوند مقدار prehash را با یک کلید خاص مرتبط میکند، به طوری که SignPrehash میداند با کدام کلید امضا کند و میتواند مقدار prehash را که کلیدی برای آن ندارد، رد کند. این پیشوند یک فراداده ساده است و هیچ چیز را از نظر رمزنگاری به هم متصل نمیکند: هر کسی میتواند آن را بازنویسی کند.
امضا، هر ورودی که دقیقاً ۶۹ بایت نباشد، با 0xff شروع نشود، یا شناسه کلید آن با یک کلید فعال در مجموعه کلیدهایش مطابقت نداشته باشد را رد میکند.