تنفيذ Affine Cipher

تنفيذ Affine Cipher

تشفير Affine هو نوع من التشفير البديل أحادي الأبجدية حيث يتم تعيين كل حرف في الأبجدية إلى مكافئه الرقمي المشفر باستخدام وظيفة رياضية بسيطة وتحويله مرة أخرى إلى حرف. الصيغة المستخدمة تعني أن كل حرف يتم تشفيره إلى حرف آخر والعودة مرة أخرى مما يعني أن التشفير هو في الأساس تشفير بديل قياسي مع قاعدة تحكم أي حرف يذهب إلى أي حرف. 
تعتمد العملية برمتها على وحدة العمل m (طول الأبجدية المستخدمة). في التشفير المتقارب، يتم أولاً تعيين أحرف الأبجدية ذات الحجم m إلى الأعداد الصحيحة في النطاق 0 ... m-1. 

يتكون "مفتاح" تشفير Affine من رقمين سنسميهما a وb. تفترض المناقشة التالية استخدام أبجدية مكونة من 26 حرفًا (م = 26). ينبغي اختيار a ليكون أوليًا نسبيًا لـ m (أي يجب ألا يكون له أي عوامل مشتركة مع m). 

قيم التشفير التقاربي

التشفير

ويستخدم الحساب المعياري لتحويل العدد الصحيح الذي يتوافق معه كل حرف نص عادي إلى عدد صحيح آخر يتوافق مع حرف النص المشفر. وظيفة التشفير لحرف واحد هي  

 E ( x ) = ( a x + b ) mod m modulus m: size of the alphabet a and b: key of the cipher. a must be chosen such that a and m are coprime. 

فك التشفير

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

D ( x ) = a^-1 ( x - b ) mod m a^-1 : modular multiplicative inverse of a modulo m. i.e. it satisfies the equation 1 = a a^-1 mod m . 

لإيجاد معكوس الضرب  

نحتاج إلى العثور على الرقم x بحيث يكون: 
إذا وجدنا الرقم x بحيث تكون المعادلة صحيحة فإن x هو معكوس a ونسميه a^-1. أسهل طريقة لحل هذه المعادلة هي البحث في كل رقم من الأرقام من 1 إلى 25 ومعرفة أي منها يحقق المعادلة. 

[gxd] = gcd(am); % we can ignore g and d we dont need them x = mod(xm);  

إذا قمت الآن بضرب x وa وتقليل النتيجة (mod 26) فستحصل على الإجابة 1. تذكر أن هذا مجرد تعريف معكوس، أي إذا كان a*x = 1 (mod 26) فإن x هو معكوس a (و a هو معكوس x)

مثال: 

التشفير تقاربي

تطبيق:

C++
   //CPP program to illustrate Affine Cipher   #include       using     namespace     std  ;   //Key values of a and b   const     int     a     =     17  ;   const     int     b     =     20  ;   string     encryptMessage  (  string     msg  )   {      ///Cipher Text initially empty      string     cipher     =     ''  ;         for     (  int     i     =     0  ;     i      <     msg  .  length  ();     i  ++  )      {      // Avoid space to be encrypted       if  (  msg  [  i  ]  !=  ' '  )         /* applying encryption formula ( a x + b ) mod m    {here x is msg[i] and m is 26} and added 'A' to     bring it in range of ascii alphabet[ 65-90 | A-Z ] */      cipher     =     cipher     +         (  char  )     ((((  a     *     (  msg  [  i  ]  -  'A'  )     )     +     b  )     %     26  )     +     'A'  );      else      //else simply append space character      cipher     +=     msg  [  i  ];         }      return     cipher  ;   }   string     decryptCipher  (  string     cipher  )   {      string     msg     =     ''  ;      int     a_inv     =     0  ;      int     flag     =     0  ;          //Find a^-1 (the multiplicative inverse of a       //in the group of integers modulo m.)       for     (  int     i     =     0  ;     i      <     26  ;     i  ++  )      {      flag     =     (  a     *     i  )     %     26  ;          //Check if (a*i)%26 == 1      //then i will be the multiplicative inverse of a      if     (  flag     ==     1  )      {         a_inv     =     i  ;      }      }      for     (  int     i     =     0  ;     i      <     cipher  .  length  ();     i  ++  )      {      if  (  cipher  [  i  ]  !=  ' '  )      /*Applying decryption formula a^-1 ( x - b ) mod m     {here x is cipher[i] and m is 26} and added 'A'     to bring it in range of ASCII alphabet[ 65-90 | A-Z ] */      msg     =     msg     +         (  char  )     (((  a_inv     *     ((  cipher  [  i  ]  +  'A'     -     b  ))     %     26  ))     +     'A'  );      else      //else simply append space character      msg     +=     cipher  [  i  ];         }      return     msg  ;   }   //Driver Program   int     main  (  void  )   {      string     msg     =     'AFFINE CIPHER'  ;          //Calling encryption function      string     cipherText     =     encryptMessage  (  msg  );      cout      < <     'Encrypted Message is : '      < <     cipherText   < <  endl  ;          //Calling Decryption function      cout      < <     'Decrypted Message is: '      < <     decryptCipher  (  cipherText  );      return     0  ;   }   
