التعرف على تشفير playfair cipher و بناء سكربتات تشفير وفك تشفير بعدة لغات - Programmer Tech

Programmer Tech

موقع تعليم مجاني يهتم بتعلم البرمجة و علوم الكمبيوتر, أمن المعلومات, القرصنة الأخلاقية, سكربتات

إعلان اعلى المقالة

الجمعة، 24 أبريل 2020

التعرف على تشفير playfair cipher و بناء سكربتات تشفير وفك تشفير بعدة لغات

 
playfair cipher

 

playfair cipher 

هو احد انواع التشفير و هي سهلة جداً لكن تحتاج إلى التركيز فقط وكما تحدثنا في الدرس السابق عن caesar cipher ويمكنك متابعة الدرس السابق من هنا اليوم سنقوم بشرح خوارزميات playfair cipher.

ماهو playfair cipher

يعتمد هذا النوع من التشفير على مجموعة من القوانين الذي يجب ان تعرفها حتى تستطيع فهم الخوارزميات, و تلك القوانين هي الذي تؤدي الى فهم ذلك النوع بطريقة بسيطة لذلك هيا بنا نبدأ خطوة بخطوة .
القانون الاول :
يجب ان يتساوي عدد حروف اللغة (الصفوف و الأعمدة) يعني إذا كنت تريد تشفير اللغة الإنجليزية ونحن نعرف ان عدد حروفها هي 26 وسيكون عدد الصفوف 5 و عدد الأعمدة 5 وسيكون هنالك حرف مندمج وهو i:j.

القانون الثاني :
يتم وضع المفتاح في البداية في الصفوف مع عدم تكرار الحروف.

القانون الثالث :
يتم تقطيع الكلمة المراد تشفيرها إلى سلسلة تحمل كل منها إلى حرفين مع عدم تكرار الحروف وهنا يتم التعويض للحرف المكرر x.

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




السكربتات المذكورة في الفيديو للتشفير وفك التشفير :

python |encryption|decryption

print'''
      -----------------------------
      -       Ahmed kaissar       -
      -    programmer-tech.com    -
      -           Data            -
      -----------------------------
'''
def matrix(key):
    matrix=[]
    for e in key.upper():
        if e not in matrix:
            matrix.append(e)
    alphabet="ABCDEFGHIKLMNOPQRSTUVWXYZ"
    
    for e in alphabet:
        if e not in matrix:
            matrix.append(e)    
    
    
    matrix_group=[]
    for e in range(5):
        matrix_group.append('')

    #Break it into 5*5
    matrix_group[0]=matrix[0:5]
    matrix_group[1]=matrix[5:10]
    matrix_group[2]=matrix[10:15]
    matrix_group[3]=matrix[15:20]
    matrix_group[4]=matrix[20:25]
    return matrix_group

def message_to_digraphs(message_original):
    
    message=[]
    for e in message_original:
        message.append(e)

    #Delet space
    for unused in range(len(message)):
        if " " in message:
            message.remove(" ")

    
    i=0
    for e in range(len(message)/2):
        if message[i]==message[i+1]:
            message.insert(i+1,'X')
        i=i+2

    
    if len(message)%2==1:
        message.append("X")
    
    i=0
    new=[]
    for x in xrange(1,len(message)/2+1):
        new.append(message[i:i+2])
        i=i+2
    return new

def find_position(key_matrix,letter):
    x=y=0
    for i in range(5):
        for j in range(5):
            if key_matrix[i][j]==letter:
                x=i
                y=j

    return x,y

def encrypt(message):
    message=message_to_digraphs(message)
    key_matrix=matrix(key)
    cipher=[]
    for e in message:
        p1,q1=find_position(key_matrix,e[0])
        p2,q2=find_position(key_matrix,e[1])
        if p1==p2:
            if q1==4:
                q1=-1
            if q2==4:
                q2=-1
            cipher.append(key_matrix[p1][q1+1])
            cipher.append(key_matrix[p1][q2+1])        
        elif q1==q2:
            if p1==4:
                p1=-1;
            if p2==4:
                p2=-1;
            cipher.append(key_matrix[p1+1][q1])
            cipher.append(key_matrix[p2+1][q2])
        else:
            cipher.append(key_matrix[p1][q2])
            cipher.append(key_matrix[p2][q1])
    return cipher

def cipher_to_digraphs(cipher):
    i=0
    new=[]
    for x in range(len(cipher)/2):
        new.append(cipher[i:i+2])
        i=i+2
    return new

def decrypt(cipher):    
    cipher=cipher_to_digraphs(cipher)
    key_matrix=matrix(key)
    plaintext=[]
    for e in cipher:
        p1,q1=find_position(key_matrix,e[0])
        p2,q2=find_position(key_matrix,e[1])
        if p1==p2:
            if q1==4:
                q1=-1
            if q2==4:
                q2=-1
            plaintext.append(key_matrix[p1][q1-1])
            plaintext.append(key_matrix[p1][q2-1])        
        elif q1==q2:
            if p1==4:
                p1=-1;
            if p2==4:
                p2=-1;
            plaintext.append(key_matrix[p1-1][q1])
            plaintext.append(key_matrix[p2-1][q2])
        else:
            plaintext.append(key_matrix[p1][q2])
            plaintext.append(key_matrix[p2][q1])

    for unused in range(len(plaintext)):
        if "X" in plaintext:
            plaintext.remove("X")
    
    output=""
    for e in plaintext:
        output+=e
    return output.lower()


