Implementação de Cifra Afim
A cifra afim é um tipo de cifra de substituição monoalfabética em que cada letra de um alfabeto é mapeada para seu equivalente numérico, criptografada usando uma função matemática simples e convertida novamente em uma letra. A fórmula usada significa que cada letra é criptografada em uma outra letra e vice-versa, o que significa que a cifra é essencialmente uma cifra de substituição padrão com uma regra que rege qual letra vai para qual.
Todo o processo depende do módulo de trabalho m (o comprimento do alfabeto utilizado). Na cifra afim, as letras de um alfabeto de tamanho m são primeiro mapeadas para os inteiros no intervalo 0… m-1.
A 'chave' para a cifra Afim consiste em 2 números que chamaremos de a e b. A discussão a seguir pressupõe o uso de um alfabeto de 26 caracteres (m = 26). a deve ser escolhido para ser relativamente primo de m (ou seja, a não deve ter fatores em comum com m).
Criptografia
Ele usa aritmética modular para transformar o inteiro ao qual cada letra do texto simples corresponde em outro inteiro que corresponde a uma letra do texto cifrado. A função de criptografia para uma única letra é
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.
Descriptografia
Ao decifrar o texto cifrado, devemos executar as funções opostas (ou inversas) no texto cifrado para recuperar o texto simples. Mais uma vez, o primeiro passo é converter cada uma das letras do texto cifrado em seus valores inteiros. A função de descriptografia é
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 .
Para encontrar um inverso multiplicativo
Precisamos encontrar um número x tal que:
Se encontrarmos o número x tal que a equação seja verdadeira, então x é o inverso de a e chamamos isso de a^-1. A maneira mais fácil de resolver esta equação é pesquisar cada um dos números de 1 a 25 e ver qual deles satisfaz a equação.
[gxd] = gcd(am); % we can ignore g and d we dont need them x = mod(xm);
Se você agora multiplicar x e a e reduzir o resultado (mod 26), obterá a resposta 1. Lembre-se de que esta é apenas a definição de um inverso, ou seja, se a*x = 1 (mod 26), então x é um inverso de a (e a é um inverso de x)
Exemplo:
Implementação:
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.
Saída
Encrypted Message is : UBBAHK CAPJKX Decrypted Message is: AFFINE CIPHER
Criar questionário