Java
   // Java program to illustrate Affine Cipher   class   GFG      {      // Key values of a and b      static     int     a     =     17  ;      static     int     b     =     20  ;      static     String     encryptMessage  (  char  []     msg  )         {      /// Cipher Text initially empty      String     cipher     =     ''  ;      for     (  int     i     =     0  ;     i      <     msg  .  length  ;     i  ++  )      {      // Avoid space to be encrypted       /* applying encryption formula ( a x + b ) mod m    {here x is msg[i] and m is 26} and added 'A' to     bring it in range of ascii alphabet[ 65-90 | A-Z ] */         if     (  msg  [  i  ]     !=     ' '  )         {      cipher     =     cipher      +     (  char  )     ((((  a     *     (  msg  [  i  ]     -     'A'  ))     +     b  )     %     26  )     +     'A'  );      }     else     // else simply append space character      {      cipher     +=     msg  [  i  ]  ;      }      }      return     cipher  ;      }      static     String     decryptCipher  (  String     cipher  )         {      String     msg     =     ''  ;      int     a_inv     =     0  ;      int     flag     =     0  ;      //Find a^-1 (the multiplicative inverse of a       //in the group of integers modulo m.)       for     (  int     i     =     0  ;     i      <     26  ;     i  ++  )         {      flag     =     (  a     *     i  )     %     26  ;      // Check if (a*i)%26 == 1      // then i will be the multiplicative inverse of a      if     (  flag     ==     1  )         {      a_inv     =     i  ;      }      }      for     (  int     i     =     0  ;     i      <     cipher  .  length  ();     i  ++  )         {      /*Applying decryption formula a^-1 ( x - b ) mod m     {here x is cipher[i] and m is 26} and added 'A'     to bring it in range of ASCII alphabet[ 65-90 | A-Z ] */         if     (  cipher  .  charAt  (  i  )     !=     ' '  )         {      msg     =     msg     +     (  char  )     (((  a_inv     *         ((  cipher  .  charAt  (  i  )     +     'A'     -     b  ))     %     26  ))     +     'A'  );      }         else     //else simply append space character      {      msg     +=     cipher  .  charAt  (  i  );      }      }      return     msg  ;      }      // Driver code      public     static     void     main  (  String  []     args  )         {      String     msg     =     'AFFINE CIPHER'  ;      // Calling encryption function      String     cipherText     =     encryptMessage  (  msg  .  toCharArray  ());      System  .  out  .  println  (  'Encrypted Message is : '     +     cipherText  );      // Calling Decryption function      System  .  out  .  println  (  'Decrypted Message is: '     +     decryptCipher  (  cipherText  ));      }   }   // This code contributed by Rajput-Ji   
Python
   # Implementation of Affine Cipher in Python   # Extended Euclidean Algorithm for finding modular inverse   # eg: modinv(7 26) = 15   def   egcd  (  a     b  ):   x    y     u    v   =   0    1     1    0   while   a   !=   0  :   q     r   =   b  //  a     b  %  a   m     n   =   x  -  u  *  q     y  -  v  *  q   b    a     x    y     u    v   =   a    r     u    v     m    n   gcd   =   b   return   gcd     x     y   def   modinv  (  a     m  ):   gcd     x     y   =   egcd  (  a     m  )   if   gcd   !=   1  :   return   None   # modular inverse does not exist   else  :   return   x   %   m   # affine cipher encryption function    # returns the cipher text   def   affine_encrypt  (  text     key  ):      '''    C = (a*P + b) % 26    '''   return   ''  .  join  ([   chr  (((   key  [  0  ]  *  (  ord  (  t  )   -   ord  (  'A'  ))   +   key  [  1  ]   )   %   26  )   +   ord  (  'A'  ))   for   t   in   text  .  upper  ()  .  replace  (  ' '     ''  )   ])   # affine cipher decryption function    # returns original text   def   affine_decrypt  (  cipher     key  ):      '''    P = (a^-1 * (C - b)) % 26    '''   return   ''  .  join  ([   chr  (((   modinv  (  key  [  0  ]   26  )  *  (  ord  (  c  )   -   ord  (  'A'  )   -   key  [  1  ]))   %   26  )   +   ord  (  'A'  ))   for   c   in   cipher   ])   # Driver Code to test the above functions   def   main  ():   # declaring text and key   text   =   'AFFINE CIPHER'   key   =   [  17     20  ]   # calling encryption function   affine_encrypted_text   =   affine_encrypt  (  text     key  )   print  (  'Encrypted Text:   {}  '  .  format  (   affine_encrypted_text   ))   # calling decryption function   print  (  'Decrypted Text:   {}  '  .  format   (   affine_decrypt  (  affine_encrypted_text     key  )   ))   if   __name__   ==   '__main__'  :   main  ()   # This code is contributed by   # Bhushan Borole   
