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

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

بدأه kenham في 13 يونيو 2014 · 22 رد · 5,752 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

 

خوارزمية قصير:

 

مبدأ عمل هذه الخوارزمية هو تبديل كل حرف بالحرف الذي يلي الحرف الأصلي ب   K  (مفتاح التشفير)

 

مثلا:

 

إن كان الحرف الأصلي A   و المفتاح (K=3)   فالحرف المشفر هو D

 

إن كان الحرف الأصلي A   و المفتاح (K=4)   فالحرف المشفر هو E

 

إن كان الحرف الأصلي C   و المفتاح (K=5)   فالحرف المشفر هو H

 

إن كان الحرف الأصلي Z   و المفتاح (K=6)   فالحرف المشفر هو F

 

 

عملية التشفير هي دالة,لها نرمز بالحرف E , من مجموعة ازواج النصوص الظاهرة والمفاتيح لمجموعة النصوص المشفرة اي : 70a5cda09454cb561189d1f573bb9f8d.png وفي هذه الحالة : 2a033674a1dab6689a0f5ef28bd199b7.png

اما فك التشفير فهي ايضا دالة , نرمز لها بالحرف D , وهي من مجموعة ازواج النصوص المشفرة والمفاتيح لمجموعة النصوص الظاهرة اي : 4a6283e75262853de4f8d5d72fb8a901.png

في حالة شفرة قيصر كان k=3 , كما انَّ k بين 1 و- 25 .

 

 

المطلوب صناعة برنامج للتشفير ة فك التشفير باستعمال خوارزمية قيصر

     

      * أي ان المستخدم يختار إن كان يود التشفير أو فك التشفير

 

      * ثم يدخل النص  و مفتاح التشفير

 

 

إن كان هناك تفاعل مع هذا الموضوع سأضيف تمارين عن طرق أخرى للتشفير

 

كال monoalphabetic  أو خوارزميات أعقد و أفضل كال DES

 

 

للمطاعة أكثربالموضوع أليكم الروابط:

 

the black chambre

 

مادة التشفير في موقع رواق

 

 

في إنتضار ردودكم

تم تعديل هذه المشاركة بواسطة kenham في 13 يونيو 2014 في 05:27

1
#2

تجربتي  :)

def cry(msg,k=0):
	new=''
	for i in msg:
		if ord(i)<=122 and ord(i) >= 97:
			new+=chr((((ord(i)-97)+k)%26)+97)
		elif ord(i)<=65 and ord(i) >= 90:
			new+=chr((((ord(i)-65)+k)%26)+65)
		else:
			new+=i
	return new

def decry(msg,k=0):
	new=''
	for i in msg:
		if ord(i)<=122 and ord(i) >= 97:
			new+=chr((((ord(i)-97)-k)%26)+97)
		elif ord(i)<=65 and ord(i) >= 90:
			new+=chr((((ord(i)-65)-k)%26)+65)
		else:
			new+=i
	return new

def main():
	start="Y"
	while start.upper()=="Y":
		cas=input("Cryptè : C / Decrypte : D ")
		msg=input("saisez votre message : ")
		k=int(input("saisez la clè : "))
		if cas.upper()=="C":
			print(cry(msg,k))
		else:
			print(decry(msg,k))
		start=input("Continue : Y ") 

main()
1
#3

حل ممتاز أخي الكريم

 

خوارمية قيصر مخصصة لتشفير 26 حرف لاتيني فقط أي أنها لا تشفر الرموز

 

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

 

أما الرموز و المسافات فتبقى كما هي

 

حل رائع أخي الكريم

#4
عذرا على التاخر

تفضل حلي:

 


message = raw_input("What is your message? ")

shift = int(raw_input("What is your shift? "))

operation = int(raw_input("Encrypt or Decrypt: 1:Encrypt / 0:Decrypt"))


if operation not in [1, 0]:

  operation = (raw_input("Encrypt or Decrypt: 1:Encrypt / 0:Decrypt : "))


