Khaled Alshaya

حمل برنامج التشفير بلغة ++c

12 ردود في هذا الموضوع

السلام عليكم و رحمة الله و بركاته,

منذ فترة و أنا أتكاسل عن قراءة المقالات الجديدة, و يبدو أن الملل أصاب أناملي أيضاً, لذلك سنبدأ بإذن الله ببناء أولى برامجنا الجماعية.

في الحقيقة أن هذا الموضوع هو الحلقة الثالثة من سلسلة دروس تطبيقية على مستوى الـ Bit الذي تأجل طرحه فترة طويلة,

ليس لشيء إلا لأنني تكاسلت عن إعداده أولاً, و لأنني احترت في اختيار تطبيق كمشروع عملي لتلك السلسة,

كنت أفكر في شرح كيفية التشفير باستخدام المعامل XOR, و لكنني علمت أن الملل أصابني فما بالك بالقارئ الكريم!

موضوعنا هذا هو محاولة لبناء تطبيق متكامل, بالطبع برنامجنا عبارة عن برنامج تشفير للبيانات, خوارزمية التشفير بسيطة جداً و ربما كانت بضعة أسطر من الكود!

مع ذلك فإنه من المستحيل كسرها!

هذا المشروع ليس موجها حقيقة لبناء برنامج تشفير بحد ذاته, و لكننا سنوجه اهتمامنا على كيفية بناء تطبيق كامل حتى ولو كان بسيط الواجهة!

لن نستخدم مفاهيم البرمجة الكائنية على الإطلاق, لأنه باعتقادي أن مشروعاً مثل هذا لا يستدعي كل ذلك القلق من أجل بناء صنف class يعتمد عليه !!

مشروعنا ينقسم لطبقتين :

الطبقة الأولى (قلب البرنامج) : هي عبارة عن الدوال التي ستستخدمها الواجهة لإتمام عملية التشفير.

الطبقة الثانية(الواجهة) : هي شاشة البرنامج, أو الواجهة التي سيتعامل معها المستخدم.

قبل أن أبدأ لا بد أن أذكر أن بناء تطبيق متكامل ليس بتلك البساطة, صحيح أن أجزاء برنامجنا صغيرة و معدودة, و لكن ضمان عمل تلك المكونات مع بعضها البعض يحتاج جهداً و مناقشة,

ربما كانت أهم المسائل التي سنتعرض لها, هي ثلاث مسائل :

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

ثانياً, كيفية تصميم الواجهة, سنستخدم الـ Command Line أو ما يسمى بالـ Console لعرض الخيارات للمستخدم, حتى لا نجبر على الدخول في تفاصيل الواجهات الرسومية تحت windows.

ثالثاً و ربما كان الأهم!, كيفية استخدام أصناف مكتوبة عن طريق مبرمجين آخرين, و كيفية اختيارها, و ماهو مقاس برنامجنا المناسب!

سنستخدم مكتبتين, الأولى لتحسين شكل الواجهة, و الثانية لتنفيذ وظيفة تحتاج الكثير من العمل لو أردنا كتابتها بأنفسنا, بالطبع كل هذا للتركيز على عمل البرنامج الأساسي, و لكي نتعلم معاً كيف يمكن التعامل مع المبرمجين الآخرين قبل التعامل مع أنفسنا :)

أعلم أنكم لم تعرفوا ماهو البرنامج أصلاً, إنما كان الذي في الأعلى عبارة عن نظرة أولية عليه, و هذا هو المطلوب حالياً,

سأكون بعد إذنكم مدير المشروع -_- أي ان الأجزاء التي سوف أطرحها تباعاً سيتم مناقشتها تباعاً,

انتهيت حقيقة من وضع مخطط لهذا المشروع البسيط, و سنسير بإذن الله على ذلك المخطط حتى نخرج ببرنامجنا في المستقبل القريب إن شاء الله.

في المشاركة القادمة سوف أطرح قواعداً عامة للمشاركة, إضافة إلى تنسيق الأكواد المطلوب اتباعه خلال عملية المناقشة,

في المشاركة التي تليها, سوف أطرح فكرة البرنامج العامة, إضافة للاجزاء الرئيسية فيه أو الوظائف المطلوبة.

حتى ذلك الحين, نستودعم الله الذي لا تضيع ودائعه, و نلقاكم عن في القريب العاجل.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ,,

سنبدأ بقواعد المشاركة في المشروع :

@ المشروع مقسم إلى أجزاء و عند العمل على جزء معين, لا تطرح فكرتك أو اقتراحك أو كودك الخاص بجزء آخر,

@ بالنسبة لتنسيق الكود, فيجب أن يتبع القواعد التالية :

1- أن يكون Standard Code يمكن لجميع المترجمات أن تترجمه, و لا يعتمد على مترجم بعينه.

2- تسمية المتغيرات يجب أن تتبع طريقة الـ camelCase, لتعريف متغير من نوع int على سبيل المثال :

int camelCase = 0;

حيث الحرف الأول دائماً صغير, و باقي المقاطع تبدأ بحرف كبير.

