الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تطوير : شيفرة دافينشي بلغة C

بدأه tantie L في 8 نوفمبر 2013 · 14 رد · 1,613 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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


 


هذا موضوع جديد تابع لاقتراحي ،كانت أول شيفرة طرحتها في هذا المنتدى الرائع هي شيفرة قيصر و كما لم أتوقع وجدت تفاعلا معها كبير


و الشيفرة الثانية التي أردت أن أطرحها هي شيفرة دافينشي


 


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


 


استعملت هذه الشيفرة في عدة مجاﻻت و من بينها المجال الروائي البوليسي و أشهر هذه الروايات هي رواية Davinci Code  للكاتب دان براون... و لكن كما تعلمون أن تحمل رسالة و تقابلها للمرآة و تحاول كشف تلك الرسالة كلمة كلمة أمر متعب جدا... لذلك وجدت البرمجة لمن يهوى مثل هذه الشيفرات و الألغاز و سأقوم في هذا الموضوع بطرح الكود الخاص بهذه الشيفرة و لكن قبل ذلك سأوضح كيفية عمل هذه الشيفرة لمن ﻻ يعرفها...


 


1- الخطوة الأولى هي أن تضع الرسالة التي تريد أن تشفرها أمامك مثلا لتكن عبارتنا كالآتي :


"عالم البرمجة رائع" 


2-الخطوة الثانية هي قم بقلبها :


"عئار تجمربلا ملاع"


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


أصارحكم القول أنني لم أجد فكرة خاصة بي الآن لذلك فأنا أنتظر بشوق اقتراحاتكم و أفكاركم سواء في تطوير الكود الخاص بها أو فكرة لتطوير هذه الشيفرة 


و اليكم الكود الخاص بهذه الشيفرة


#include<stdio.h>

#include<string.h>

void main()

{

    char s[100];

    int i,l;

    printf("enter the word\n");

    gets(s);

    l=strlen(s);

    printf("after rotate\n");

    for(i=l-1;i>=0;i--)

        {

            printf("%c",s);

        }

    

 }

تم تعديل هذه المشاركة بواسطة tantie L في 8 نوفمبر 2013 في 18:24 — السبب: تنسيق الكود

1

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#2

السلام عليكم

فكرة عمل الشفرة بسيطة لكن في زمن دفانشي لا اضن انه كان يستطيع شخص ما حل الشفرة

واضن انه عندما وجدوها لم يفكر احد في بساطة حلها بل فكرو في حلول جد معقدة خصوصا انها لشخصية مهمة

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

الفكرة هي

متلا اسمي عضويتي وهو بشفرة دفانشي هو كالتالي

DFENICHUOM

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

وستصبح كالتالي

D-> E

F->G

E->F

N->O

I->J

C->D

H->I

U->V

O->P

M->N

وتعطينا

EGFOJDIVPN

 

 

+ ارى انه في هدا المجال يمكن لأي شخص مهتم به ان يبدع فيه ويمكن ان يجد خورزميات لتشفير بسيطة لكن فعالة بشكل مهم

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

...

1
#3

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

 

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

 

مثل هذه الأسئلة مهمة جداً لمن يريد أن تزداد خبرته في كتابة الأكواد .. وهنا أحيي الأخت على الكود .. فهو جيد :)

وهذه محاولتي التقصيرية في الكود Code Golfing

#include<stdio.h>int main(){    char s[1000];    int i=0;    printf("enter the word\n");    while((s[i++]=getchar())>13);    printf("after rotate\n");    while(i--)putchar(s);    getchar();    return 0;}

 

أظن أن الكود واضح :D

#4

@MouhcinFD

فكرتك جميلة كما أرى أنك دمجت خوارزمية قيصر مع شيفرة دافينشي + أخبرني ما فكرتك التي ناقشتها مع أستاذك شوقتني لمعرفتها ؟

@مصطفى36a2

معك حق فيما فلته عن الاختراعات التي تنكشف و تندثر مع اندثار حضاراتها

و لقد كشفتني يا أستاذ فهذا هو هدفي الحقيقي من خلال الأكواد التي أطرحها...أشكرك

