نحدد بعد ذلك (بشكل غير رسمي، ولكن بعد ذلك بشكل رسمي)، جزأين مهمين من اللغة المستخدمة في Tink وPrimitive والواجهة.
أساسي
العنصر الأساسي هو كائن رياضي يتوافق مع جميع الخوارزميات. أداء بعض المهام بأمان. على سبيل المثال، يتكون مجموعة AEAD الأساسية من جميع خوارزميات التشفير التي تلبي خصائص الأمان التي يتطلبها تطبيق Tink لعيد الحب.
نؤكد على أن المبادئ الأولية غير ملزمة بلغة برمجة أو لغة محددة طريقة الوصول إليها. وبدلاً من ذلك، ينبغي للمرء أن تفكر في العنصر الأساسي على أنه كائن رياضي. فعلى سبيل المثال، إذا وضعنا في الاعتبار AEAD، فإنه سيأخذ في الأساس تتكون من أزواج من الدوال، واحدة تنفذ التشفير، وأخرى تنفيذ فك التشفير.
واجهات
الواجهة هي طريقة نوفّر من خلالها للمستخدمين إمكانية الوصول إلى واجهة أساسية.
فعلى سبيل المثال، نتوقع أن يوفر Tink في المستقبل واجهة Mac
،
ولكنها تحتوي أيضًا على واجهة StreamingMac
، التي تسمح بحساب منصات mac
البيانات التي لا يتم تحميلها مباشرةً في الذاكرة
تجدر الإشارة إلى أننا نميّز بين الواجهات والعناصر الأساسية هنا بشكل واضح. من المفترض أن يؤدي هذا وضح أن الكائن الرياضي الذي تعطيه هاتان الواجهتان الوصول إليها هي نفسها.
التعريفات الرسمية
بالنسبة إلى معظم القرّاء، قد تكون التفسيرات البسيطة أعلاه كافية. ومع ذلك، نشعر أنه قد يكون من المهم في بعض الأحيان تقديم معلومات تعريفات هذه المفاهيم.
دوال التشفير
لا يعتبر مفهوم دالة التشفير مهمًا مثل مفهوم أساسي، لكننا بحاجة إلى تقديمه لتعريفه رسميًا.
- وظيفة التشفير
دالة التشفير هي خريطة
\[ f: {\bf K} \times {\bf R} \times {\bf I} \to {\bf O}\]
من مجموعة \({\bf K}\) (مساحة المفتاح)، مجموعة \({\bf R} = \{0,1\}^{\infty}\) (العشوائية، التي نفترض أنها مجموعة من سلاسل البت اللانهائية) set \({\bf I}\) (مساحة الإدخال)، على مجموعة \({\bf O}\) (مساحة الإخراج).
وسيتضح لاحقًا سبب إضافة معلمة عشوائية محددة.
كمثال، نعرض احتمالاً واحدًا لكيفية تعيين هذه المفاهيم على AES-GCM لكل حجم صالح للمفتاح \(s_k\)، وحجم غير محدَّد \(s_n\)، وحجم علامة صالح \(s_t\)، تتكون تقنية AES-GCM من وظيفتي تشفير، إحداهما والأخرى لفك التشفير. سيكون لكل منهما مساحة المفتاح \({\bf K} = \{0,1\}^{s_k}\)نفسها.
بالنسبة لدالة التشفير \(\mathrm{Enc}\)، أول \(s_n\) بت من العشوائية لتحديد الجزء غير العادي.
دع \({\bf B} = \{0,1\}^8\) يشير إلى بايت. مساحة الإدخال لدالة التشفير هي أزواج \({\bf I} = {\bf B}^{*} \times {\bf B}^{*}\) أزواج سلاسل البايت ذات الطول العشوائي. من المفترض أن يكون العنصر الأول من الزوج هو الرسالة، أما العنصر الثاني فهو البيانات المرتبطة بها. هناك حد أقصى لمعيار AES-GCM لأطوال والمدخلات، ولكننا نفضل السماح بالأطوال العشوائية، ونضيف بدلاً من ذلك دالة خاصة رمز خطأ \(\bot\) إلى مساحة الإخراج. ثم تصبح مساحة الإخراج \({\bf O} = {\bf B}^* \cup \{\bot\}\)، وفيها نحدد نتيجة العمليات الحسابية الناجحة في شكل التسلسل \((\mathrm{IV} \| \mathrm{ciphertext} \| \mathrm{tag})\) كما هو موضح في المعيار، \(\bot\)، في حال كان بعض الإدخالات طويلة جدًا. وبالتالي، إذا أردت استخدام مفتاح ثابت، تصبح دالة التشفير من النوع \(\mathrm{Enc}_k : {\bf R} \times {\bf B}^* \times {\bf B}^* \rightarrow {\bf B}^* \cup \{\bot\}\).
بالنسبة إلى دالة فك التشفير \(\mathrm{Dec}\) المساحة الرئيسية هي نفسها. تشير رسالة الأشكال البيانية فمساحة الإدخال هي نفسها بمصادفة: \({\bf I} ={\bf B}^* \times {\bf B}^*\)، ولكن من المفترض أن يكون العنصر الأول الآن هو ناتج دالة التشفير، بينما لا تزال النتيجة الثانية هي البيانات المرتبطة.
يتصادف أن تكون مساحة الإخراج هي نفسها \({\bf O} = {\bf B}^* \cup \{\bot\}\) (مصادفة مرة أخرى). يكون التفسير مختلفًا إلى حد ما، كما أن \(\bot\) عادةً ما تشير إلى خطأ في المصادقة (رغم أنها ستكون أيضًا الإخراج في حالة أن يكون بعض المدخلات طويلاً جدًا).
نشدّد على أنّ إضفاء الطابع الرسمي أعلاه ليس الخيار الوحيد لإضفاء الطابع الرسمي على القياسية. على سبيل المثال، يمكن للمرء أن يعتبر ذلك جزءًا من المدخل، بدلاً من قراءتها من خلال العشوائية (والتي ينتج عنها منهج أساسي مختلف تمامًا). وبدلاً من ذلك، يمكن للمرء أن يحدد المخرج على أنه ثلاثي يحتوي على الأرقام غير المعروفة، والنص المشفر والعلامة (بدلاً من التسلسل). أو يمكن للمرء تقييد المساحة الرئيسية (بشكل عشوائي إلى حد ما) \({\bf K} = \{0,1\}^{128} \cup \{0,1\}^{256}\)
- خوارزمية التشفير:
خوارزمية التشفير (المتماثلة) هي صف
\[(f_1, ... f_k)\]
من وظائف التشفير، حيث يكون لكل الدوال المساحة الرئيسية نفسها. تشير رسالة الأشكال البيانية type لخوارزمية التشفير هو الصف \((({\bf I}_1, {\bf O}_1), \ldots, ({\bf I}_k, {\bf O}_k))\).
على سبيل المثال، لكل ثلاثة أنواع صالحة \((s_k, s_n, s_t)\) من المفاتيح والأحرف الخاصة والعلامة AES-GCM\({}_{s_k, s_n, s_t}\) هي خوارزمية تشفير الدالتين \(\mathrm{Enc}\) و \(\mathrm{Dec}\) الموضحة أعلاه.
الأساسيات والواجهات
نحدد فيما يلي طريقة التشفير الأساسية.
- أساسي
- الطريقة الأساسية هي مجموعة من خوارزميات التشفير، حيث يتم حذف جميع الخوارزميات لها نفس النوع \((({\bf I}_1, {\bf O}_1), \ldots, ({\bf I}_k, {\bf O}_k))\)، وتكون المساحات الرئيسية للخوارزميات منفصلة زوجية.
على سبيل المثال، يمكنك الاطّلاع على السمة \(\mathrm{AEAD}\) الأساسية في Tink. يتضمن العديد من خوارزميات مثل AES-GCM للمفاتيح 128 و256 بت، مع استخدام nonce بحجم 96 بت، ومعيار AES-EAX مع بعض أحجام المفاتيح، وXChaCha20Poly1305. لديهم مسافات المفاتيح المنفصلة، لكن جميعها يوفر نفس دوال التشفير \(\mathrm{Enc}\) و \(\mathrm{Dec}\)(لا نرى غرضًا بطريقة ما. بدمج أحجام رئيسية مختلفة من AES-GCM في هذه المناقشة الرسمية، ولكن بالدورة التدريبية التي يمكن للمرء أن يفعلها).
تحديد الأساسيات
الطريقة المعتادة للتفكير في الأساسيات هي تحديد خصائص لدوال التشفير، ثم نعتبر أن العنصر الأساسي هو جميع مثل هذه الخوارزميات.
على سبيل المثال، بالنسبة لـ AEAD، يمكننا القول إن \(\mathrm{Dec}_k(\mathrm{Enc}_k(m, a), a) = m\) هي 'always' راضٍ (باستثناء إذا كان النص العادي \(m\) مثالاً أيضًا طويلة). بالإضافة إلى ذلك، لدينا خصائص أمان، على سبيل المثال، بالنسبة إلى مفتاحًا عشوائيًا، فسيكون التشفير آمنًا من حيث المعنى.
ويكون معيار AEAD هو ببساطة مجموعة من خوارزميات التشفير التي تلبي هذه الخصائص. بمعنى آخر، من الناحية العملية، عندما نحدِّد فئة معيّنة أساسي، فإننا نحدده بناءً على الخصائص. لا نقدم قائمة الخوارزميات، كما يشير التعريف.
واجهات
تتيح الواجهة في Tink الوصول إلى واجهة أولية، بمعنى أنه يسمح لحساب عنصر في مساحة الإخراج من مساحة الإدخال. على سبيل المثال: ضع في اعتبارك واجهة AEAD في Java:
public interface Aead {
byte[] encrypt(byte[] plaintext, byte[] associated_data) throws GeneralSecurityException;
byte[] decrypt(byte[] ciphertext, byte[] associated_data) throws GeneralSecurityException;
}
يُرجى العِلم أنّنا لا نمنح إذن الوصول العشوائي. بدلاً من ذلك، نسمح للمستخدم تقدم عناصر مساحة الإدخال. يعود عدم السماح بالوصول إلى العشوائية عن قصد.1
يوفر Tink أحيانًا واجهات متعددة لعنصر أساسي واحد.
وقد يكون ذلك مفيدًا جدًا، فقد تختلف المتطلبات في بعض الأحيان. ومع ذلك، فإن القيام بذلك
بسعر: بشكل عام، كلما زاد عدد الواجهات التي تقدمها، انخفض
التوافقية. على سبيل المثال، تخيل
أن شخصًا ما يكتب مكتبة بناءً على Tink تتطلب من المستخدم أن يمر
كائن Aead
(لتشفير عنصر داخليًا). إذا كان Tink تقدم الكثير جدًا
الواجهات المختلفة إلى \(\mathrm{AEAD}\) الأساسية، فهناك احتمال كبير
من أن المستخدم
لا يحتوي على مثيل جاهز يصلح للمفتاح الذي اختاره المستخدم
المكتبة في نفس الوقت. وبالتالي، فإن إضافة المزيد من الواجهات هي الحل البديل.
-
يتمتع تشفير AEAD بخاصية آمنة ضد هجمات النص المُشفر المختارة، والتي يمكن ضمانها فقط في حالة عدم وتكرارًا للأبد. تم تصميم واجهة Aead في Tink بحيث لمنع إعادة استخدام nonce: لا يمكن للمستخدم تقديم nonce كمدخل للتشفير، وبدلاً من ذلك، يتم إنشاء رقم غير محدد جديد بشكل عشوائي لكل عملية تشفير.↩