Affine Cipher is a relatively simple way for encrypting/decrypting data with low CPU cost but with the expensive of low level of security.
Basic Syntax: f ( X ) = α X + β (mod 26)
Note: the mod 26 means this cipher is using the English alphabet, which contains 26 characters:
- X is the correspondent value of the character that will be encrypted.
- ( α , β ) is a valid key if:
- gcd ( α , 26 ) = 1
- 1 ≤ α ≤ 25
- 0 ≤ β ≤ 25
Let’s walk through the encryption and decryption process in the Python code below that is a fork of [Link].
Encryption:
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): ''' 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(' ', '') ]) text = 'PlainText' key = [3, 18] print(affine_encrypt(text, key))
Decryption:
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_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 ]) cipher = 'LZSQFXEJX' key = [3, 18] print(affine_decrypt(cipher, key))