Implementation of Affine Cipher
The Affine cipher is a type of monoalphabetic substitution cipher, wherein each letter in an alphabet is mapped to its numeric equivalent, encrypted using a simple mathematical function, and converted back to a letter. The formula used means that each letter encrypts to one other letter, and back again, meaning the cipher is essentially a standard substitution cipher with a rule governing which letter goes to which.
The whole process relies on working modulo m (the length of the alphabet used). In the affine cipher, the letters of an alphabet of size m are first mapped to the integers in the range 0 … m-1.
The ‘key’ for the Affine cipher consists of 2 numbers, we’ll call them a and b. The following discussion assumes the use of a 26 character alphabet (m = 26). a should be chosen to be relatively prime to m (i.e. a should have no factors in common with m).
Encryption
It uses modular arithmetic to transform the integer that each plaintext letter corresponds to into another integer that correspond to a ciphertext letter. The encryption function for a single letter is
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.
Decryption
In deciphering the ciphertext, we must perform the opposite (or inverse) functions on the ciphertext to retrieve the plaintext. Once again, the first step is to convert each of the ciphertext letters into their integer values. The decryption function is
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 .
To find a multiplicative inverse
We need to find a number x such that:
If we find the number x such that the equation is true, then x is the inverse of a, and we call it a^-1. The easiest way to solve this equation is to search each of the numbers 1 to 25, and see which one satisfies the equation.
[g,x,d] = gcd(a,m); % we can ignore g and d, we dont need them
x = mod(x,m);
If you now multiply x and a and reduce the result (mod 26), you will get the answer 1. Remember, this is just the definition of an inverse i.e. if a*x = 1 (mod 26), then x is an inverse of a (and a is an inverse of x)
Example:
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
const int a = 17;
const int b = 20;
string encryptMessage(string msg)
{
string cipher = "" ;
for ( int i = 0; i < msg.length(); i++)
{
if (msg[i]!= ' ' )
cipher = cipher +
( char ) ((((a * (msg[i]- 'A' ) ) + b) % 26) + 'A' );
else
cipher += msg[i];
}
return cipher;
}
string decryptCipher(string cipher)
{
string msg = "" ;
int a_inv = 0;
int flag = 0;
for ( int i = 0; i < 26; i++)
{
flag = (a * i) % 26;
if (flag == 1)
{
a_inv = i;
}
}
for ( int i = 0; i < cipher.length(); i++)
{
if (cipher[i]!= ' ' )
msg = msg +
( char ) (((a_inv * ((cipher[i]+ 'A' - b)) % 26)) + 'A' );
else
msg += cipher[i];
}
return msg;
}
int main( void )
{
string msg = "AFFINE CIPHER" ;
string cipherText = encryptMessage(msg);
cout << "Encrypted Message is : " << cipherText<<endl;
cout << "Decrypted Message is: " << decryptCipher(cipherText);
return 0;
}
|
Java
class GFG
{
static int a = 17 ;
static int b = 20 ;
static String encryptMessage( char [] msg)
{
String cipher = "" ;
for ( int i = 0 ; i < msg.length; i++)
{
if (msg[i] != ' ' )
{
cipher = cipher
+ ( char ) ((((a * (msg[i] - 'A' )) + b) % 26 ) + 'A' );
} else
{
cipher += msg[i];
}
}
return cipher;
}
static String decryptCipher(String cipher)
{
String msg = "" ;
int a_inv = 0 ;
int flag = 0 ;
for ( int i = 0 ; i < 26 ; i++)
{
flag = (a * i) % 26 ;
if (flag == 1 )
{
a_inv = i;
}
}
for ( int i = 0 ; i < cipher.length(); i++)
{
if (cipher.charAt(i) != ' ' )
{
msg = msg + ( char ) (((a_inv *
((cipher.charAt(i) + 'A' - b)) % 26 )) + 'A' );
}
else
{
msg += cipher.charAt(i);
}
}
return msg;
}
public static void main(String[] args)
{
String msg = "AFFINE CIPHER" ;
String cipherText = encryptMessage(msg.toCharArray());
System.out.println( "Encrypted Message is : " + cipherText);
System.out.println( "Decrypted Message is: " + decryptCipher(cipherText));
}
}
|
Python
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
else :
return x % m
def affine_encrypt(text, key):
return ' '.join([ chr((( key[0]*(ord(t) - ord(' A')) + key[ 1 ] ) % 26 )
+ ord ( 'A' )) for t in text.upper().replace( ' ' , '') ])
def affine_decrypt(cipher, key):
return ' '.join([ chr((( modinv(key[0], 26)*(ord(c) - ord(' A') - key[ 1 ]))
% 26 ) + ord ( 'A' )) for c in cipher ])
def main():
text = 'AFFINE CIPHER'
key = [ 17 , 20 ]
affine_encrypted_text = affine_encrypt(text, key)
print ( 'Encrypted Text: {}' . format ( affine_encrypted_text ))
print ( 'Decrypted Text: {}' . format
( affine_decrypt(affine_encrypted_text, key) ))
if __name__ = = '__main__' :
main()
|
C#
using System;
class GFG
{
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++)
{
if (msg[i] != ' ' )
{
cipher = cipher
+ ( char ) ((((a * (msg[i] - 'A' )) + b) % 26) + 'A' );
} else
{
cipher += msg[i];
}
}
return cipher;
}
static String decryptCipher(String cipher)
{
String msg = "" ;
int a_inv = 0;
int flag = 0;
for ( int i = 0; i < 26; i++)
{
flag = (a * i) % 26;
if (flag == 1)
{
a_inv = i;
}
}
for ( int i = 0; i < cipher.Length; i++)
{
if (cipher[i] != ' ' )
{
msg = msg + ( char ) (((a_inv *
((cipher[i] + 'A' - b)) % 26)) + 'A' );
}
else
{
msg += cipher[i];
}
}
return msg;
}
public static void Main(String[] args)
{
String msg = "AFFINE CIPHER" ;
String cipherText = encryptMessage(msg.ToCharArray());
Console.WriteLine( "Encrypted Message is : " + cipherText);
Console.WriteLine( "Decrypted Message is: " + decryptCipher(cipherText));
}
}
|
Javascript
let a = 17;
let b = 20;
function encryptMessage(msg)
{
let cipher = "" ;
for (let i = 0; i < msg.length; i++)
{
if (msg[i] != ' ' )
cipher = cipher + String.fromCharCode((((a * (msg[i].charCodeAt(0)-65) ) + b) % 26) + 65);
else
cipher += msg[i];
}
return cipher;
}
function decryptCipher(cipher)
{
let msg = "" ;
let a_inv = 0;
let flag = 0;
for (let i = 0; i < 26; i++)
{
flag = (a * i) % 26;
if (flag == 1)
{
a_inv = i;
}
}
for (let i = 0; i < cipher.length; i++)
{
if (cipher[i]!= ' ' )
msg = msg + String.fromCharCode(((a_inv * ((cipher[i].charCodeAt(0)+65 - b)) % 26)) + 65);
else
msg += cipher[i];
}
return msg;
}
let msg = "AFFINE CIPHER" ;
let cipherText = encryptMessage(msg);
console.log( "Encrypted Message is : " + cipherText);
console.log( "Decrypted Message is: " + decryptCipher(cipherText));
|
Output
Encrypted Message is : UBBAHK CAPJKX
Decrypted Message is: AFFINE CIPHER
Last Updated :
07 Mar, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...