3- أسماء الدوال و تعريفها سيطرح خلال المشروع عن طريقي, و ذلك حتى لا يحصل تضارب عند دمج الأكود مع بعضها.

هذا كل شيء حول قواعد المشاركة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ,,

سنتطرق الآن لكيفية عمل البرنامج بشكل مجرد, بمعنى أبسط, كيف سيتعامل المستخدم مع البرنامج,

برنامجنا يقوم بعمل وظيفتين لا أكثر,

الأولى, إدخال ملف للبرنامج لكي يقوم بتشفيره, الصورة تشرح كل شيء :

post-89451-1202528564_thumb.png

كما ترون, سيقوم المستخدم بإدخال مسار الملف في شاشة البرنامج, ثم سيقوم قلب البرنامج بالباقي,

أهم نقطة يجب للمستخدم الانتباه لها, هي أن البرنامج يقوم بإنشاء ملفين,

الأول هو نسخة عن الملف الأصلي, ولكن بعد تشفيره, اسم الملف الناتج سيكون كالتالي :

originalFile.ext
the Encrypted File Name will be :
originalFile.ext.enc

الملف الآخر هو مفتاح التشفير, أو الملف الذي سيستخدمه برنامجنا في الوظيفة الثانية و امتداده atp.

الثانية, إدخال ملف مشفر مع مفتاحه لكي يقوم البرنامج بفك تشفير الملف المشفر, سينتج لنا الملف الأصلي من هذه العملية, الصورة تشرح كل شيء :

post-89451-1202528575_thumb.png

كما ترون سيقوم المستخدم بإدخال مسار الملفين في شاشة البرنامج, و برنامجنا سيقوم بالباقي.

برنامجنا سينتج الملف الأصلي بعد انتهاء العملية. الملف الأصلي سيسمى كالتالي :

encryptedFile.ext
the Decrypted File Name will be :
originalFile.ext.dec

هذه هي وظائف البرنامج بشكل مبسط من وجهة نظر المستخدم حتى نعمل للوصول إليها!

في المرة القادمة, سنقوم بشرح الخوارزمية التي سنستخدمها و التي تمثل قلب البرنامج بشكل رئيسي!

تحياتي ,,

تم تعديل بواسطه Khaled.Alshaya
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ,,

سنقوم في السطور اللاحقة, بشرح خوازمية التشفير التي سنقوم بكتابتها بلغة ++C. الخوارزمية بسيطة إلى أبعد الحدود.

هذا المشروع يحتاج في الدرجة الأولى لمراجعة الـ Bitwise Operators, إذا لم تكن قد قرأت الحلقات التي وضعتها حول الموضوع يمكنك الاطلاع عليها من

الروابط التالية :

الحلقة الأولى

الحلقة الثانية

لا داعي لقراءة الحلقتين كاملتين, كل ماعليك هو التركيز على XOR Operator و كيف نقوم باستخدامه في ++C.

لننظر للمثال التالي حتى نفهم أهمية XOR :

a = 1, b = 0
a XOR b = 1

إذا قمنا بالتبديل بين قيم a و b بحيث أصبحت كالتالي :

a = 0, b = 1
a XOR b = 1

هل يتغير ناتج العملية ؟ بالطبع لا, و بالتالي إذا كان ناتج العملية '1' فإننا سنعرف أن a و b مختلفين, و لكننا لن نستطيع تحديد قيمة أي منهما.

و الآن انظر للمثال الثاني :

a = 0, b = 0
a XOR b = 0

لو كان a و b يساويان '1' هل ستتغير النتيجة ؟ بالطبع لا, سنعرف أنهما يحملان نفس القيمة, ولكن لن يكون بإمكاننا تحديد القيمة نفسها هل هي '0' أو '1'.

من هنا جاءت فكرة التشفير باستخدام XOR, حيث لن يكون بإمكاننا تخمين القيم الأصلية من النتيجة, بالطبع سيتعقد الأمر كلما زادت كمية البيانات لدينا.

لننظر للمثال التالي :

11 XOR 10 = 01

النتيجة التي لدينا هي 01, بالتالي إذا أردنا تخمين المدخلات الأصلية, فإن لكل نتيجة احتمالان, و عند ضم النتائج مع بعضها كما في المثال السابق فسوف نحصل على 2*2 احتمال. و لكل bit يتم زيادته سوف تزيد الاحتمالات.

يمكننا أن نلخص عدد الاحتمالات الممكنة للبيانات التي لدينا :

n = number of bits
2^n ( two to the power of n )

تصور أن لدينا أربع حروف, كل حرف عبارة عن byte, بالتالي يصبح عدد الاحتمالات :

2^(4*8) = 4294967296

و إذا قمنا بإضافة أربع حروف أخرى يصبح عدد الاحتمالات :

2^(8*8) = 18446744073709551616 !!!

هل رأيت!! تصور أن لدينا kilobyte من البيانات ما هو عدد الاحتمالات الممكنة ؟!!!!

بكل بساطة, الخوارزمية ما هي إلا تطبيق لـ XOR بين البيانات التي نريد تشفيرها, و بين كلمة المرور أو ما يمكن أن نسميه بطريقة أصح مفتاح التشفير.

