logo

아핀 암호 구현

Affine 암호는 단일 알파벳 대체 암호의 한 유형으로, 알파벳의 각 문자가 간단한 수학 함수를 사용하여 암호화된 해당 숫자에 매핑되고 다시 문자로 변환됩니다. 사용된 공식은 각 문자가 다른 문자로 암호화되고 다시 암호화된다는 것을 의미합니다. 이는 암호가 본질적으로 어떤 문자가 어느 문자로 가는지를 제어하는 ​​규칙이 있는 표준 대체 암호임을 의미합니다. 
전체 프로세스는 모듈로 m(사용된 알파벳의 길이) 작업에 의존합니다. 아핀 암호에서 크기가 m인 알파벳 문자는 먼저 0 ~ m-1 범위의 정수에 매핑됩니다. 

Affine 암호의 '키'는 a와 b라고 부르는 2개의 숫자로 구성됩니다. 다음 설명에서는 26자 알파벳(m = 26)을 사용한다고 가정합니다. a는 m에 대해 상대적으로 소수로 선택되어야 합니다(즉, a는 m과 공통인자가 없어야 합니다). 

아핀 암호 값' title=

암호화

이는 모듈식 산술을 사용하여 각 일반 텍스트 문자에 해당하는 정수를 암호문 문자에 해당하는 다른 정수로 변환합니다. 단일 문자에 대한 암호화 기능은 다음과 같습니다.  

 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의 역)입니다.

예: 

아핀 암호' title=

구현:

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.  

산출
Encrypted Message is : UBBAHK CAPJKX Decrypted Message is: AFFINE CIPHER

 

퀴즈 만들기