Affinchifferet är en typ av monoalfabetisk substitutionschiffer där varje bokstav i ett alfabet mappas till sin numeriska ekvivalent krypterad med en enkel matematisk funktion och omvandlas tillbaka till en bokstav. Formeln som används innebär att varje bokstav krypterar till en annan bokstav och tillbaka igen, vilket betyder att chiffret i huvudsak är ett standardersättnings-chiffer med en regel som styr vilken bokstav som går till vilken.
Hela processen är beroende av att arbeta modulo m (längden på alfabetet som används). I det affina chifferet mappas först bokstäverna i ett alfabet med storleken m till heltal i intervallet 0 … m-1.
"Nyckeln" för Affine-chifferet består av 2 nummer som vi kallar dem a och b. Följande diskussion förutsätter användningen av ett alfabet med 26 tecken (m = 26). a bör väljas för att vara relativt prime till m (dvs. a bör inte ha några faktorer gemensamma med m).

Kryptering
Den använder modulär aritmetik för att omvandla det heltal som varje klartextbokstav motsvarar till ett annat heltal som motsvarar en chiffertextbokstav. Krypteringsfunktionen för en enda bokstav är
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.
Dekryptering
När vi dechiffrerar chiffertexten måste vi utföra motsatta (eller omvända) funktioner på chiffertexten för att hämta klartexten. Återigen är det första steget att konvertera var och en av chiffertextbokstäverna till deras heltalsvärden. Dekrypteringsfunktionen är
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 .
För att hitta en multiplikativ invers
Vi måste hitta ett nummer x så att:
Om vi hittar talet x så att ekvationen är sann så är x inversen av a och vi kallar det a^-1. Det enklaste sättet att lösa denna ekvation är att söka på var och en av talen 1 till 25 och se vilken som uppfyller ekvationen.
[gxd] = gcd(am); % we can ignore g and d we dont need them x = mod(xm);
Om du nu multiplicerar x och a och reducerar resultatet (mod 26) får du svaret 1. Kom ihåg att detta bara är definitionen av en invers, dvs om a*x = 1 (mod 26) så är x en invers av a (och a är en invers av x)
Exempel:

Genomförande:
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.
Produktion
Encrypted Message is : UBBAHK CAPJKX Decrypted Message is: AFFINE CIPHER
Skapa frågesport