و الكود واضح تمام التمام و لكن ماذا تعني 13 في تعليمة قراءة الكلمة ؟

دائما هناك سؤال يجب أن أطرحه على أي كود تطرحه

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#5

إن محرف نهاية السطر له رمز  وقيمته حسب جدول آسكي هو 10 وأيضاً 13 .. ( أحدهما Line Feed و الآخر Carriage Return  ) المهم أننا سنتابع القراءة إلى أن نصل إلى نهاية السطر ..

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

 

ملاحظة : محرف tab قيمة الآسكي له هي 9 .. أي أنه غير مسموح ضمن السلسلة أيضاً ..

 

يمكنني تقصير الكود أكثر من ذلك :

#include<stdio.h>main(){    int s[1000],i=0;    puts("enter the word");    while((s[i++]=getchar())>13);    puts("after rotate");    while(i--)putchar(s);    return!getchar();;}

:)

1
#6

حسنا لقد فهمت الآن

جيد جيد بدأت أجني الذهب....تقصير جديد للكود 

سؤال : السطر الأخير ماذا تعني من "!" ؟ و لماذا تستخدم getchar ؟ و لماذا وضعت 2 من ";" ؟

أعلم أنني أكثر من الأسئلة و لكن معذرة ما باليد حيلة 

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#7

بخصوص الفكرة التي طرحتها على الاستاد

متلا انا اريد ان ارسل اليك رسالة مشفرة

سنتفق على على تلات ارقام سرية a b c هده الارقام هي مفتاح الشيفرة

وسأقوم انا بكتابة معادلة رياضية من الدرجة التانية f(x) متغيرة على حسب صعوبة حل الشيفرة

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

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

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

هده هي الفكرة ويمكنني  كتابة برنامج بلغة السي أطبق فيه الفكرة

2
#8

أهلاً أخ محسن .. رأينا موضوعك الرائع ثم اختفيت من المنتدى .. ننتظر إبداعاتك :)

أختي الكريمة :

! تعني نفي . حيث أن getchar تعيد الحرف الذي قرأته وأنا أريد أن أعيد return 0  ولكن الحرف المأخوذ لن يكون صفراً وسأحوله إلى صفر عن طريق النفي المنطقي !

بالنسبة لـوضع getchar ... لا أعرف وجدتها في الكود عندك وتركتها من باب حفظ الحقوق ... (كما أنها تستعمل لتثبيت شاشة الخرج كي لا تغلق قبل رؤية الناتج)

أما وضع ;; فهذا خطأ مطبعي :)

#9

هذا جيد اذن لم يكن فهمي خاطئا لقصدك 

لقد وضعت (fflush(stdin و ()getchar  حتى أثبت شاشة الخرج عندي لأن برنامج Borland C++ 5.02 الذي أستعمله يغلق شاشة الخرج قبل رؤية الناتج و لا أعلم لماذا

مشكور أستاذ مصطفى و أرجو أن أرى مزيدا من المعلومات من عندك و من عند غيرك في هذا المنتدى

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#10

@مصطفى

ما رأيك بهذا الاختصار : :P

#include <stdio.h>
#include <string.h>
main()
{
   char str[100];
   gets(str);
   printf("after rotate : %s\n",strrev(str));
}

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

#include<stdio.h>#include<string.h>char* reverse(char str[]) {    char tmp;    for (int i = 0, j = strlen(str) - 1; i < j; i++, j--) {        tmp = str;        str = str[j];        str[j] = tmp;    }    return str;}int main() {    char string[100];    printf("enter the word : ");    gets(string);    printf("after rotate : %s", reverse(string));    return 0;}

تم تعديل هذه المشاركة بواسطة Snack3r في 9 نوفمبر 2013 في 04:50

1
#11
Snack3r كتب:
#include <stdio.h>
#include <string.h>
main()
{
   char str[100];
   gets(str);
   printf("after rotate : %s\n",strrev(str));
}

 

جيد جيد استخدمت دالة جاهزة و سهلت الأمر علينا

 

 

@Snack3r

هل هذا هو هيكل الدالة strrev

التي استخدمتها في تقصير الكود؟

 

Snack3r كتب:
#include<stdio.h>#include<string.h>char* reverse(char str[]) {    char tmp;    for (int i = 0, j = strlen(str) - 1; i < j; i++, j--) {        tmp = str;        str = str[j];        str[j] = tmp;    }    return str;}

 

معلومة أخرى أضفتها اليوم الى مكتسباتي منكم رائع مشكورون

تم تعديل هذه المشاركة بواسطة Snack3r في 9 نوفمبر 2013 في 16:22 — السبب: لستُ أستاذاً يا أختي الكريمة .. مفهووم ؟؟

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#12

أخي Snack3r الدالة  ..strrev رائعة :)

بالنسبة للدالة reverse إليك هذه القنبلة :)