operation = bool(operation)

def cesar(message, shift): 

  cipherText = ""

  for ch in message:

    if ch.isalpha():


      if operation:

        stayInAlphabet = ord(ch) + shift 

      else:

        stayInAlphabet = ord(ch) - shift   


      if stayInAlphabet > ord('z'):

        stayInAlphabet -= 26

      finalLetter = chr(stayInAlphabet)

      cipherText += finalLetter

  if operation:

    print "Your ciphered text is: ", cipherText

  else:

    print "Your decipherd text is: ", cipherText  

  return cipherText


cesar(message, shift)

#5

الأخ med reda

 

برنامجك به مشكلتين:

 

1:إذا كان بالنص الأصلى أرقام أو رموز أو حتى مسافات تحذف هذه الأرقام و الرموز  و المسافات

 

بالنسبة للأرقام و الرموز و المسافات،طريقة قيصر مخصصة للحروف اللاتينية فقط

 

لكن من المحبذ تركها كما هي و ليس أن تحذف كليا في النص المشفر و عندما يعاد تحويله لنص لا نجدها

 

2:المشكل الثاني هو إن (كان المفتاح+ رقم الحرف) أكبر من 26

 

مثلا لو كان بالنص الأصلي حرفz  و المفتاح 3

 

التشفير المنتج غير صحيح بتلك الحالة

 

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

 

و تجربة تشفير   a   و  b

a='abcdefghijklmnopqrstuvwxyz'b=a.capitalize()

و من ثمة فك تشفير النص المشفر

 

هذا سيبن إن كانت الكود يعمل بشكل صحيح

تم تعديل هذه المشاركة بواسطة kenham في 14 يونيو 2014 في 16:04

#6
معك حق 

لم انتبه لنص التمرين جيدا

ساصلح الكود ثم اعود

#7

اصلحت الكود :

هذه المرة خورارزمية التشفير تضيف المسافات والرموز كما هي الى النص المشفر

كما ان النص المدخل يتم تحويله الى  lower case ثم اقوم بالتشفير او فك التشفير

message = raw_input("What is your message? ")
shift = int(raw_input("What is your shift? "))
operation = int(raw_input("Encrypt or Decrypt: 1:Encrypt / 0:Decrypt"))

if operation not in [1, 0]:
  operation = (raw_input("Encrypt or Decrypt: 1:Encrypt / 0:Decrypt : "))
  
operation = bool(operation)

def cesar(message, shift): 
  cipherText = ""
  for ch in message:
    ch = ch.lower()
    if ch.isalpha():

      if operation:
        stayInAlphabet = ord(ch) + shift 
      else:
        stayInAlphabet = ord(ch) - shift   

      if stayInAlphabet > ord('z'):
        stayInAlphabet -= 26
      finalLetter = chr(stayInAlphabet)
      cipherText += finalLetter
    else:
      cipherText += ch  
  if operation:
    print "Your ciphered text is: ", cipherText
  else:
    print "Your decipherd text is: ", cipherText  
  return cipherText

cesar(message, shift)
1
#8
med reda   جميل جدا  البرنامج يعمل على أكمل وجه

 

بالمناسبة إن أردتم سوف أضع تمارين عن طرق منوعنة لخوارزميات التشفير و فك التشفير إبتداءا من الخوارزميات العادية للحديثة

 

الآن سأضع تمرين بخصوص فك التشفير

 

إن كنتم موافقين على الفكرة

 

أبلغوني بروردكم

#9

البرنامج الآن يعمل لكن كما هو معروف خوارزمية قيصر مخصصة لتشفير الأحرف اللاتينية من قبل

 

هل من الممكن تطوير البرنامج ليعمل مع الرموز و الأرقام و الأحرف العربية؟؟؟

 

أرجو من الجميع مشاركتنا بهذا الموضوع

#10

يجب ادخال البيانات على شكل يونيكود

#11

بالتأكيد و لكن ماذا أيضا

