Implementacija afine šifre
Afina šifra je vrsta monoalfabetske supstitucijske šifre u kojoj se svako slovo u abecedi preslikava u svoj numerički ekvivalent šifriran pomoću jednostavne matematičke funkcije i pretvara natrag u slovo. Upotrijebljena formula znači da se svako slovo šifrira u jedno drugo slovo i natrag, što znači da je šifra u biti standardna zamjenska šifra s pravilom koje regulira koje slovo ide na koje.
Cijeli proces se oslanja na radni modulo m (duljina korištene abecede). U afinoj šifri slova abecede veličine m prvo se preslikavaju u cijele brojeve u rasponu 0 … m-1.
'Ključ' za afinu šifru sastoji se od 2 broja koja ćemo nazvati a i b. Sljedeća rasprava pretpostavlja korištenje abecede od 26 znakova (m = 26). a treba odabrati da bude relativno prost prema m (tj. a ne bi trebao imati zajedničkih faktora s m).
Šifriranje
Koristi modularnu aritmetiku za transformaciju cijelog broja kojem odgovara svako slovo otvorenog teksta u drugi cijeli broj koji odgovara slovu šifriranog teksta. Funkcija šifriranja za jedno slovo je
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.
Dešifriranje
U dešifriranju šifriranog teksta moramo izvršiti suprotne (ili obrnute) funkcije na šifriranom tekstu kako bismo dohvatili otvoreni tekst. Ponovno je prvi korak pretvaranje svakog slova šifriranog teksta u njihovu cjelobrojnu vrijednost. Funkcija dešifriranja je
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 .
Pronaći multiplikativni inverz
Moramo pronaći broj x takav da je:
Ako pronađemo broj x tako da je jednadžba točna, tada je x inverz od a i zovemo ga a^-1. Najlakši način da riješite ovu jednadžbu je da pretražite svaki od brojeva od 1 do 25 i vidite koji od njih zadovoljava jednadžbu.
[gxd] = gcd(am); % we can ignore g and d we dont need them x = mod(xm);
Ako sada pomnožite x i a i smanjite rezultat (mod 26), dobit ćete odgovor 1. Upamtite da je ovo samo definicija inverza, tj. ako je a*x = 1 (mod 26) tada je x inverz od a (a a je inverz od x)
Primjer:
Implementacija:
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 ): x y u v = 0 1 1 0 while a != 0 : q r = b // a b % a m n = x - u * q y - v * q b a x y u v = a r u v m n 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.
Izlaz
Encrypted Message is : UBBAHK CAPJKX Decrypted Message is: AFFINE CIPHER
Napravi kviz