Afininis šifras yra monoalbėcinio pakeitimo šifro tipas, kai kiekviena abėcėlės raidė susieta su jos skaitiniu ekvivalentu, užšifruota naudojant paprastą matematinę funkciją ir konvertuojama atgal į raidę. Naudojama formulė reiškia, kad kiekviena raidė šifruojama į vieną kitą raidę ir vėl atgal, o tai reiškia, kad šifras iš esmės yra standartinis pakeitimo šifras su taisykle, reglamentuojančia, kuri raidė kuriai eina.
Visas procesas priklauso nuo darbo modulo m (naudojamos abėcėlės ilgio). Afininiame šifre m dydžio abėcėlės raidės pirmiausia susiejamos su sveikaisiais skaičiais intervale 0 … m-1.
Affine šifro „raktas“ susideda iš 2 skaičių, kuriuos vadinsime a ir b. Tolesnėje diskusijoje daroma prielaida, kad naudojama 26 simbolių abėcėlė (m = 26). a turėtų būti pasirinktas santykinai pirminis m (t. y. a neturėtų turėti bendrų veiksnių su m).

Šifravimas
Ji naudoja modulinę aritmetiką, kad paverstų sveikąjį skaičių, kurį atitinka kiekviena paprastojo teksto raidė, į kitą sveikąjį skaičių, atitinkantį šifruoto teksto raidę. Vienos raidės šifravimo funkcija yra
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.
Iššifravimas
Iššifruodami šifruotą tekstą turime atlikti priešingas (arba atvirkštines) šifruoto teksto funkcijas, kad gautume paprastą tekstą. Dar kartą pirmas žingsnis yra konvertuoti kiekvieną šifruoto teksto raidę į sveikąsias reikšmes. Iššifravimo funkcija yra
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 .
Norėdami rasti daugybos atvirkštinį
Turime rasti skaičių x, kad:
Jei rasime skaičių x tokį, kad lygtis yra teisinga, tada x yra atvirkštinė a ir vadiname a^-1. Lengviausias būdas išspręsti šią lygtį – ieškoti kiekvieno iš skaičių nuo 1 iki 25 ir pažiūrėti, kuris iš jų atitinka lygtį.
[gxd] = gcd(am); % we can ignore g and d we dont need them x = mod(xm);
Jei dabar padauginsite x ir a ir sumažinsite rezultatą (mod. 26), gausite atsakymą 1. Atminkite, kad tai tik atvirkštinio apibrėžimas, t. y. jei a*x = 1 (mod 26), tai x yra atvirkštinė a (o a yra atvirkštinė x)
Pavyzdys:

Įgyvendinimas:
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.
Išvestis
Encrypted Message is : UBBAHK CAPJKX Decrypted Message is: AFFINE CIPHER
Sukurti viktoriną