#12

السلام عليكم .

 

شباب أنا جديد فى البرنامج وأريد أن أتقدم فيه لمستواكم هذا .. ما هى السبل التى أتبعها ؟؟؟

 

 وكيف أفهم هذه الطرق التى تستخدموها ؟

#13
اقتباس

 

شباب أنا جديد فى البرنامج وأريد أن أتقدم فيه لمستواكم هذا .. ما هى السبل التى أتبعها ؟؟؟

 

هل تقصد أنك جديد في البرنامج؟؟: كل ما فعلناه هو ترحمة الحوارزمية لكود بايثون ،حوترزمية قيصر معروفة إبحث عنها بقوقل للمزيد من التفاصيل

 

هل اقصد أنط جديد بالبايثون؟؟: ما عليم إلا تعلم هيامل البيانات و التكرارات و الدوال ،مع التطبيق ستتعلم بسرعة

 

اقتباس

 

وكيف أفهم هذه الطرق التى تستخدموها ؟

 

إن كنت تقصد الحوارزمية؟؟: لا تحتاج لفهمها كل ما عليك هو ترجمتها لأكواد باللغة التي تستعملها لأنها خوارزمية معروفة عالميا

 

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

 

أم كنت تقصد الحل الذي قدمه الأحوان: أنا جربت الحلين فقط و وجدت أنهما يعملان،لا أحتاج لفهم الكود،إن لم يضع أي أحد الحل كنت سأضع خلا مختلف على طريقتي أنا

 

لكل شخص طريقته بالحل,

 

لا تحفض الأكواد   أعد حلول على طريقتك

#14

شكرا لك على الرد المفصل :) .... أنا أقصد أنى مبتدئ فى الpython ..

 

هل الكتاب الموجود فى الموضوع المثبت سيكون كاف لأتعلم اللغه جيدا ؟

#15

المفتاح يكون بين 1 و 25 أو -1 و -25 :)

def caesarCipher(mode, message, key):
    message = message.lower()
    
    if mode == 'd':
        key = -key
        
    translated = ''
    for symbol in message:
        if symbol.isalpha():
            num = ord(symbol) + key
            if num > ord('z'):
                num -= 26
            elif num < ord('a'):
                num += 26
            translated += chr(num)
        else:
            translated += symbol
    return translated

print(caesarCipher('e', 'm ahm3d', -3))

تم تعديل هذه المشاركة بواسطة m ahmed في 26 يونيو 2014 في 04:28

1
#16

حل جيد

 

الآن هدفنا هو تطوير هذه الخوارزمية لتشفر أيضا الرموز و الأحرف العربية

#17

السلام عليكم

 

هذا البرنامج يقوم بتشفير جميع الرموز ولغات العالم لكن هناك عيب هو أن يقوم بطباعة الحروف المشفرة

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

معها.

class Encrypt():
    def __init__(self):
        self.keyLimits = 50
        self.msg = None
        self.key = None
        self.oper = None
        self.encryptedMsg = []
        
    def start(self):
        self.setOper()
        self.setKey()
        self.setMsg()
        self.encrypt()
        
        
    def printEncMsg(self):
        
        for i in self.encryptedMsg:
            print(i, end=" ")
        print("\n")
        
    def printDecMsg(self):
        for i in self.encryptedMsg:
            print(chr(i), end="")
        print("\n")
            
    def encrypt(self):
        
        self.encryptedMsg = []
        if self.oper :
            for i in self.msg:
                self.encryptedMsg.append( ord(i) + self.key)
            self.printEncMsg()
        else:
            msg = self.msg.split(" ")
            for i in msg:
                    if i.isdigit():
                        self.encryptedMsg.append(int(i) - self.key)
            self.printDecMsg()
       
    def setOper(self):
        oper = input("Enter operation type E/encryption D/decryption.\n")
        if not oper == '':
            if oper.upper() == "E":
                self.oper = True
            elif oper.upper() == "D":
                self.oper = False
            else:
                print("Invalid operation type.\n")
                self.setOper()
        else:
            print("You must enter operation type.\n")
            answer = input("Do you want exit the programme? y/n\n")
            if not answer == "y":
                self.setOper()
            else:
                exit(1)
            
    def setKey(self):
        key = input("Enter your key between 1 and %s : \n" % self.keyLimits)
        if not key == '':
            if key.isdigit():
                if int(key) >= 1 and int(key) <= self.keyLimits:
                    self.key = int(key)
                else:
                    print("Key out of range.\n")
                    self.setKey()
            else:
                print("Invalid key.\n")
                self.setKey()
        else:
            print("You must enter key.\n")
            answer = input("Do you want exit the programme? y/n\n")
            if not answer == "y":
                self.setKey()
            else:
                exit(1)
            
    def setMsg(self):
        msg = input("Enter your message: \n")
        if not msg == '':
            self.msg = msg
        else:
            print("Invalid message.\n")
            answer = input("Do you want exit the programme? y/n\n")
            if not answer == "y":
                self.setMsg()
            else:
                exit(1)
