Implementering av Affine Cipher

Implementering av Affine Cipher

Affinchifferet är en typ av monoalfabetisk substitutionschiffer där varje bokstav i ett alfabet mappas till sin numeriska ekvivalent krypterad med en enkel matematisk funktion och omvandlas tillbaka till en bokstav. Formeln som används innebär att varje bokstav krypterar till en annan bokstav och tillbaka igen, vilket betyder att chiffret i huvudsak är ett standardersättnings-chiffer med en regel som styr vilken bokstav som går till vilken. 
Hela processen är beroende av att arbeta modulo m (längden på alfabetet som används). I det affina chifferet mappas först bokstäverna i ett alfabet med storleken m till heltal i intervallet 0 … m-1. 

"Nyckeln" för Affine-chifferet består av 2 nummer som vi kallar dem a och b. Följande diskussion förutsätter användningen av ett alfabet med 26 tecken (m = 26). a bör väljas för att vara relativt prime till m (dvs. a bör inte ha några faktorer gemensamma med m). 

affina chiffervärden

Kryptering

Den använder modulär aritmetik för att omvandla det heltal som varje klartextbokstav motsvarar till ett annat heltal som motsvarar en chiffertextbokstav. Krypteringsfunktionen för en enda bokstav är  

 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. 

Dekryptering

När vi dechiffrerar chiffertexten måste vi utföra motsatta (eller omvända) funktioner på chiffertexten för att hämta klartexten. Återigen är det första steget att konvertera var och en av chiffertextbokstäverna till deras heltalsvärden. Dekrypteringsfunktionen är  

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 . 

För att hitta en multiplikativ invers  

Vi måste hitta ett nummer x så att: 
Om vi ​​hittar talet x så att ekvationen är sann så är x inversen av a och vi kallar det a^-1. Det enklaste sättet att lösa denna ekvation är att söka på var och en av talen 1 till 25 och se vilken som uppfyller ekvationen. 

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

Om du nu multiplicerar x och a och reducerar resultatet (mod 26) får du svaret 1. Kom ihåg att detta bara är definitionen av en invers, dvs om a*x = 1 (mod 26) så är x en invers av a (och a är en invers av x)

Exempel: 

affint chiffer

Genomförande:

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.    

Produktion
Encrypted Message is : UBBAHK CAPJKX Decrypted Message is: AFFINE CIPHER 

 

Skapa frågesport