Skip to content

Commit 5357796

Browse files
committed
basic encryption tutorial
1 parent 01ce5cb commit 5357796

File tree

4 files changed

+112
-0
lines changed

4 files changed

+112
-0
lines changed

basic_encryption/caesar.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from common import alphabet
2+
3+
4+
def translate(message, shift, encrypt=True):
5+
new_message = ''
6+
n_chars = len(alphabet)
7+
8+
for character in message:
9+
char_idx = alphabet.index(character)
10+
if encrypt:
11+
new_char_idx = (char_idx + shift) % n_chars
12+
elif not encrypt:
13+
new_char_idx = (char_idx - shift) % n_chars
14+
new_message += alphabet[new_char_idx]
15+
return new_message
16+
17+
18+
cipher_shift = 7
19+
20+
print('AB->', translate('AB', cipher_shift))
21+
print('ab->', translate('ab', cipher_shift))
22+
print('Ab->', translate('Ab', cipher_shift))
23+
print('aB->', translate('aB', cipher_shift))
24+
25+
plaintext = 'This is an encrypted message.'
26+
ciphertext = translate(plaintext, cipher_shift, True)
27+
print(plaintext, '->', ciphertext)
28+
original_message = translate(ciphertext, cipher_shift, False)
29+
print(ciphertext, '->', original_message)

basic_encryption/common.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import random
2+
3+
4+
def character_generator(start_char, stop_char):
5+
for char in range(ord(start_char), ord(stop_char)+1):
6+
yield chr(char)
7+
8+
9+
def generate_one_time_pad(n_chars, characters):
10+
return ''.join(random.choice(characters) for _ in range(n_chars))
11+
12+
13+
lower_case = list(character_generator('a', 'z'))
14+
upper_case = list(character_generator('A', 'Z'))
15+
punctuation = ['.', ',', ' ', '?', '!']
16+
17+
alphabet = lower_case + upper_case + punctuation

basic_encryption/one_time_pad.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from common import alphabet, generate_one_time_pad
2+
3+
4+
def translate(message, one_time_pad, encrypt=True):
5+
new_message = ''
6+
7+
n_chars = len(alphabet)
8+
9+
for src, key in zip(message, one_time_pad):
10+
char_idx = alphabet.index(src)
11+
pad_idx = alphabet.index(key)
12+
if encrypt:
13+
new_char_idx = (char_idx + pad_idx) % n_chars
14+
elif not encrypt:
15+
new_char_idx = (char_idx - pad_idx) % n_chars
16+
new_message += alphabet[new_char_idx]
17+
18+
return new_message
19+
20+
21+
message = 'This is an encrypted message.'
22+
secret_key = generate_one_time_pad(len(message), alphabet)
23+
encrypted_message = translate(message, secret_key, True)
24+
original_message = translate(encrypted_message, secret_key, False)
25+
26+
print(message, '->', encrypted_message)
27+
print(encrypted_message, '->', original_message)

basic_encryption/vignere.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from common import alphabet, generate_one_time_pad
2+
3+
4+
def make_vignere_table():
5+
table = [['']] * len(alphabet)
6+
for idx, character in enumerate(alphabet):
7+
row = []
8+
for char in alphabet[idx:]:
9+
row.append(char)
10+
for char in alphabet[:idx]:
11+
row.append(char)
12+
table[idx] = row
13+
return table
14+
15+
16+
def translate(message, vig_table, one_time_pad, encrypt=True):
17+
new_message = ''
18+
19+
if encrypt:
20+
for src, key in zip(message, one_time_pad):
21+
row = vig_table[:][0].index(key)
22+
col = vig_table[0][:].index(src)
23+
new_message += vig_table[row][col]
24+
elif not encrypt:
25+
for src, key in zip(message, one_time_pad):
26+
row = vig_table[:][0].index(key)
27+
col = vig_table[row][:].index(src)
28+
new_message += vig_table[0][col]
29+
return new_message
30+
31+
32+
table = make_vignere_table()
33+
message = 'This is an encrypted message.'
34+
secret_key = generate_one_time_pad(len(message), alphabet)
35+
encrypted_message = translate(message, table, secret_key, True)
36+
original_message = translate(encrypted_message, table, secret_key, False)
37+
38+
print(message, '->', encrypted_message)
39+
print(encrypted_message, '->', original_message)

0 commit comments

Comments
 (0)