if __name__ == "__main__":
    d = Encrypt()
    while True:
        d.start()

تم تعديل هذه المشاركة بواسطة biginner2000 في 26 يونيو 2014 في 21:34

#18
biginner2000  آسف جدا على التأخير في الرد

 

لقد رأيت مشاركتك لكني كنت مشغول الآن فقد راجعت برنامج

 

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

 

لي بعض الملاحظات:

 

1:أولا أنت قلت أن هذا الكود يشفر جميع لغات العالم و هذا غير صحيح

 

أنت وضفت الدالة ord   و التي تعطينا ترتيب الرمز أو الحرف بنظام  ال ascii

 

بهذا النظام لا توجد حروف عربية و لا هندية و لا صينية توجد الحروف اللاتينية ال 26 المعروفة و الرموز فقط

 

2:لو كان بالنص الأصلي حرف z  مثلا بالنص المشفر يسيون الناتج رمز و ليس حرف و هذا خطأ لأن مبدأ خوارزمية قيصر يحول الحروف لحروف أخرى و لا يحولها لرموز كما أن الرموز تبقي على حالها و لا تحول

 

3:المفتاح غير محدد ،صحيح أنه من 0 ل 25 لكن نستطيع التحكم بذلك بإستعمال ال mod  (%) 

#19

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

 

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

 

إن كان النص يحتوي حروف كبيرة و صغير يجب أن يشفر على هذا الأساس أي أن الحرف كبير يبقي كبيرا بالتشفير و الصغير كذلك

 

لأنه إن جعلنا كل الحروف صغير و شفرناها ثم فككنا التشفير فإن النص الناتج سيكون مختلف عن النص الأول

 

هذا بالنسبة لللاتينية

 

أم العربية فكما نعلم للحرف الواحد عدة كتابات مثلا الألف: ا أ إ

 

يجب مراعات هذا الجانب

 

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

 

و بعدها ننتقل لفك التشفير و التشفير بطرائق أخرى

#20
اقتباس

 

  آسف جدا على التأخير في الرد

 

لقد رأيت مشاركتك لكني كنت مشغول الآن فقد راجعت برنامج

 

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

 

لي بعض الملاحظات:

 

1:أولا أنت قلت أن هذا الكود يشفر جميع لغات العالم و هذا غير صحيح

 

أنت وضفت الدالة ord   و التي تعطينا ترتيب الرمز أو الحرف بنظام  ال ascii

 

بهذا النظام لا توجد حروف عربية و لا هندية و لا صينية توجد الحروف اللاتينية ال 26 المعروفة و الرموز فقط

 

2:لو كان بالنص الأصلي حرف z  مثلا بالنص المشفر يسيون الناتج رمز و ليس حرف و هذا خطأ لأن مبدأ خوارزمية قيصر يحول الحروف لحروف أخرى و لا يحولها لرموز كما أن الرموز تبقي على حالها و لا تحول

 

