Skip to content

Commit d9af521

Browse files
Changed vigerene cipher and hill cipher
1 parent ab90a12 commit d9af521

File tree

5 files changed

+84
-76
lines changed

5 files changed

+84
-76
lines changed

Algorithms/cryptology/ceasar_shifting_cipher/asd.py

Lines changed: 0 additions & 44 deletions
This file was deleted.

Algorithms/cryptology/hill_cipher/euclid_gcd.py

Lines changed: 0 additions & 16 deletions
This file was deleted.

Algorithms/cryptology/hill_cipher/hill_cipher.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
1616
import numpy as np
1717
from egcd import egcd # pip install egcd
1818

19-
alphabet = 'abcdefghijklmnopqrstuvwxyz '
19+
alphabet = 'abcdefghijklmnopqrstuvwxyz'
2020

2121
letter_to_index = dict(zip(alphabet, range(len(alphabet))))
2222
index_to_letter = dict(zip(range(len(alphabet)), alphabet))
2323

2424
def matrix_mod_inv(matrix, modulus):
2525
'''We find the matrix modulus inverse by
2626
Step 1) Find determinant
27-
Step 2) Find the inverse of the determinant value in modulus in a specific modulus (usually length of alphabet)
28-
Step 3) Take that det_inv times the inverted matrix in modulus 26 (applied elementwise).
27+
Step 2) Find determinant value in a specific modulus (usually length of alphabet)
28+
Step 3) Take that det_inv times the det*inverted matrix (this will then be the adjoint) in mod 26
2929
'''
3030

3131
det = int(np.round(np.linalg.det(matrix))) # Step 1)
@@ -44,17 +44,17 @@ def encrypt(message, K):
4444
split_P = [message_in_numbers[i:i + int(K.shape[0])] for i in range(0, len(message_in_numbers), int(K.shape[0]))]
4545

4646
for P in split_P:
47-
P = np.transpose(np.asarray(P))
47+
P = np.transpose(np.asarray(P))[:,np.newaxis]
4848

4949
while P.shape[0] != K.shape[0]:
50-
P = np.append(P, letter_to_index[' '])
50+
P = np.append(P, letter_to_index[' '])[:,np.newaxis]
5151

5252
numbers = np.dot(K, P) % len(alphabet)
53-
n = numbers.shape[1] # length of encrypted message (in numbers)
53+
n = numbers.shape[0] # length of encrypted message (in numbers)
5454

5555
# Map back to get encrypted text
5656
for idx in range(n):
57-
number = int(numbers[0, idx])
57+
number = int(numbers[idx, 0])
5858
encrypted += index_to_letter[number]
5959

6060
return encrypted
@@ -69,20 +69,23 @@ def decrypt(cipher, Kinv):
6969
split_C = [cipher_in_numbers[i:i + int(Kinv.shape[0])] for i in range(0, len(cipher_in_numbers), int(Kinv.shape[0]))]
7070

7171
for C in split_C:
72-
C = np.transpose(np.asarray(C))
72+
C = np.transpose(np.asarray(C))[:,np.newaxis]
7373
numbers = np.dot(Kinv, C) % len(alphabet)
74-
n = numbers.shape[1]
74+
n = numbers.shape[0]
7575

7676
for idx in range(n):
77-
number = int(numbers[0, idx])
77+
number = int(numbers[idx, 0])
7878
decrypted += index_to_letter[number]
7979

8080
return decrypted
8181

8282
def main():
83-
message = 'my life is potato'
83+
#message = 'my life is potato'
84+
message = 'help'
85+
86+
K = np.matrix([[3,3],[2,5]])
8487
# K = np.matrix([[6, 24, 1], [13,16,10], [20,17,15]]) # for length of alphabet = 26
85-
K = np.matrix([[3,10,20],[20,19,17], [23,78,17]]) # for length of alphabet = 27
88+
#K = np.matrix([[3,10,20],[20,19,17], [23,78,17]]) # for length of alphabet = 27
8689
Kinv = matrix_mod_inv(K, len(alphabet))
8790

8891
encrypted_message = encrypt(message, K)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
'''
2+
Implementation of the famous one time pad / Vernam Cipher
3+
4+
In practice we need a way to generate random keys which I havn't included.
5+
6+
Programmed by Aladdin Persson <aladdin.persson at hotmail dot com>
7+
* 2019-11-12 Initial programming
8+
9+
'''
10+
11+
def xor(s1,s2):
12+
xor_result = []
13+
14+
for i in range(min(len(s1), len(s2))):
15+
xor_result.append(int(s1[i]) ^ int(s2[i])) # xor
16+
17+
return xor_result
18+
19+
def encrypt(message, key):
20+
binary_message = ''
21+
binary_key = ''
22+
ciphered_text = ''
23+
24+
for letter in message:
25+
binary_message += format(ord(letter), 'b')
26+
27+
for letter in key:
28+
binary_key += format(ord(letter), 'b')
29+
30+
cipher_binary = xor(binary_message, binary_key)
31+
32+
return ''.join(str(e) for e in cipher_binary)
33+
34+
def decrypt(cipher_text, key):
35+
binary_key = ''
36+
decrypted_text = ''
37+
38+
for letter in key:
39+
binary_key += format(ord(letter), 'b')
40+
41+
42+
binary_message = xor(cipher_text, binary_key)
43+
44+
for i in range(0,len(binary_message),7):
45+
letter = ''.join(str(e) for e in binary_message[i:i+7])
46+
decrypted_text += chr(int(letter, 2))
47+
48+
return decrypted_text
49+
50+
51+
def main():
52+
message = 'cheesecake' # 'secret' message
53+
key = 'randomrandomrandom' #'random' key
54+
55+
encrypted = encrypt(message, key)
56+
decrypted = decrypt(encrypted, key)
57+
58+
print('Original message: ' + str(message))
59+
print('Encrypted message (in binary): ' + str(encrypted))
60+
print('Decrypted message: ' + str(decrypted))
61+
62+
if __name__ == '__main__':
63+
main()

Algorithms/cryptology/vigenere_cipher/vigenere.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
'''
1313

1414

15-
alphabet = 'abcdefghijklmnopqrstuvwxyz'
16-
letter_to_index = dict(zip(alphabet, range(1, 1 + len(alphabet))))
17-
index_to_letter = dict(zip(range(1, 1 + len(alphabet)), alphabet))
15+
alphabet = 'abcdefghijklmnopqrstuvwxyz '
16+
17+
letter_to_index = dict(zip(alphabet, range(len(alphabet))))
18+
index_to_letter = dict(zip(range(len(alphabet)), alphabet))
19+
1820

1921
def encrypt(message, key):
2022
encrypted = ''
@@ -43,7 +45,7 @@ def decrypt(cipher, key):
4345
return decrypted
4446

4547
def main():
46-
message = 'iloovepeanuts'
48+
message = 'i loove peanuts'
4749
key = 'banana'
4850
encrypted_message = encrypt(message, key)
4951
decrypted_message = decrypt(encrypted_message, key)

0 commit comments

Comments
 (0)