بث AE-CTR HMAC للبث AEAD

يحدّد هذا المستند بشكل رسمي الدالة الحسابية التي تمثلها مفاتيح بث AES-CTR HMAC (المشفّرة بتنسيق أولي كما يلي: type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey).

ويعتمد هذا التشفير بشكل غير مباشر على [HRRV15]1. لتحليل مستوى الأمان، نشير إلى [HS20]2. تجدر الإشارة أيضًا إلى أنّ اختبارات Tink Cross-language تحتوي على اختبار aes_ctr_hmac_streaming_key_test.py الذي يحتوي على test_manually_created_test_vector مع جولة تفصيلية كاملة حول كيفية الحصول على نص مُشفر.

المفتاح والمعلمات

يتم توضيح المفاتيح بالأجزاء التالية (جميع الأحجام في هذا المستند بالبايت):

  • \(\mathrm{InitialKeyMaterial}\)، سلسلة بايت: مادة المفتاح الأولي.
  • \(\mathrm{CiphertextSegmentSize} \in \{1, 2, \ldots, 2^{31}-1\}\).
  • \(\mathrm{DerivedKeySize} \in \{16, 32\}\).
  • \(\mathrm{HkdfHashType} \in \{\mathrm{SHA1}, \mathrm{SHA256}, \mathrm{SHA512}\}\).
  • \(\mathrm{HmacHashType} \in \{\mathrm{SHA1}, \mathrm{SHA256}, \mathrm{SHA512}\}\).
  • \(\mathrm{HmacTagSize} \in \mathbb{N}\).

بالإضافة إلى ذلك، تستوفي المفاتيح الصالحة السمات التالية:

  • \(\mathrm{len}(\mathrm{InitialKeyMaterial}) \geq \mathrm{DerivedKeySize}\).
  • إذا \(\mathrm{HmacHashType} = \mathrm{SHA1}\) ثم \(\mathrm{HmacTagSize} \in \{10, \ldots, 20\}\).
  • إذا \(\mathrm{HmacHashType} = \mathrm{SHA256}\) ثم \(\mathrm{HmacTagSize} \in \{10, \ldots, 32\}\).
  • إذا \(\mathrm{HmacHashType} = \mathrm{SHA512}\) ثم \(\mathrm{HmacTagSize} \in \{10, \ldots, 64\}\).
  • \(\mathrm{CiphertextSegmentSize} > \mathrm{DerivedKeySize} + \mathrm{HmacTagSize} + 8\) (هذا يساوي \(\mathrm{len}(\mathrm{Header}) + \mathrm{HmacTagSize}\) كما هو موضّح لاحقًا).

ويرفض Tink المفاتيح التي لا تفي بأي من هذه الخصائص (إما عند تحليل المفتاح أو عند إنشاء الرمز الأساسي المقابل).

دالة التشفير

لتشفير رسالة \(\mathrm{Msg}\) مع البيانات المرتبطة بها \(\mathrm{AssociatedData}\)، ننشئ عنوانًا ونقسّم الرسالة إلى أقسام، ثم نشفر كل قطاع، ثم تسلسل المقاطع. سنشرح هذه الخطوات في ما يلي.

إنشاء العنوان

لإنشاء العنوان، نختار أولاً سلسلة عشوائية \(\mathrm{Salt}\) ذات طول \(\mathrm{DerivedKeySize}\). نختار بعد ذلك سلسلة عشوائية \(\mathrm{NoncePrefix}\) بطول 7.

وبعد ذلك، نُعيِّن \(\mathrm{Header} := \mathrm{len}(\mathrm{Header}) \| \mathrm{Salt} \| \mathrm{NoncePrefix}\)، حيث يتم ترميز طول العنوان كبايت واحد. نلاحظ أن \(\mathrm{len}(\mathrm{Header}) \in \{24, 40\}\).

بعد ذلك، نستخدم HKDF 3 مع دالة التجزئة \(\mathrm{HkdfHashType}\) لاحتساب المادة الأساسية للطول \(\mathrm{DerivedKeySize} + 32\) لهذه الرسالة: \(k := \mathrm{HKDF}(\mathrm{InitialKeyMaterial}, \mathrm{Salt}, \mathrm{AssociatedData})\). يتمّ استخدام مدخلات البيانات المكافئة لـ \(\mathrm{HKDF}\): \(\mathrm{InitialKeyMaterial}\) هي \(\mathrm{ikm}\)، \(\mathrm{Salt}\) وقيمة الملح، و\(\mathrm{AssociatedData}\) يتم استخدامها على أنّها \(\mathrm{info}\).

يتم بعد ذلك تقسيم السلسلة \(k\) إلى جزأين \(k_1 \| k_2 := k\)، وبالتالي،\(\mathrm{len}(k_1) = \mathrm{DerivedKeySize}\) و \(\mathrm{len}(k_2) = 32\).

تقسيم الرسالة

تنقسم الرسالة \(M\) بعد ذلك إلى أجزاء: \(M = M_0 \| M_1 \| \cdots \| M_{n-1}\).

