logo

Implementierung der affinen Verschlüsselung

Die affine Chiffre ist eine Art monoalphabetische Substitutions-Chiffre, bei der jeder Buchstabe in einem Alphabet seinem numerischen Äquivalent zugeordnet wird, das mit einer einfachen mathematischen Funktion verschlüsselt und wieder in einen Buchstaben umgewandelt wird. Die verwendete Formel bedeutet, dass jeder Buchstabe in einen anderen Buchstaben und wieder zurück verschlüsselt wird, was bedeutet, dass es sich bei der Chiffre im Wesentlichen um eine Standard-Ersetzungs-Chiffre mit einer Regel handelt, die bestimmt, welcher Buchstabe zu welchem ​​gehört. 
Der gesamte Prozess basiert auf der Arbeit mit Modulo m (der Länge des verwendeten Alphabets). Bei der affinen Chiffre werden die Buchstaben eines Alphabets der Größe m zunächst auf die ganzen Zahlen im Bereich 0 … m-1 abgebildet. 

Der „Schlüssel“ für die affine Chiffre besteht aus zwei Zahlen, die wir a und b nennen. Die folgende Diskussion geht von der Verwendung eines 26-stelligen Alphabets aus (m = 26). a sollte relativ prim zu m gewählt werden (d. h. a sollte keine Faktoren gemeinsam mit m haben). 

affine Verschlüsselungswerte' title=



Blockieren Sie YouTube-Werbung auf Android

Verschlüsselung

Es verwendet modulare Arithmetik, um die ganze Zahl, die jedem Klartextbuchstaben entspricht, in eine andere ganze Zahl umzuwandeln, die einem Chiffretextbuchstaben entspricht. Die Verschlüsselungsfunktion für einen einzelnen Buchstaben ist  

 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.

Entschlüsselung

Bei der Entschlüsselung des Chiffretexts müssen wir die entgegengesetzten (oder inversen) Funktionen am Chiffretext ausführen, um den Klartext abzurufen. Auch hier besteht der erste Schritt darin, jeden der Chiffretextbuchstaben in seine ganzzahligen Werte umzuwandeln. Die Entschlüsselungsfunktion ist  

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 .

Eine multiplikative Umkehrung finden  

Wie viele Tasten haben Tastaturen?

Wir müssen eine Zahl x finden, so dass: 
Wenn wir die Zahl x finden, sodass die Gleichung wahr ist, dann ist x die Umkehrung von a und wir nennen sie a^-1. Der einfachste Weg, diese Gleichung zu lösen, besteht darin, jede der Zahlen 1 bis 25 zu durchsuchen und herauszufinden, welche die Gleichung erfüllt. 

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

Wenn Sie nun x und a multiplizieren und das Ergebnis reduzieren (Mod 26), erhalten Sie die Antwort 1. Denken Sie daran, dass dies nur die Definition einer Umkehrung ist, d. h. wenn a*x = 1 (Mod 26), dann ist x eine Umkehrung von a (und a ist eine Umkehrung von x).

Beispiel: 

affine Chiffre' title=

Durchführung:

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.  

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

 

Quiz erstellen