Cifrul afin este un tip de cifr de substituție monoalfabetică în care fiecare literă dintr-un alfabet este mapată la echivalentul său numeric criptat folosind o funcție matematică simplă și convertită înapoi într-o literă. Formula folosită înseamnă că fiecare literă criptează cu o altă literă și înapoi, ceea ce înseamnă că cifrul este în esență un cifr de substituție standard, cu o regulă care guvernează ce literă merge la care.
Întregul proces se bazează pe modul m de lucru (lungimea alfabetului utilizat). În cifrul afin, literele unui alfabet de mărimea m sunt mai întâi mapate la numerele întregi din intervalul 0 … m-1.
„Cheia” pentru cifrul Affine constă din 2 numere pe care le vom numi a și b. Următoarea discuție presupune utilizarea unui alfabet de 26 de caractere (m = 26). a ar trebui ales să fie relativ prim pentru m (adică a nu ar trebui să aibă factori în comun cu m).

numere pentru alfabet
Criptare
Utilizează aritmetica modulară pentru a transforma numărul întreg căruia îi corespunde fiecare literă de text simplu într-un alt număr întreg care corespunde unei litere de text cifrat. Funcția de criptare pentru o singură literă este
metode cu șiruri
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.
Decriptare
În descifrarea textului cifrat, trebuie să îndeplinim funcțiile opuse (sau inverse) asupra textului cifrat pentru a prelua textul simplu. Încă o dată, primul pas este să convertiți fiecare dintre literele de text cifrat în valorile lor întregi. Funcția de decriptare este
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 .
Pentru a găsi o inversă multiplicativă
Trebuie să găsim un număr x astfel încât:
Dacă găsim numărul x astfel încât ecuația este adevărată, atunci x este inversul lui a și îl numim a^-1. Cel mai simplu mod de a rezolva această ecuație este să căutați fiecare dintre numerele de la 1 la 25 și să vedeți care dintre ele satisface ecuația.
[gxd] = gcd(am); % we can ignore g and d we dont need them x = mod(xm);
Dacă acum înmulțiți x și a și reduceți rezultatul (mod 26), veți obține răspunsul 1. Amintiți-vă că aceasta este doar definiția unui invers, adică dacă a*x = 1 (mod 26), atunci x este inversul lui a (și a este inversul lui x)
Exemplu:
cina vs cina

Implementare:
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.
Ieșire
Encrypted Message is : UBBAHK CAPJKX Decrypted Message is: AFFINE CIPHER
Creați un test