توضّح هذه الصفحة تنسيق سلك Tink للمفاتيح والإخراج الأساسي. هذا المستند موجَّه إلى المبرمجين الذين يريدون إضافة لغات أخرى إلى منصة Tink والجهات المسؤولة عن حماية مكتبات التشفير الأخرى عالية المستوى الذين يريدون وضعًا متوافقًا مع بروتوكول Wi-Fi. وهو ليس مخصّصًا للجمهور العام.
تسلسل مجموعات المفاتيح
يستخدم Tink النموذج الأوّلي من Google لإنشاء تسلسل لمجموعات المفاتيح.
- مجموعة المفاتيح الثنائية المتسلسلة هي نموذج أولي لمجموعة مفاتيح متسلسلة معرَّف في tink.proto. خاصية قيمة KeyData للمفتاح هي نموذج أوّلي تسلسلي من نوع المفتاح المقابل.
- مجموعة مفاتيح JSON المتسلسلة هي نموذج أولي لمجموعة مفاتيح بتنسيق JSON. تجدر الإشارة إلى أن قيمة KeyData لا تزال تمثّل نموذجًا أوّليًا تسلسليًا ثنائيًا.
- مجموعة المفاتيح المشفرة هي نموذج أولي لـ EncryptedKeyst تسلسلي تم تعريفه في 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 || IV || ciphertext || bitlen(AD)
حيث يكون bitlen(AD)
هو طول AD بوحدات بت ممثلة كعدد صحيح 64 بت غير مُوقع. يتّبع نظام HMAC هذا مسودة AES-CBC-HMAC من Mcgrew.
AEAD محدد
يطبِّق Tink 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 طلبات التعليقات المقابلة لها. قد تضيف الوحدات الأساسية بادئة ناتج Tink بحجم 5 بايت إلى العلامة.
مجموعة PRF
يتبع Tink طلبات التعليقات المقابلة لها. تجدر الإشارة إلى أنّه بالنسبة إلى مجموعة PRF Set، يختلف نوع المفتاح عن نوع مفتاح MAC للخوارزمية نفسها من خلال عدم تضمين طول الإخراج. لا تضيف مفاتيح مجموعة PRF بادئة إخراج Tink مطلقًا. يضمن هذا أن الناتج هو في الواقع PRF.
التشفير المختلط
التنسيق العام للأسلاك لتشفير Tink المختلط هو على النحو التالي:
prefix || encapsulated_key || encrypted_data
تكون قيمة prefix
فارغة أو بادئة إخراج Tink من 5 بايت. يتضمّن كل نوع مفتاح
معلومات حول عدد وحدات البايت التي يجب تحليلها وكيفية تحليل وحدات البايت هذه من
encapsulated_key
.
نظام التشفير بالمفتاح العام المختلط (HPKE)
يتّبع Tink معيار HPKE المحدّد في RFC 9180. تتضمن حزمة تشفير HPKE الأساسيات الثلاثة التالية.
- آلية تغليف المفاتيح (KEM)
- دالة اشتقاق المفتاح (KDF)
- التشفير المُصادق عليه مع البيانات المرتبطة (AEAD)
لا يحدّد معيار HPKE تنسيق سلك عام في الفقرة 10 من RFC 9180. يستخدم تطبيق HPKE من Tink قيمتَي
encapsulated_key
وencrypted_data
التاليين.
encapsulated_key
- المفتاح العام المتسلسل للمُرسِل
- يتم تحديدها على أنّها
enc
في الفقرة 4.1 من RFC 9180 - التنسيق المحدد بواسطة HPKE KEM المحدد المستخدم
encrypted_data
- النص المُشفر والعلامة (أي
ciphertext || tag
بدون رقم IV) - يتم تحديدها على أنّها
ct
في الفقرة 4 من RFC 9180 - التنسيق المحدد بواسطة HPKE AEAD المحدد المستخدم
- النص المُشفر والعلامة (أي
X25519 خوارزمية KEM القائمة على ديفي هيلمان
بالنسبة إلى أنظمة X25519 DHKEMs، تكون القيمة enc
هي مفتاح Diffie-Hellman العام بسعة 32 بايت للمُرسِل.
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
كعدد صحيح بحجم ثابت).
مارك ألماني
بالنسبة إلى 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 طلبات التعليقات المقابلة لها. قد تضيف الوحدات الأساسية بادئة ناتج Tink بحجم 5 بايت إلى العلامة التي يتم إنشاؤها.
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
يتّبع Tink أفضل الممارسات للتحقّق من التوقيع، وذلك من خلال قبول توقيعات ECDSA بترميز DER فقط (التوقيعات البديلة بترميز BER غير صالحة).
يساعد ذلك في منع هجمات القابلية للتغير المتبادل، والتي غالبًا ما تؤثر في أنظمة العملات المشفّرة.