3:المفتاح غير محدد ،صحيح أنه من 0 ل 25 لكن نستطيع التحكم بذلك بإستعمال ال mod  (%) 

 

السلام عليكم

لاعليك أخي يبدو أن هناك فرق بين نسخ المفسر ففي النسخة 3 جميع المحارف

تخزن على شكل unicode

 

أما بالنسبة الملاحظة الأولى فمعك حق فقد جربت جميع اللغات الموجودة في المترجم غوغل فلم يستطع المحرر التعامل مع حروف اللو و الخمير

 

بالنسبة لدالة ord في النسخة 3 تعيد عدد يمثل رمز يونكود حسب توثيق النسخة 3

https://docs.python.org/3/library/functions.html#ord

 

الملاحظة الثانية هنا  تكمن المشكلة كيف نعرف حدود أحرف اللغة المراد تشفيرها

الملاحظة الثالثة نعم  نستطيع التحكم بذلك إذا عرفنا حدود الأحرف.

1
#21

لقد صنعت برنامج موافق للشروط التي حددتها

 

لم يبدي أي عضو إعتراض على الشروط لذا أظن أنها مقبولة

#-*- coding: UTF-8 -*-
arab=u'اأإآبتةثجحخدذرزسشصضطظعغفقكلمنهويىءئؤ'
latin='abcdefghijklmnopqrstuvwxyz'
LATIN=latin.upper()
def Encryption(plain_text,key):
    Cipher=''
    for i in plain_text:
        if i in arab:
            Cipher+=arab[(arab.find(i)+key)%(len(arab))]
        elif i in latin:
            Cipher+=latin[(latin.find(i)+key)%(len(latin))]
        elif i in LATIN:
            Cipher+=LATIN[(LATIN.find(i)+key)%(len(LATIN))]
        else:
            Cipher+=i
    return Cipher
def Decrypt(Cipher_text,key):
    plain=''
    for i in Cipher_text:
        if i in arab:
            plain+=arab[(arab.find(i)-key)%len(arab)]
        elif i in latin:
            plain+=latin[(latin.find(i)-key)%len(latin)]
        elif i in LATIN:
            plain+=LATIN[(LATIN.find(i)-key)%len(LATIN)]
        else:
            plain+=i
    return plain

def main():
    choise=raw_input('put E for Encryption or D for Decrypt  :')
    key=input('put the key  :')
    message=raw_input('put the message :')
    if choise=='E':
        print Encryption(message,key)
    elif choise=='D':
        print Decrypt(message,key)
    else:
        main()
    main()
main()

هذا البرنامج يشفر الحروف العربية و اللاتينية

 

كما أنه يحافظ على ال capital

 

كما أنا يبقي الرموز و التعابير الخاصة على حالها و كذلك المسافات

 

قلت سابقا أننا سنجعل البرنامج إحترافي و بالواجهة الرسومية

 

إن رأيتم أنا هذا مفيد لكم فلنعمل على تطويره

 

المهم الآن أرجو أن تختبرو البرنامج و تناقشوه معي

 

و إن كنتم مهتمين بالموضوع نطور البرنامج كما قلت

 

في إنتضار تفاعلكم

#22

السلام عليكم هذه نسخ البرنامج حسب الطريقة التي حددها الأخ  kenham

