Skip to content

Commit c6f7ea0

Browse files
committed
Added Siam's algo's and fixed his bugs
1 parent 35e70b4 commit c6f7ea0

15 files changed

+743
-233
lines changed

src/encrypt/1_caesar_cipher.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import string
2+
from random import randint
3+
4+
5+
def caeser_encrypt(word, key):
6+
letters = (
7+
string.ascii_lowercase
8+
+ string.ascii_lowercase
9+
+ string.ascii_uppercase
10+
+ string.ascii_uppercase
11+
)
12+
enc = ""
13+
for i in word:
14+
if i in letters:
15+
enc += letters[(letters.index(i) + key)]
16+
else:
17+
enc += i
18+
19+
return enc
20+
21+
22+
def caeser_decrypt(word, key):
23+
letters = (
24+
string.ascii_lowercase
25+
+ string.ascii_lowercase
26+
+ string.ascii_uppercase
27+
+ string.ascii_uppercase
28+
)
29+
enc = ""
30+
for i in word:
31+
if i in letters:
32+
enc += letters[(letters.index(i) - key)]
33+
else:
34+
enc += i
35+
36+
return enc
37+
38+
39+
key = randint(1, 26)
40+
print(caeser_encrypt("ATTACKATm4Once", key))
41+
print(caeser_decrypt(caeser_encrypt("ATTACKATm4Once", key), key))
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
PTA = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
2+
CTA = " qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789"
3+
4+
5+
def mono_alpabetic_cipher_encrypt(pt):
6+
ans = ""
7+
for i in pt:
8+
try:
9+
ans += CTA[PTA.index(i)]
10+
except:
11+
ans += i
12+
return ans
13+
14+
15+
def mono_alpabetic_cipher_decrypt(pt):
16+
ans = ""
17+
for i in pt:
18+
try:
19+
ans += PTA[CTA.index(i)]
20+
except:
21+
ans += i
22+
return ans
23+
24+
25+
print(mono_alpabetic_cipher_encrypt("ATTACKm#4Once"))
26+
print(mono_alpabetic_cipher_decrypt(mono_alpabetic_cipher_encrypt("ATTACKm#4Once")))

src/encrypt/3_vigenere.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import string
2+
3+
4+
def vigenere_encrypt(word, key):
5+
key = (key * (len(word) // len(key))) + key[: len(word) % len(key)]
6+
letters = (
7+
string.ascii_lowercase
8+
+ string.ascii_lowercase
9+
+ string.ascii_uppercase
10+
+ string.ascii_uppercase
11+
)
12+
ans = ""
13+
for i in range(len(word)):
14+
if word[i] in letters and key[i] in letters:
15+
if word[i].isupper():
16+
ans += letters[
17+
(letters.index(word[i]) + letters.index(key[i])) % 26
18+
].upper()
19+
else:
20+
ans += letters[
21+
(letters.index(word[i]) + letters.index(key[i])) % 26
22+
].lower()
23+
else:
24+
ans += word[i]
25+
26+
return ans
27+
28+
29+
def vigenere_decrypt(word, key):
30+
key = (key * (len(word) // len(key))) + key[: len(word) % len(key)]
31+
letters = (
32+
string.ascii_lowercase
33+
+ string.ascii_lowercase
34+
+ string.ascii_uppercase
35+
+ string.ascii_uppercase
36+
)
37+
ans = ""
38+
for i in range(len(word)):
39+
if word[i] in letters and key[i] in letters:
40+
if word[i].isupper():
41+
ans += letters[
42+
(letters.index(word[i]) - letters.index(key[i])) % 26
43+
].upper()
44+
else:
45+
ans += letters[
46+
(letters.index(word[i]) - letters.index(key[i])) % 26
47+
].lower()
48+
else:
49+
ans += word[i]
50+
51+
return ans
52+
53+
54+
word = "GEEKSFORGEEKS"
55+
key = "AYUSH"
56+
print("Original word:", word)
57+
print("Encrypted: ", vigenere_encrypt(word, key))
58+
print("Decrypted: ", vigenere_decrypt(vigenere_encrypt(word, key), key))
59+
60+
word = "GeeksForGeeks"
61+
key = "AYUSH"
62+
print("Original word:", word)
63+
print("Encrypted: ", vigenere_encrypt(word, key))
64+
print("Decrypted: ", vigenere_decrypt(vigenere_encrypt(word, key), key))
65+
66+
word = "Geeks4Geeks"
67+
key = "AYUSH"
68+
print("Original word:", word)
69+
print("Encrypted: ", vigenere_encrypt(word, key))
70+
print("Decrypted: ", vigenere_decrypt(vigenere_encrypt(word, key), key))
71+
72+
word = "Geeks#4#Geeks"
73+
key = "AYUSH"
74+
print("Original word:", word)
75+
print("Encrypted: ", vigenere_encrypt(word, key))
76+
print("Decrypted: ", vigenere_decrypt(vigenere_encrypt(word, key), key))
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import math
2+
3+
key = "HACK"
4+
5+
def encryptMessage(msg):
6+
cipher = ""
7+
8+
k_indx = 0
9+
10+
msg_len = float(len(msg))
11+
msg_lst = list(msg)
12+
key_lst = sorted(list(key))
13+
14+
col = len(key)
15+
16+
row = int(math.ceil(msg_len / col))
17+
18+
fill_null = int((row * col) - msg_len)
19+
msg_lst.extend('_' * fill_null)
20+
21+
matrix = [msg_lst[i: i + col]
22+
for i in range(0, len(msg_lst), col)]
23+
24+
for _ in range(col):
25+
curr_idx = key.index(key_lst[k_indx])
26+
cipher += ''.join([row[curr_idx]
27+
for row in matrix])
28+
k_indx += 1
29+
30+
return cipher
31+
32+
def decryptMessage(cipher):
33+
msg = ""
34+
35+
k_indx = 0
36+
37+
msg_indx = 0
38+
msg_len = float(len(cipher))
39+
msg_lst = list(cipher)
40+
41+
col = len(key)
42+
43+
row = int(math.ceil(msg_len / col))
44+
45+
key_lst = sorted(list(key))
46+
47+
dec_cipher = []
48+
for _ in range(row):
49+
dec_cipher += [[None] * col]
50+
51+
for _ in range(col):
52+
curr_idx = key.index(key_lst[k_indx])
53+
54+
for j in range(row):
55+
dec_cipher[j][curr_idx] = msg_lst[msg_indx]
56+
msg_indx += 1
57+
k_indx += 1
58+
59+
try:
60+
msg = ''.join(sum(dec_cipher, []))
61+
except TypeError:
62+
raise TypeError("This program cannot",
63+
"handle repeating words.")
64+
65+
null_count = msg.count('_')
66+
67+
if null_count > 0:
68+
return msg[: -null_count]
69+
70+
return msg
71+
72+
msg = "qwertyuiopasdfghjklzxcvbnm ,./;'[] 0987654321"
73+
74+
cipher = encryptMessage(msg)
75+
print("Encrypted Message: {}".
76+
format(cipher))
77+
78+
print("Decryped Message: {}".
79+
format(decryptMessage(cipher)))

src/encrypt/__init__.py

Whitespace-only changes.

src/encrypt/ceaser_cipher.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import string
2+
import random
3+
4+
5+
class CeaserCipher:
6+
def encrypt(self, plain_text: str, key: int) -> str:
7+
letters = (
8+
string.ascii_lowercase
9+
+ string.ascii_lowercase
10+
+ string.ascii_uppercase
11+
+ string.ascii_uppercase
12+
)
13+
14+
cipher_text = ""
15+
for i in plain_text:
16+
if i in letters:
17+
cipher_text += letters[(letters.index(i) + key)]
18+
else:
19+
cipher_text += i
20+
21+
return cipher_text
22+
23+
def decrypt(self, cipher_text: str, key: int) -> str:
24+
letters = (
25+
string.ascii_lowercase
26+
+ string.ascii_lowercase
27+
+ string.ascii_uppercase
28+
+ string.ascii_uppercase
29+
)
30+
31+
decrypted_text = ""
32+
for i in cipher_text:
33+
if i in letters:
34+
decrypted_text += letters[(letters.rindex(i) - key)]
35+
else:
36+
decrypted_text += i
37+
38+
return decrypted_text
39+
40+
def genkey(self) -> int:
41+
return random.randint(1, 26)
42+
43+
44+
class CeaserCipherEncoder:
45+
def encode_plaintext(self, plain_text: str) -> str:
46+
return str(bytes(plain_text, "utf-8"), "cp437")
47+
48+
def decode_encrypted_message(self, encrypted_message: str) -> str:
49+
return encrypted_message
50+
51+
def encode_encrypted_message(self, encrypted_message: str) -> str:
52+
return encrypted_message
53+
54+
def decode_decrypted_message(self, decrypted_message: str) -> str:
55+
return str(bytes(decrypted_message, "cp437"), "utf-8")
56+
57+
def decode_key(self, key: int) -> str:
58+
return str(key)

src/encrypt/encryption_facade.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from src.encrypt.one_time_pad import OneTimePadCipher, OneTimePadEncoder
2+
from src.encrypt.substitution_cipher import SubsitutionCipher, SubsitutionCipherEncoder
3+
from src.encrypt.ceaser_cipher import CeaserCipher, CeaserCipherEncoder
4+
from src.encrypt.transposition_cipher import (
5+
TranspositionCipher,
6+
TranspositionCipherEncoder,
7+
)
8+
from src.encrypt.vigenere import VigenereCipher, VigenereCipherEncoder
9+
10+
from typing import Dict
11+
12+
13+
class CipherFacade:
14+
15+
encryption_schemes = {
16+
"OneTimePad": OneTimePadCipher,
17+
"SubstitutionCipher": SubsitutionCipher,
18+
"CeaserCipher": CeaserCipher,
19+
"TranspositionCipher": TranspositionCipher,
20+
"VigenereCipher": VigenereCipher,
21+
}
22+
23+
encoders = {
24+
"OneTimePad": OneTimePadEncoder,
25+
"SubstitutionCipher": SubsitutionCipherEncoder,
26+
"CeaserCipher": CeaserCipherEncoder,
27+
"TranspositionCipher": TranspositionCipherEncoder,
28+
"VigenereCipher": VigenereCipherEncoder,
29+
}
30+
31+
def __init__(self, config: Dict[str, object]) -> None:
32+
33+
self.cipher = CipherFacade.encryption_schemes[config["scheme"]]()
34+
self.encoder = CipherFacade.encoders[config["scheme"]]()
35+
36+
if "key" in config:
37+
self.key = config["key"]
38+
elif "key_args" in config:
39+
self.key = self.cipher.genkey(**config["key_args"])
40+
else:
41+
self.key = self.cipher.genkey()
42+
43+
self.config = config
44+
45+
def encrypt(self, plain_text: str) -> str:
46+
encoded_plaintext = self.encoder.encode_plaintext(plain_text)
47+
encrypted_text = self.cipher.encrypt(encoded_plaintext, self.key)
48+
return self.encoder.decode_encrypted_message(encrypted_text)
49+
50+
def decrypt(self, cipher_text: str) -> str:
51+
encoded_ciphertext = self.encoder.encode_encrypted_message(cipher_text)
52+
decrypted_text = self.cipher.decrypt(encoded_ciphertext, self.key)
53+
return self.encoder.decode_decrypted_message(decrypted_text)
54+
55+
def get_key(self):
56+
return self.encoder.decode_key(self.key)

src/encrypt/one_time_pad.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import secrets
2+
import codecs
3+
4+
5+
class OneTimePadCipher:
6+
def encrypt(self, plain_text: bytes, key: bytes) -> bytes:
7+
return bytes([p ^ k for p, k in zip(plain_text, key)])
8+
9+
def decrypt(self, cipher_text: bytes, key: bytes) -> bytes:
10+
return self.encrypt(cipher_text, key)
11+
12+
def genkey(self, length: int) -> bytes:
13+
return secrets.token_bytes(length)
14+
15+
16+
class OneTimePadEncoder:
17+
def encode_plaintext(self, plain_text: str) -> bytes:
18+
return bytes(plain_text, "utf-8")
19+
20+
def decode_encrypted_message(self, encrypted_message: bytes) -> str:
21+
return encrypted_message.hex()
22+
23+
def encode_encrypted_message(self, encrypted_message: str) -> bytes:
24+
return codecs.decode(encrypted_message, "hex")
25+
26+
def decode_decrypted_message(self, decrypted_message: bytes) -> str:
27+
return decrypted_message.hex()
28+
29+
def decode_key(self, key: bytes) -> str:
30+
return key.hex()

0 commit comments

Comments
 (0)