logo

Implementatie van Affine Cipher

Het Affiene cijfer is een type monoalfabetisch substitutiecijfer waarbij elke letter in een alfabet wordt toegewezen aan het numerieke equivalent ervan, gecodeerd met behulp van een eenvoudige wiskundige functie en weer omgezet in een letter. De gebruikte formule betekent dat elke letter wordt gecodeerd naar een andere letter en weer terug, wat betekent dat het cijfer in wezen een standaard vervangingscijfer is met een regel die bepaalt welke letter naar welke gaat. 
Het hele proces is afhankelijk van het werken modulo m (de lengte van het gebruikte alfabet). In het affiene cijfer worden de letters van een alfabet met grootte m eerst toegewezen aan de gehele getallen in het bereik 0 … m-1. 

De 'sleutel' voor het Affine-cijfer bestaat uit 2 getallen, we noemen ze a en b. De volgende bespreking gaat uit van het gebruik van een alfabet van 26 tekens (m = 26). a moet zo worden gekozen dat deze relatief priem is ten opzichte van m (dat wil zeggen dat a geen factoren gemeen moet hebben met m). 

affiene cijferwaarden' title=



Encryptie

Het maakt gebruik van modulaire rekenkunde om het gehele getal waarmee elke leesbare letter overeenkomt, om te zetten in een ander geheel getal dat overeenkomt met een cijfertekstletter. De coderingsfunctie voor een enkele letter is  

 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.

Decryptie

Bij het ontcijferen van de cijfertekst moeten we de tegenovergestelde (of omgekeerde) functies op de cijfertekst uitvoeren om de leesbare tekst op te halen. Opnieuw is de eerste stap het converteren van elk van de cijfertekstletters naar hun gehele waarden. De decoderingsfunctie is  

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 .

Een multiplicatieve inverse vinden  

We moeten een getal x vinden zodat: 
Als we het getal x zo vinden dat de vergelijking waar is, dan is x het omgekeerde van a en noemen we het a^-1. De eenvoudigste manier om deze vergelijking op te lossen is door elk van de getallen 1 tot en met 25 te doorzoeken en te kijken welke aan de vergelijking voldoet. 

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

Als je nu x en a vermenigvuldigt en het resultaat verkleint (mod 26), krijg je het antwoord 1. Onthoud dat dit slechts de definitie is van een inverse, d.w.z. als a*x = 1 (mod 26), dan is x een inverse van a (en a is een inverse van x)

Voorbeeld: 

affiene cijfer' title=

Uitvoering:

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): xy uv = 01 10 while a != 0: q r = b//a b%a m n = x-u*q y-v*q ba xy uv = ar uv mn 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.  

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

 

Quiz maken