Skip to content

Commit f1d09a5

Browse files
adds affine cipher
1 parent f42a502 commit f1d09a5

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Algorithms from the book Cryptography & Network Security ~Behrouz A. Forouzan. S
2222
1. Monoalphabetic Ciphers
2323
1. [Caesar Shift Cipher](ciphers/CaesarShiftCipher.py)
2424
1. [Multiplicative Cipher](ciphers/MultiplicativeCipher.py)
25-
1. Affine Cipher
25+
1. [Affine Cipher](ciphers/AffineCipher.py)
2626
1. Polyalphabetic Ciphers
2727
1. Autokey Cipher
2828
1. [Playfair Cipher](ciphers/PlayfairCipher.py)

ciphers/AffineCipher.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from mathematics import multiplicative_inverse
2+
3+
class AffineCipher:
4+
def __init__(self, k_1, k_2):
5+
self.k_1 = k_1
6+
self.k_2 = k_2
7+
8+
def char_to_num(self, letter):
9+
letter = letter.lower()
10+
return ord(letter) - ord('a')
11+
12+
def encrypt(self, plaintext):
13+
return ''.join(
14+
[chr((self.char_to_num(letter) * self.k_1 + self.k_2) % 26 + ord('A')) for letter in plaintext.lower()])
15+
16+
def decrypt(self, ciphertext):
17+
return ''.join(
18+
[chr(((self.char_to_num(letter) - self.k_2) * multiplicative_inverse(self.k_1, 26)) % 26 + ord('a'))
19+
for letter in ciphertext.lower()]
20+
)

ciphers/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
from ciphers.PlayfairCipher import PlayFairCipher
44
from ciphers.CaesarShiftCipher import CaesarShiftCipher
55
from ciphers.MultiplicativeCipher import MultiplicativeCipher
6+
from ciphers.AffineCipher import AffineCipher

0 commit comments

Comments
 (0)