print "Playfair Cipher"
order=input("Choose :\n1,Encrypting \n2,Decrypting\n")
if order==1:
    key=raw_input("Please input the key : ")
    message=raw_input("Please input the message : ")
    print "Encrypting: \n"+"Message: "+message
    print "Break the message into digraphs: "
    print message_to_digraphs(message)
    print "Matrix: "
    print matrix(key)
    print "Cipher: "
    print encrypt(message)
elif order==2:
    key=raw_input("Please input the key : ")
    cipher=raw_input("Please input the cipher text: ")
    #cipher="ILSYQFBWBMLIAFFQ"
    print "\nDecrypting: \n"+"Cipher: "+cipher
    print "Plaintext:"
    print decrypt(cipher)
else:
    print "Error"

c++ | decryption | encryption

#include <iostream>
#include <string>

using namespace std;
class playfair
{
public:
    void doIt( string k, string t, bool ij, bool e )
    {
    createGrid( k, ij ); getTextReady( t, ij, e );
    if( e ) doIt( 1 ); else doIt( -1 );
    display();
    }

private:
    void doIt( int dir )
    {
    int a, b, c, d; string ntxt;
    for( string::const_iterator ti = _txt.begin(); ti != _txt.end(); ti++ )
    {
        if( getCharPos( *ti++, a, b ) )
        if( getCharPos( *ti, c, d ) )
        {
            if( a == c )     { ntxt += getChar( a, b + dir ); ntxt += getChar( c, d + dir ); }
            else if( b == d ){ ntxt += getChar( a + dir, b ); ntxt += getChar( c + dir, d ); }
            else             { ntxt += getChar( c, b ); ntxt += getChar( a, d ); }
        }
    }
    _txt = ntxt;
    }

    void display()
    {
    cout << "\n\n OUTPUT:\n=========" << endl;
    string::iterator si = _txt.begin(); int cnt = 0;
    while( si != _txt.end() )
    {
        cout << *si; si++; cout << *si << " "; si++;
        if( ++cnt >= 26 ) cout << endl, cnt = 0;
    }
    cout << endl << endl;
    }

    char getChar( int a, int b )
    {
    return _m[ (b + 5) % 5 ][ (a + 5) % 5 ];
    }

    bool getCharPos( char l, int &a, int &b )
    {
    for( int y = 0; y < 5; y++ )
        for( int x = 0; x < 5; x++ )
        if( _m[y][x] == l )
        { a = x; b = y; return true; }

    return false;
    }

    void getTextReady( string t, bool ij, bool e )
    {
    for( string::iterator si = t.begin(); si != t.end(); si++ )
    {
        *si = toupper( *si ); if( *si < 65 || *si > 90 ) continue;
        if( *si == 'J' && ij ) *si = 'I';
        else if( *si == 'Q' && !ij ) continue;
        _txt += *si;
    }
    if( e )
    {
        string ntxt = ""; size_t len = _txt.length();
        for( size_t x = 0; x < len; x += 2 )
        {
        ntxt += _txt[x];
        if( x + 1 < len )
        {
            if( _txt[x] == _txt[x + 1] ) ntxt += 'X';
            ntxt += _txt[x + 1];
        }
        }
        _txt = ntxt;
    }
    if( _txt.length() & 1 ) _txt += 'X';
    }

    void createGrid( string k, bool ij )
    {
    if( k.length() < 1 ) k = "KEYWORD";
    k += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; string nk = "";
    for( string::iterator si = k.begin(); si != k.end(); si++ )
    {
        *si = toupper( *si ); if( *si < 65 || *si > 90 ) continue;
        if( ( *si == 'J' && ij ) || ( *si == 'Q' && !ij ) )continue;
        if( nk.find( *si ) == -1 ) nk += *si;
    }
    copy( nk.begin(), nk.end(), &_m[0][0] );
    }

    string _txt; char _m[5][5];
};

int main( int argc, char* argv[] )
{
    string key, i, txt; bool ij, e;
    cout << "(E)ncode or (D)ecode? "; getline( cin, i ); e = ( i[0] == 'e' || i[0] == 'E' );
    cout << "Enter a en/decryption key: "; getline( cin, key );
    cout << "I <-> J (Y/N): "; getline( cin, i ); ij = ( i[0] == 'y' || i[0] == 'Y' );
    cout << "Enter the text: "; getline( cin, txt );
    playfair pf; pf.doIt( key, txt, ij, e ); return system( "pause" );
}

لتحميل السكربتات على تيرمكس او لينكس بشكل مباشر من ترمنال عبر git clone

سكربت تشفير بالبايثون

سكربت تشفير بلغة سي بلس بلس

ليست هناك تعليقات:

إرسال تعليق

facebook

تسميات

تواصل معنا

Translate

أخر الافكار

من انا

authorمبرمجين ويب و محبين للتقنية و الشبكات و امن المعلومات و سوف نقدم لكم الافضل إن شاء الله
أعرف المزيد ←

نموذج الاتصال

الاسم

بريد إلكتروني *

رسالة *

اقسام