ويتم اختيار أطوالها بحيث تلبي ما يلي:

  • \(\mathrm{len}(M_0) \in \{0,\ldots, \mathrm{CiphertextSegmentSize} - \mathrm{len}(\mathrm{Header}) - \mathrm{HmacTagSize}\}\).
  • إذا \(n > 1\)، سيتم \(\mathrm{len}(M_1), \ldots, \mathrm{len}(M_{n-1}) \in \{1,\ldots, \mathrm{CiphertextSegmentSize} - \mathrm{HmacTagSize}\}\).
  • إذا \(n > 1\)، فعندئذٍ \(M_{0}, \ldots, M_{n-2}\) يجب أن يكون لها أقصى طول وفقًا للقيود المذكورة أعلاه.

وفي هذا القسم، \(n\) قد يبلغ \(2^{32}\)على الأكثر. وإلا سيفشل التشفير.

تشفير الوحدات الأساسية

لتشفير المقطع \(M_i\)، نحسب أولاً \(\mathrm{IV}_i := \mathrm{NoncePrefix} \| \mathrm{i} \| b \| 0x00000000\)، حيث يتم ترميزه \(\mathrm{i}\) في 4 بايت باستخدام الترميز الواسع النطاق، ونضبط البايت $b$ على 0x00 إذا $i < n-1$ و0x01 بطريقة أخرى.

بعد ذلك، يتم التشفير \(M_i\) باستخدام مفتاح نسبة النقر إلى الظهور AES \(k_1\)ومتجه الإعداد \(\mathrm{IV}_i\). بعبارة أخرى، مدخلات استدعاءات AES هي \(\mathrm{IV}_i, \mathrm{IV}_i + 1, \mathrm{IV}_i + 2, \ldots\) حيث \(\mathrm{IV}_i\) يتم تفسيرها على أنّها عدد صحيح كبير. ينتج عن ذلك \(C'_i\).

نحسب العلامة باستخدام رمز HMAC مع وظيفة التجزئة التي يحدّدها \(\mathrm{HmacHashType}\) وبالمفتاح \(k_2\) فوق التسلسل \(\mathrm{IV}_i \| C'_i\).

ثم ننشئ تسلسل النص المشفر متبوعًا بالعلامة للحصول على \(C_i\).

تسلسل المقاطع

أخيرًا، يتم ربط جميع الأجزاء كـ\(\mathrm{Header} \| C_0 \| \cdots \| C_{n-1}\)، وهو النص المشفر النهائي.

دالة فك التشفير

يعمل فك التشفير على عكس التشفير. ونستخدم الرأس للحصول على nonce الخاص به، وفك تشفير كل قطاع من النص المُشفر على حدة.

قد تسمح واجهات برمجة التطبيقات (وعادةً ما تسمح بذلك) بالوصول العشوائي أو الوصول إلى بداية الملف بدون فحص نهاية الملف. وهذا مقصود، لأنه يمكن فك تشفير \(M_i\) من \(C_i\)، بدون فك تشفير جميع كتل النصوص المشفرّة السابقة والمتبقية.

ومع ذلك، يجب أن تحرص واجهات برمجة التطبيقات على عدم السماح للمستخدمين بالخلط بين أخطاء نهاية الملف وأخطاء فك التشفير: في كلتا الحالتين، يجب أن تعرض واجهة برمجة التطبيقات خطأً، وقد يؤدي تجاهل الفرق إلى قدرة الخصم على اقتطاع الملفات بشكل فعّال.

تسلسل المفاتيح وتحليلها

لإنشاء تسلسل لمفتاح بتنسيق "Tink Proto"، نربط أولاً المعلَمات بالطريقة الواضحة في النموذج الأوّلي المقدَّم على aes_ctr_hmac_streaming.proto. يجب ضبط الحقل "version" على 0. بعد ذلك، نضع هذا في تسلسل باستخدام تسلسل النموذج الأوّلي العادي، ونضمّن السلسلة الناتجة في قيمة حقل النموذج الأوّلي KeyData. نُعيِّن الحقل type_url على type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey. ثم نضبط key_material_type على SYMMETRIC، ونضمّنه في مجموعة مفاتيح. عادةً ما نضبط السمة output_prefix_type على RAW. والاستثناء هو أنه إذا تم تحليل المفتاح باستخدام قيمة مختلفة لـ output_prefix_type، قد يكتب Tink إما RAW أو القيمة السابقة.

لتحليل مفتاح، نعكس العملية المذكورة أعلاه (بالطريقة المعتادة عند تحليل النماذج الأوّلية). يتم تجاهل الحقل key_material_type. يمكن تجاهل قيمة output_prefix_type، أو يمكن رفض المفاتيح التي تختلف عن output_prefix_type عن RAW. ويتم رفض المفاتيح التي تتضمّن version يختلف عن 0.

المراجع


  1. [HRRV15] هوانغ، ريهانيتابار، روغاواي، فيزار. التشفير المصادَق عليه على الإنترنت ومقاومته لحالات إساءة الاستخدام غير القابلة لإعادة الاستخدام. CRYPTO 2015. https://eprint.iacr.org/2015/189 

  2. [HS20] أمان تشفير البث في مكتبة Tink من Google. هوانغ شين، 2020. https://eprint.iacr.org/2020/1019 

  3. [HKDF] دالة اشتقاق المفاتيح المستندة إلى HMAC أو توسيعها (HKDF)، معيار RFC 5869. https://www.rfc-editor.org/rfc/rfc5869