العناصر الأولية والواجهات

نعرّف بعد ذلك (بشكل غير رسمي، ولكن بشكل رسمي أكثر)، وهما جزءان مهمان من اللغة المستخدمة في Tink، وهما الواجهة الأولية والواجهة.

بدائية

العنصر الأساسي هو كائن رياضي يتوافق مع جميع الخوارزميات التي تنفّذ بعض المهام بشكل آمن. على سبيل المثال، يتألف النموذج الأساسي AEAD من جميع خوارزميات التشفير التي تستوفي خصائص الأمان التي يتطلبها Tink من Aead.

ونؤكد أن الأساسيات غير مرتبطة بلغة برمجة أو بطريقة محددة للوصول إليها. بدلاً من ذلك، ينبغي للمرء أن يفكر في الوحدة الأولية على أنها كائن رياضي بحت. على سبيل المثال، إذا درسنا AEAD، سيتألف بشكل أساسي من أزواج من الوظائف، أحدها يقوم بالتشفير، والآخر يقوم بإجراء فك التشفير.

واجهات

الواجهة هي الطريقة التي نمنح من خلالها للمستخدمين إمكانية الوصول إلى نموذج أولي. على سبيل المثال، نتوقع أن يوفّر Tink في المستقبل واجهة Mac، بالإضافة إلى واجهة StreamingMac التي تسمح بحساب نظام التشغيل Mac للبيانات التي لا يتم تحميلها مباشرةً في الذاكرة.

وتجدر الإشارة إلى أننا نميّز بين الواجهات والعناصر الأساسية بوضوح هنا. ينبغي أن يوضح ذلك أن الكائن الرياضي الذي تمنح هاتين الواجهتين الوصول إليه متطابق.

التعريفات الرسمية

بالنسبة إلى معظم القرّاء، قد تكون التفسيرات البديهية أعلاه كافية. ومع ذلك، نشعر أنه قد يكون من المهم في بعض الأحيان تقديم تعريفات رسمية لهذه المفاهيم.

الدوال المشفّرة

مفهوم دالة التشفير ليس مهمًا مثل مفهوم المجموعة الأولية، إلا أننا نحتاج إلى تقديمه لتعريف الوحدة الأساسية رسميًا.

وظيفة التشفير

تُعد دالة التشفير خريطة

\[ f: {\bf K} \times {\bf R} \times {\bf I} \to {\bf O}\]

من set \({\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\) عادةً إلى خطأ في المصادقة (ومع ذلك سيكون هو الناتج أيضًا في حال كانت بعض الإدخالات طويلة جدًا).

ونشدّد على أنّ إضفاء الطابع الرسمي أعلاه ليس الخيار الوحيد لإضفاء الطابع الرسمي على المعيار. على سبيل المثال، يمكن للمرء أن يعبر عن جزء من المدخل بدلاً من قراءته عن طريق العشوائية (مما ينتج عنه مادة أولية مختلفة تمامًا). بدلاً من ذلك، يمكن تعريف الناتج على أنه ثلاثي يحتوي على nonce والنص المشفر والعلامة (بدلاً من التسلسل). أو يمكن بدلاً من ذلك حصر المساحة الأساسية (بشكل عشوائي) على \({\bf K} = \{0,1\}^{128} \cup \{0,1\}^{256}\).

خوارزمية التشفير:

خوارزمية التشفير (المتماثلة) عبارة عن صف

\[(f_1, ... f_k)\]

من وظائف التشفير، حيث يكون لجميع الدوال نفس المساحة الرئيسية. نوع خوارزمية التشفير هو الصف \((({\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 بت، مع خوارزميات غير بحجم 96 بت، وAES-EAX مع بعض أحجام المفاتيح، وXChaCha20Poly1305. وتحتوي على مسافات رئيسية منفصلة، ولكنها توفّر كلها وظائف التشفير نفسها\(\mathrm{Enc}\) و \(\mathrm{Dec}\). (لا نرى أي غرض في عملية تصغير الأحجام الرئيسية المختلفة لمعيار AES-GCM بطريقة ما في هذه المناقشة الرسمية، ولكن بالطبع يمكن أن يفعل ذلك).

تعريف الأساسيات

تتمثل الطريقة المعتادة للتفكير في الأساسيات في تحديد خصائص وظائف التشفير أولاً، ثم اعتبار أن الوحدة الأولية هي جميع هذه الخوارزميات.

على سبيل المثال، بالنسبة إلى AEAD، يمكن القول بأنّ \(\mathrm{Dec}_k(\mathrm{Enc}_k(m, a), a) = m\) "راضٍ دائمًا" (باستثناء على سبيل المثال إذا كان النص العادي \(m\) طويل جدًا). بالإضافة إلى ذلك، لدينا خصائص أمنية، فعلى سبيل المثال، بالنسبة إلى المفتاح العشوائي، يكون التشفير آمنًا دلاليًا.

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

واجهات

تتيح الواجهة في Tink الوصول إلى عنصر أولي، بمعنى أنها تسمح بحساب أحد عناصر مساحة الإخراج من مساحة الإدخال. على سبيل المثال، ضع في اعتبارك واجهة AEAD في جافا:

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}\) للنموذج الأساسي، من المحتمل أنّ المستخدم ليس لديه مثيل جاهز يناسب المفتاح الذي اختاره المستخدم والمكتبة في الوقت ذاته. وبالتالي، تُعدّ إضافة المزيد من الواجهات مقايضة.


  1. تتمتع تشفير AEAD بخاصية أنها آمنة ضد هجمات النص المُشفر المختارة، والتي تكون مضمونة فقط إذا لم تكن هناك إعادة استخدام للأحرف الخاصة. تم تصميم واجهة Aead في Tink على نحو يحول دون إعادة الاستخدام غير القابلة لإعادة الاستخدام: لا يمكن للمستخدم تقديم nonce كإدخال للتشفير، وبدلاً من ذلك، يتم إنشاء رقم تعريفي جديد بشكل عشوائي لكل عملية تشفير.