C#
   // C# program to illustrate Affine Cipher   using     System  ;       class     GFG      {      // Key values of a and b      static     int     a     =     17  ;      static     int     b     =     20  ;      static     String     encryptMessage  (  char  []     msg  )         {      /// Cipher Text initially empty      String     cipher     =     ''  ;      for     (  int     i     =     0  ;     i      <     msg  .  Length  ;     i  ++  )      {      // Avoid space to be encrypted       /* applying encryption formula ( a x + b ) mod m    {here x is msg[i] and m is 26} and added 'A' to     bring it in range of ascii alphabet[ 65-90 | A-Z ] */      if     (  msg  [  i  ]     !=     ' '  )         {      cipher     =     cipher      +     (  char  )     ((((  a     *     (  msg  [  i  ]     -     'A'  ))     +     b  )     %     26  )     +     'A'  );      }     else     // else simply append space character      {      cipher     +=     msg  [  i  ];      }      }      return     cipher  ;      }      static     String     decryptCipher  (  String     cipher  )         {      String     msg     =     ''  ;      int     a_inv     =     0  ;      int     flag     =     0  ;      //Find a^-1 (the multiplicative inverse of a       //in the group of integers modulo m.)       for     (  int     i     =     0  ;     i      <     26  ;     i  ++  )         {      flag     =     (  a     *     i  )     %     26  ;      // Check if (a*i)%26 == 1      // then i will be the multiplicative inverse of a      if     (  flag     ==     1  )         {      a_inv     =     i  ;      }      }      for     (  int     i     =     0  ;     i      <     cipher  .  Length  ;     i  ++  )         {      /*Applying decryption formula a^-1 ( x - b ) mod m     {here x is cipher[i] and m is 26} and added 'A'     to bring it in range of ASCII alphabet[ 65-90 | A-Z ] */      if     (  cipher  [  i  ]     !=     ' '  )         {      msg     =     msg     +     (  char  )     (((  a_inv     *         ((  cipher  [  i  ]     +     'A'     -     b  ))     %     26  ))     +     'A'  );      }         else     //else simply append space character      {      msg     +=     cipher  [  i  ];      }      }      return     msg  ;      }      // Driver code      public     static     void     Main  (  String  []     args  )         {      String     msg     =     'AFFINE CIPHER'  ;      // Calling encryption function      String     cipherText     =     encryptMessage  (  msg  .  ToCharArray  ());      Console  .  WriteLine  (  'Encrypted Message is : '     +     cipherText  );      // Calling Decryption function      Console  .  WriteLine  (  'Decrypted Message is: '     +     decryptCipher  (  cipherText  ));      }   }   /* This code contributed by PrinciRaj1992 */   
JavaScript
   //Javascript program to illustrate Affine Cipher   //Key values of a and b   let     a     =     17  ;   let     b     =     20  ;   function     encryptMessage  (  msg  )   {      ///Cipher Text initially empty      let     cipher     =     ''  ;         for     (  let     i     =     0  ;     i      <     msg  .  length  ;     i  ++  )      {      // Avoid space to be encrypted       if  (  msg  [  i  ]     !=  ' '  )         /* applying encryption formula ( a x + b ) mod m    {here x is msg[i] and m is 26} and added 'A' to     bring it in range of ascii alphabet[ 65-90 | A-Z ] */      cipher     =     cipher     +     String  .  fromCharCode  ((((  a     *     (  msg  [  i  ].  charCodeAt  (  0  )  -  65  )     )     +     b  )     %     26  )     +     65  );      else      //else simply append space character      cipher     +=     msg  [  i  ];         }      return     cipher  ;   }   function     decryptCipher  (  cipher  )   {      let     msg     =     ''  ;      let     a_inv     =     0  ;      let     flag     =     0  ;          //Find a^-1 (the multiplicative inverse of a       //in the group of integers modulo m.)       for     (  let     i     =     0  ;     i      <     26  ;     i  ++  )      {      flag     =     (  a     *     i  )     %     26  ;          //Check if (a*i)%26 == 1      //then i will be the multiplicative inverse of a      if     (  flag     ==     1  )      {         a_inv     =     i  ;      }      }      for     (  let     i     =     0  ;     i      <     cipher  .  length  ;     i  ++  )      {      if  (  cipher  [  i  ]  !=  ' '  )      /*Applying decryption formula a^-1 ( x - b ) mod m     {here x is cipher[i] and m is 26} and added 'A'     to bring it in range of ASCII alphabet[ 65-90 | A-Z ] */      msg     =     msg     +     String  .  fromCharCode  (((  a_inv     *     ((  cipher  [  i  ].  charCodeAt  (  0  )  +  65     -     b  ))     %     26  ))     +     65  );      else      //else simply append space character      msg     +=     cipher  [  i  ];         }      return     msg  ;   }   //Driver Program   let     msg     =     'AFFINE CIPHER'  ;   //Calling encryption function   let     cipherText     =     encryptMessage  (  msg  );   console  .  log  (  'Encrypted Message is : '     +     cipherText  );   //Calling Decryption function   console  .  log  (  'Decrypted Message is: '     +     decryptCipher  (  cipherText  ));   // The code is contributed by Arushi Jindal.    

الإخراج
Encrypted Message is : UBBAHK CAPJKX Decrypted Message is: AFFINE CIPHER 

 

إنشاء اختبار