مفتاح التشفير, يجب أن يكون حجمه نفس حجم البيانات التي لدينا, و بالتالي سنعتمد على مصدر ينتج لنا بيانات عشوائية!

في الحقيقة أن هذه الخوارزمية, نقطة ضعفها الوحيدة هي عملية الحصول على البيانات العشوائية, لن ندخل بشكل معمق في عملية إنتاج الأعداد العشوائية لأنها من الأمور المتقدمة بالنسبة لي و لكم أيضاً !!

و لكننا بكل تأكيد سنناقش مصادر تلك البيانات العشوائية و ما هي نقاط الضعف التي ستواجه برنامجنا بسبب مصدر البيانات العشوائية!

و ما هي الحلول المتوفرة للتغلب على هذا الأمر.

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

لمن يريد الاستزادة حول هذه الخوارزمية, يمكن الاطلاع على هذا الموضوع One-time pad

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

تحياتي ,,

تم تعديل بواسطه Khaled.Alshaya
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ,,

في السطور اللاحقة, سنتعرف على الخطة التي سنتبعها خلال تطوير البرنامج.

الخطة هي عبارة عن خطوات نتبعها خلال كتابة البرنامج, لضمان عمل الأجزاء بشكل صحيح, و عند انتهاء كل مرحلة سنضمن أننا لن نرجع للمراحل السابقة إلا في حالات الضرورة القصوى.

برنامجنا مكون من دوال, لذلك سنتبع الخطوات التالي :

1) شرح عمل الدالة بشكل تجريدي.

2) كتابة الدالة. (يمكن لكل عضو كتابة الدالة حسب طريقته و سيتم اعتماد الأفضل)

3) اختبار الدالة المعتمدة لضمان عدم وجود أخطاء قدر المستطاع.

سنبدأ في شرح أجزاء قلب البرنامج في الرد القادم بإذن الله, لنطرح بعدها أول دالة سيتم كتابتها.

بعد طرح أول دالة, سيتم استقبال المشاركات, لاعتماد أفضل تصميم للدالة من المشاركين في المشروع.

ملاحظة : المشاركة ليست محصورة بفريق معين, يمكنك المشاركة متى أردت. (المشاركة إما تكون بكتابة دالة أو اختبار دالة لعرض الأخطاء الممكن حصولها).

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ,,

يبدو أن المشروع انتهى قبل أن يبدأ!

أعتقد أن المشكلة ليست في عدم وجود مشاركات, و لكن طريقة عرض تلك المشاريع.

على كل حال, قمت بعمل المشروع, و ستجدونه في المرفقات,

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

هذا ما أردت قوله, إذا وجد أحدكم أو إحداكن الفائدة في شفرة هذا البرنامج لا تنسوا أن تدعوا لي,

البرنامج مرفق مع الشفرة, الشفرة مرتبة إلى أبعد الحدود, لذلك إن أعجبك البرنامج و أردت تطويره ضع رداً في هذا الموضوع لكي نتطلع على البرنامج بعد تطويره.

استخدمت في تطوير البرنامج Visual C++ 2008 Express

EncAT.rar

البرنامج ليس له رخصة أي أنه Public Domain :D

استعملت في البرنامج شفرات كتبها مبرمجون آخرون و هذه هي الشفرات التي استخدمتها :

Add color to console projects

A Mersenne Twister Class

الرخص الخاصة بتلك الشفرات موضحة في صفحاتها.

تحياتي ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

خالد انا لحد الان لم اشاهد البرنامج ..

ولكن ادعو لك من كل قلبي حتى ولو لم استفد منه ..

لانك بالفعل تريد ان تفيد اخوانك ..

اتوقع انه يجب ان لا اضع مشاركتي هنا ولكن قرات كلمة

لا تنسوا أن تدعوا لي,

فانا ادعو لك من كل قلبي وان شاءالله نتعاون في مشاريع اخرى .. لانك لم تترك لنا الفرصه للكلام حول الموضوع . كلها ايام واكملته لوحدك ..

بارك الله بيك وبامثالك ..

تحياتي العطرة ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أهلاً سنان,

الله يبارك فيك يا سنان,

عموماً الأيام جاية و إن شاء الله نعمل سوية على برنامج واحد :)

تحياتي ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مشكور يا ملك

على فكرة ان ال C++ خرطتلي مشطي و حابب احترفها

بإذن الله هذا الصيف سأتفرغ لها

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

يسلللللللللللم ايديك عالمعلومات المفيدة انا بحاجة الها كتير وبتمنى اترد على رسالتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكــم ورحمـة الله وبركاتــة ،،

لم أرى الموضوع إلا الآن !!!

لي عودة يا عمو خالد، فإستعد لأسئلتي :lol:

يسلللللللللللم ايديك عالمعلومات المفيدة انا بحاجة الها كتير وبتمنى اترد على رسالتي

:blink:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أهلاً يا حج :lol:

فكرة التشفير هي نفسها تقريباً RC4 و لكن مع اختلاف مصدر البيانات...

ربما هنا يفيدك :)

مناقشة برنامج التشفير!,

تم تعديل بواسطه Khaled.Alshaya
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .