Skip to content

Commit 1d9266e

Browse files
Fixed warning string for Key B = 0 (TheAlgorithms#1639)
* Fixed warning string for Key B = 0 * Update affine_cipher.py * Update affine_cipher.py * decrypt_message(encrypt_message()) Co-authored-by: Christian Clauss <[email protected]>
1 parent c67776d commit 1d9266e

File tree

1 file changed

+50
-43
lines changed

1 file changed

+50
-43
lines changed

ciphers/affine_cipher.py

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,63 @@
1-
import sys, random, cryptomath_module as cryptoMath
1+
import random
2+
import sys
23

3-
SYMBOLS = r""" !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"""
4+
import cryptomath_module as cryptomath
5+
6+
SYMBOLS = (r""" !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`"""
7+
r"""abcdefghijklmnopqrstuvwxyz{|}~""")
48

59

610
def main():
7-
message = input("Enter message: ")
8-
key = int(input("Enter key [2000 - 9000]: "))
9-
mode = input("Encrypt/Decrypt [E/D]: ")
11+
"""
12+
>>> key = get_random_key()
13+
>>> msg = "This is a test!"
14+
>>> decrypt_message(key, encrypt_message(key, msg)) == msg
15+
True
16+
"""
17+
message = input("Enter message: ").strip()
18+
key = int(input("Enter key [2000 - 9000]: ").strip())
19+
mode = input("Encrypt/Decrypt [E/D]: ").strip().lower()
1020

11-
if mode.lower().startswith("e"):
21+
if mode.startswith("e"):
1222
mode = "encrypt"
13-
translated = encryptMessage(key, message)
14-
elif mode.lower().startswith("d"):
23+
translated = encrypt_message(key, message)
24+
elif mode.startswith("d"):
1525
mode = "decrypt"
16-
translated = decryptMessage(key, message)
17-
print("\n%sed text: \n%s" % (mode.title(), translated))
18-
19-
20-
def getKeyParts(key):
21-
keyA = key // len(SYMBOLS)
22-
keyB = key % len(SYMBOLS)
23-
return (keyA, keyB)
24-
25-
26-
def checkKeys(keyA, keyB, mode):
27-
if keyA == 1 and mode == "encrypt":
28-
sys.exit(
29-
"The affine cipher becomes weak when key A is set to 1. Choose different key"
30-
)
31-
if keyB == 0 and mode == "encrypt":
32-
sys.exit(
33-
"The affine cipher becomes weak when key A is set to 1. Choose different key"
34-
)
26+
translated = decrypt_message(key, message)
27+
print(f"\n{mode.title()}ed text: \n{translated}")
28+
29+
30+
def check_keys(keyA, keyB, mode):
31+
if mode == "encrypt":
32+
if keyA == 1:
33+
sys.exit(
34+
"The affine cipher becomes weak when key "
35+
"A is set to 1. Choose different key"
36+
)
37+
if keyB == 0:
38+
sys.exit(
39+
"The affine cipher becomes weak when key "
40+
"B is set to 0. Choose different key"
41+
)
3542
if keyA < 0 or keyB < 0 or keyB > len(SYMBOLS) - 1:
3643
sys.exit(
37-
"Key A must be greater than 0 and key B must be between 0 and %s."
38-
% (len(SYMBOLS) - 1)
44+
"Key A must be greater than 0 and key B must "
45+
f"be between 0 and {len(SYMBOLS) - 1}."
3946
)
40-
if cryptoMath.gcd(keyA, len(SYMBOLS)) != 1:
47+
if cryptomath.gcd(keyA, len(SYMBOLS)) != 1:
4148
sys.exit(
42-
"Key A %s and the symbol set size %s are not relatively prime. Choose a different key."
43-
% (keyA, len(SYMBOLS))
49+
f"Key A {keyA} and the symbol set size {len(SYMBOLS)} "
50+
"are not relatively prime. Choose a different key."
4451
)
4552

4653

47-
def encryptMessage(key, message):
54+
def encrypt_message(key: int, message: str) -> str:
4855
"""
49-
>>> encryptMessage(4545, 'The affine cipher is a type of monoalphabetic substitution cipher.')
56+
>>> encrypt_message(4545, 'The affine cipher is a type of monoalphabetic substitution cipher.')
5057
'VL}p MM{I}p~{HL}Gp{vp pFsH}pxMpyxIx JHL O}F{~pvuOvF{FuF{xIp~{HL}Gi'
5158
"""
52-
keyA, keyB = getKeyParts(key)
53-
checkKeys(keyA, keyB, "encrypt")
59+
keyA, keyB = divmod(key, len(SYMBOLS))
60+
check_keys(keyA, keyB, "encrypt")
5461
cipherText = ""
5562
for symbol in message:
5663
if symbol in SYMBOLS:
@@ -61,15 +68,15 @@ def encryptMessage(key, message):
6168
return cipherText
6269

6370

64-
def decryptMessage(key, message):
71+
def decrypt_message(key: int, message: str) -> str:
6572
"""
66-
>>> decryptMessage(4545, 'VL}p MM{I}p~{HL}Gp{vp pFsH}pxMpyxIx JHL O}F{~pvuOvF{FuF{xIp~{HL}Gi')
73+
>>> decrypt_message(4545, 'VL}p MM{I}p~{HL}Gp{vp pFsH}pxMpyxIx JHL O}F{~pvuOvF{FuF{xIp~{HL}Gi')
6774
'The affine cipher is a type of monoalphabetic substitution cipher.'
6875
"""
69-
keyA, keyB = getKeyParts(key)
70-
checkKeys(keyA, keyB, "decrypt")
76+
keyA, keyB = divmod(key, len(SYMBOLS))
77+
check_keys(keyA, keyB, "decrypt")
7178
plainText = ""
72-
modInverseOfkeyA = cryptoMath.findModInverse(keyA, len(SYMBOLS))
79+
modInverseOfkeyA = cryptomath.findModInverse(keyA, len(SYMBOLS))
7380
for symbol in message:
7481
if symbol in SYMBOLS:
7582
symIndex = SYMBOLS.find(symbol)
@@ -79,11 +86,11 @@ def decryptMessage(key, message):
7986
return plainText
8087

8188

82-
def getRandomKey():
89+
def get_random_key():
8390
while True:
8491
keyA = random.randint(2, len(SYMBOLS))
8592
keyB = random.randint(2, len(SYMBOLS))
86-
if cryptoMath.gcd(keyA, len(SYMBOLS)) == 1:
93+
if cryptomath.gcd(keyA, len(SYMBOLS)) == 1:
8794
return keyA * len(SYMBOLS) + keyB
8895

8996

0 commit comments

Comments
 (0)