سؤال

ما هي الأساسيات اللازمة لإنجاز تشفير البيانات باستخدام مفتاحين بالضبط (والذي يمكن أن يعتمد على كلمة المرور)، ولكن تحتاج إلى مفتاح واحد فقط (أحدهما) لفك تشفير البيانات؟

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

لا أقصد المفتاح العام/الخاص.ربما عبر تشفير المفاتيح المتماثلة وربما يتضمن شيئًا مثل XORing المفاتيح معًا لاستخدامها في التشفير.

تحديث:أود أيضًا العثور على حل لا يتضمن تخزين المفاتيح على الإطلاق.

هل كانت مفيدة؟

المحلول

الطريقة المعتادة للقيام بذلك هي إنشاء مفتاح متماثل واحد لتشفير البيانات.ثم تقوم بتشفير المفتاح المتماثل باستخدام مفتاح كل مستلم أو كلمة مروره حتى يتمكن من فك تشفيره بنفسه.يستخدم S/MIME (في الواقع بناء جملة رسالة التشفير الذي يستند إليه S/MIME) هذه التقنية.

بهذه الطريقة، عليك فقط تخزين نسخة واحدة من الرسالة المشفرة، ولكن نسخ متعددة من مفتاحها.

نصائح أخرى

بشكل عام، ما تفعله هو تشفير البيانات باستخدام مفتاح تم إنشاؤه عشوائيًا، ثم إلحاق إصدارات هذا المفتاح العشوائي التي تم تشفيرها مع كل مفتاح معروف.لذلك يمكن لأي شخص لديه مفتاح صالح اكتشاف المفتاح "الحقيقي" الذي تم استخدامه لتشفير البيانات.

إذا فهمت الأمر بشكل صحيح، فلديك بعض البيانات التي ترغب في تشفيرها وتوزيع مفتاح التشفير مقسمًا إلى "أجزاء رئيسية". (في حالتك قطعتان)

لذلك، يمكنك استخدام التقسيم المستند إلى XOR، وإليك كيفية عمله:يمكنك توفير العدد المطلوب من القطع - n، والمفتاح السري - K.لإنشاء n قطعة من مفتاحك، تحتاج إلى إنشاء أرقام عشوائية (n – 1):ر1، ر2، ر3، ...، Rn−1.لذلك يمكنك استخدام مولد أرقام SecureRandom، والذي سيمنعنا من التكرارات. ثم تقوم بتشغيل وظيفة XOR على هذه القطع Rn-1 ومفتاحك - K:
Rn = R1 ⊕ R2 ⊕ R3 ⊕ ...⊕ Rn−1 ⊕ ك

الآن لديك قطع n الخاصة بك:R1، R2، R3، …، Rn-1، Rn ويمكنك تدمير K.يمكن نشر هذه القطع في التعليمات البرمجية الخاصة بك أو إرسالها إلى المستخدمين.

لإعادة تجميع المفتاح، نستخدم عملية XOR على قطع Rn الخاصة بنا:
ك = R1 ⊕ R2 ⊕ R3 ⊕ ...⊕ Rn−1 ⊕ Rn

باستخدام وظيفة XOR (⊕) تكون كل قطعة مهمة بطبيعتها في إعادة بناء المفتاح، إذا تم تغيير أي أجزاء في أي قطعة، فلن يكون المفتاح قابلاً للاسترداد.

لمزيد من المعلومات والتعليمات البرمجية، يمكنك إلقاء نظرة على أداة Android المساعدة التي كتبتها لهذا الغرض:
مشروع جيثب: https://github.com/aivarsda/Secret-Key-Split-Util

يمكنك أيضًا تجربة التطبيق التجريبي Secret Key Splitter الذي يستخدم تلك الأداة المساعدة:
تطبيقات جوجل: https://play.google.com/store/apps/details?id=com.aivarsda.keysplitter

أعتقد أنني فكرت في حل قد ينجح:

D = data to encrypt
h1 = hash(userpassword)
h2 = hash(companyPassword)
k = h1 concat h2

E = function to encrypt
//C is the encrypted data
C = E_h1(h2) concat E_h2(h1) concat E_k(D)

ثم يمكن لأي شخص فك تشفير تجزئة الشخص الآخر، ثم دمجها لفك تشفير بقية البيانات.

ربما هناك حل أفضل من هذا بالرغم من ذلك؟

في الحالة الأكثر عمومية، يمكن تقسيم السر (في هذا التطبيق، مفتاح فك تشفير البيانات) إلى مشاركات بحيث يلزم وجود عدد معين من هذه المشاركات لاستعادة السر.يُعرف هذا بالمشاركة السرية أو مع عدد n من المشاركات وعتبة t، نظام العتبة (t،n).

إحدى الطرق التي يمكن القيام بها هي إنشاء متعددة الحدود من الرتبة t-1، وتعيين السر باعتباره المعامل الأول، واختيار بقية المعاملات عشوائيًا.ثم يتم تحديد نقاط عشوائية على هذا المنحنى وتصبح أسهمًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top