اذهب إلى المحتوى
  • 0

كيفية قراءة ملف نصي وتشفيره محتواه بإستخدام بايثون؟

رياض الزايدي2

السؤال

كيف نقوم بقراءة ملف نصي وتشفيره وتخزين التشفير في ملف نصي جديد ويمكن للمستخدم فك تشفير متي يشاء

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

Recommended Posts

  • 0

يمكنك أن تستخدم الدالة open لقراءة الملفات، على نحو التالي:
 

f = open('filename.txt', 'r')
file_content = f.read()
print(file_content)

لاحظ أن حرف r الموجود في الدالة open يعني قراءة الملف read

أما بالنسبة لتشفير المحتوى، فيجب أن تُحدد طريقة التشفير والخوارزمية التي ستعتمد عليها في التشفير، لكي تستطيع أن تقوم بتشفير وفك تشفير المحتوى بشكل سليم، يوجد العديد من المكتبات التي تساعدك في هذه العملية مثل Crypto و cryptography، وتحتوي هذه المكتبات على العديد من خوارزميات التشفير مثل AES و RSA و fernet 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

بالنسبة لقراءة ملف نصي، فيمكنك قراءته كما ذكر سامح، والآن سأتحدث عن الجزء الثاني من سؤالك وهو تشفير النص.
هناك العديد من الطرق لتشفير النص، سأذكر بعضها:

  • التشفير الجمعي أو تشغير قيصر Additive cipher: في هذه الطريقة يُعطى كل حرف من أحرف الأبجدية قيمة رقمية تسند اليه حسب ترتيبه، كما في الجدول التالي:
    4.png.52bdd0c7b0e043e592b88c5dfaf84d26.png
    تؤخذ قيمة كل حرف من النص ويُجمع مع مفتاح التشفير ليكون الناتج هو الحرف المقابل في النص المشفر، وفق المعادلة التالية:
    C = (M + K) mod n
    النص المشفر = (النص الأصلي + مفتاح التشفير) باقي القسمة على n، حيث أن n تمثل عدد أحرف الأبجدية (في المثال أعلاه 36).وعملية فك التشفير هي عملية معاكسة لعملية التشفير، وبالتالي للقيام بعملية فك التشفير الجمعي نقوم بحساب النظير الجمعي لمفتاح التشفير ويُجمع مع رقم محرف النص المشفر ليكون الناتج هو الحرف المقابل في النص الأصلي، وفق المعادلة التالية:
    M = (C - K) mod 26

     

  • المشفر الجدائي Multiplicative cipher: بشكل مشابه للمشفر الجمعي، لكن هنا  بدلاً من الجمع يكون جداء.
    C=(M*k) mod n
    لكن توجد هناك شروط على المفتاح، وهو أن يكون أولياً مع عدد أحرف الأبجدية.
    ويكون فك التشفير من خلال عكس العملية السابقة:
    M=(C*k^-1) mod n
     

  • المشفر Affine: وهو مشفر يجمع بين الطريقتين السابقتين،وعليه فإن المُشفرين السابقين هما حالات خاصة من المشفر Affine ويتم التشفير وفقاً للمعادلة التالية:

    C=(M*k1+k2) mod n

    عندما تكون k1=1، يتحول إلى مُشفّر جمعي، وعندما k2=0، يتحول لمُشفّر ضربي.

الكود التالي هو تحقيق للمشفر Affine، قمت سابقاً بكتابته، ويمكنك استخدامه لتشفير وفك تشفير النصوص:

import numpy as np
import math 
# تعريف الأبجدية
alphabet1=['a', 'b', 'c', 'd','e', 'f', 'g', 'h', 'i',
          'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
          's', 't', 'u', 'v', 'w', 'x', 'y', 'z',0,1,2,3,4,5,6,7,8,9]
# تعريف تابع مساعد لإيجاد النظير الضربي 
def extendEuclidean(a, b, s1=1, s2=0, t1=0, t2=1):    
    if b:
        r=a%b
        return extendEuclidean(b, r, s2, s1-s2*(a//b), t2, t1-t2*(a//b))   
    return a, s1, t1

التابع التالي يقوم بعملية التشفير المطلوبة:
1. الوسيط الأول هو النص المطلوب تشفيره.
2. الوسيط الثاني هو الأبجدية التي تتعامل معها.
3. الوسيط الثالث هو قيمة المفتاح k1 (مفتاح الجداء).
4. الوسيط الرابع هو مفتاح الجمع k2.
5. الوسيط الخامس نضعه على True في حال كنت تريد إجراء تشفير Affine أو تشفير ضربي وذلك بغية التحقق من صلاحية مفتاح التشفير الذي تريد استخدامه.

# تعريف تابع التشفير
def affineEncoder(text,alphabet,kmul=1,kadd=0,isAffineOrMul=False):
    n=len(alphabet)
    if isAffineOrMul:
        if math.gcd(n,kmul)!=1:
            print("invalid key")
            return False
    index=np.arange(n)
    result=[]
    cipherDict1 =dict(zip(alphabet, index))
    cipherDict2 =dict(zip(index,alphabet))
    for i in text.lower():   
        if i.isdigit():
            i=int(i)
        result.append(str(cipherDict2[(cipherDict1[i]*kmul+kadd)%n]))
    return "".join(result)

التابع التالي هو تابع فك التشفير:

# تابع فك التشفير
def affineDencoder(text,alphabet,kmul=1,kadd=0,isAffineOrMul=False):
    n=len(alphabet)
    if isAffineOrMul:
        _,kmul,_=extendEuclidean(kmul,n)
    index=np.arange(n)
    result=[]
    cipherDict1 =dict(zip(alphabet, index))
    cipherDict2 =dict(zip(index,alphabet))
    for i in text.lower():   
        if i.isdigit():
            i=int(i)
        result.append(str(cipherDict2[((cipherDict1[i]-kadd)*kmul)%n]))
    return "".join(result)

على سبيل المثال:

# mul Encoder
# zend سأشفر الكلمة التالية
affineEncoder("zend",alphabet2,kmul=5,isAffineOrMul=True)
# فتكون الكلمة بعد التشفير 'vunp'
# الآن سنفك التشفير
affineDencoder("vunp",alphabet2,kmul=5,isAffineOrMul=True)
# 'zend'


هناك العديد من المشفرات الأخرى التي يمكن استخدامها، وأشهرها Hill و Playfair و ADV و AutoKey و RC4 و Vigenère cipher إلخ.. وتختلف عن بعضها في مدى تعقيد عملية التشفير وقوته وصعوبة كسره.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...