#-*- coding: UTF-8 -*-
class Encryption():
    def __init__(self):
        self.arab=u'اأإآبتةثجحخدذرزسشصضطظعغفقكلمنهويىءئؤ'
        self.latin='abcdefghijklmnopqrstuvwxyz'
        self.LATIN= self.latin.upper()

    def Encryption(self, plain_text,key):
        Cipher=''
        for i in plain_text:
            if i in self.arab:
                Cipher+= self.arab[(self.arab.find(i)+key)%(len(self.arab))]
            elif i in self.latin:
                Cipher+= self.latin[(self.latin.find(i)+key)%(len(self.latin))]
            elif i in self.LATIN:
                Cipher+= self.LATIN[(self.LATIN.find(i)+key)%(len(self.LATIN))]
            else:
                Cipher+=i
        return Cipher

    def Decrypt(self, Cipher_text,key):
        plain=''
        for i in Cipher_text:
            if i in self.arab:
                plain+= self.arab[(self.arab.find(i)-key)%len(self.arab)]
            elif i in self.latin:
                plain+= self.latin[(self.latin.find(i)-key)%len(self.latin)]
            elif i in self.LATIN:
                plain+= self.LATIN[(self.LATIN.find(i)-key)%len(self.LATIN)]
            else:
                plain+=i
        return plain

    def main(self):
        choise=raw_input('put E for Encryption or D for Decrypt  :')
        key=input('put the key  :')
        message=raw_input('put the message :')
        if choise=='E':
            print self.Encryption(message,key)
        elif choise=='D':
            print self.Decrypt(message,key)
        else:
            self.main()
if __name__ == "__main__":
    d = Encryption()
    d.main()
# -*- coding: utf-8 -*-
from string import ascii_letters
class Encryption():
    def __init__(self):
        self.arab = u'اأإآبتةثجحخدذرزسشصضطظعغفقكلمنهويىءئؤ'
        self.msg  = None
        self.key  = None
        self.type = None
        self.encryptedMsg = ''
    def start(self):
        self.setType()
        self.setKey()
        self.setMsg()
        self.encrypt()
    def encrypt(self):
        self.encryptedMsg = ''
        for i in self.msg:
            if self.type:
                if i in ascii_letters:
                    self.encryptedMsg += ascii_letters[(ascii_letters.find(i) + self.key )% len(ascii_letters)]
                elif i in self.arab:
                    self.encryptedMsg += self.arab[(self.arab.find(i) + self.key) % len(self.arab)]
                else:
                    self.encryptedMsg += i      
            else:
                if i in ascii_letters:
                    self.encryptedMsg += ascii_letters[(ascii_letters.find(i) - self.key) % len(ascii_letters) ]
                elif i in self.arab:
                    self.encryptedMsg += self.arab[(self.arab.find(i) - self.key) % len(self.arab)]
                else:
                    self.encryptedMsg += i
        print self.encryptedMsg
    def setType(self):
        o_type = raw_input("Enter operation type E/encryption D/decryption.\n")
        if not o_type == '':
            if o_type.upper() == "E":
                self.type = True
            elif o_type.upper() == "D":
                self.type = False
            else:
                print("Invalid operation type.\n")
                self.setType()
        else:
            print("You must enter operation type.\n")
            answer = raw_input("Do you want exit the programme? y/n\n")
            if not answer == "y":
                self.setType()
            else:
                exit(1)
    def setKey(self):
        key = raw_input("Enter your key : \n" )
        if not key == '':
            if key.isdigit():
                self.key = int(key)   
            else:
                print("Invalid key.\n")
                self.setKey()
        else:
            print("You must enter key.\n")
            answer = raw_input("Do you want exit the programme? y/n\n")
            if not answer == "y":
                self.setKey()
            else:
                exit(1)
    def setMsg(self):
        msg = raw_input("Enter your message: \n")
        if not msg == '':
            self.msg = msg
        else:
            print("Invalid message.\n")
            answer = raw_input("Do you want exit the programme? y/n\n")
            if not answer == "y":
                self.setMsg()
            else:
                exit(1)
if __name__ == "__main__":
    d = Encryption()
    while True:
        d.start()
2
#23

احسنت اخي الغالي وجزاك الله الف خير

 

 

 

في المرحلة الاولى لي بالجامعة قمت بعمل برنامج بلغة فجول بيسك 6 لتشفير النصوص يتضمن طريقتين القيصر والـــ Revers

واكثر طريقة تشفير كنت احبها هي vernam cipher

 

 

احسنت وبأنتظار جديدك

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