char* reverse(char *S) {
    char*s,*c=S,x;
    for(s=c--;*s;s++);
    while(s-->c++)x=*s,*s=*c,*c=x;
    return S;
}

ما رأيك :)

________________________

أختي الكريمة الدالة reverse لا علاقة لها بالدالة strrev إلا بأنها تقوم بعمل مشابه تقريباً .. (strrev من دوال اللغة في المكتبة string اما reverse فهي من كتابة الأخ Snack3r )

ولكن الدالة strrev تعيد مؤشر لمصفوفة أخرى وليس لنفس المصفوفة الممرّرة لذلك قال الأخ Snack3er أنها لا تعكس المصفوفة المررة .

 

بالتوفيق

#13
اقتباس
بالنسبة للدالة reverse إليك هذه القنبلة :)

 

 

فكرة جميلة جداً و فيها شوية خزعبلات أيضا :P

أعتقد أن الفكرة هي جعل c و S يُشيران إلى نفس المكان في الذاكرة و تخزين محتوى c في s بشكل مقلوب ثم تبادل محتوى c بـ s في حلقة while !

مع أنني لم أفهم جيداً شرط الحلقة while :D

1
#14

:D قضيت السنة الماضية كلها في هذي الأمور :p

تعريف مؤشرين ومتحول مؤقت للتبديل اسمه x

char*s,*c=S,x;

الحلقة التالية فقط ليصل s إلى آخر عنصر

    for(s=c--;*s;s++);

لاحظ أنني نقّصت c بواحد فهي الآن لا تشير للمصفوفة بل قبلها بواحد .

وهذا تابع للشرط في while

حيث أنني في كل دورة أزيد c وأنقص s ..

قبل الدخول كانت s على المحرف الصفري بآخر السلسلة .. وطبعاً لايمكن الافتراب منه  ..

وزيادة c أمر مفروغ منه للمرور على العناصر .. ولكن حتى نوفّر بعض الحروف في الكود , وضعت الزيادة في الشرط نفسه .. ولأنني لا أريد تجاوز الحرف الأول لذلك أنقصت c سابقاً (في for)

 

أرجو يكون وضح أكثر :)

 

بالتوفيق

2
#15

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

 

آسف على هذه المشاركة التي قد تكون غير مرغوبة

 

خصوصا و أنا هذا العمل تم منذ زمن

 

لكن وجدت خطأ فأردت أن أنوه عليه كي لا تقع مغالطة حول شفرت المرآة لدافنشي

 

دافينشي كان يصور رسائله بقتبها بشكل معكوس

 

اقتباس

 

"عالم البرمجة رائع" 

2-الخطوة الثانية هي قم بقلبها :

"عئار تجمربلا ملاع"

 

هذا غير صحيح

 

و إنما عالم البرمجة تشفر هكذا:

 

post-280298-0-33448900-1404230626.png

 

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

 

بالإمكان إستعمال أي معدل صور كالفوتوشوب للتشفبر و فك التشفير

 

لكن لا أعلم إن كانت تشفر كل كلمة لحالها أم الصفحة بأكملها

 

على العموم أنا حولت الجملة كاملة دفعة واخدة

 

سلام

تم تعديل هذه المشاركة بواسطة kenham في 1 يوليو 2014 في 19:07

مواضيع مشابهة