Ahmad Hammoudeh commited on
Commit
9b7b20b
·
1 Parent(s): 67a8f99

Create msg_encX.py

Browse files
Files changed (1) hide show
  1. msg_encX.py +127 -0
msg_encX.py ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from datetime import datetime
3
+ import random
4
+ import math
5
+ import base64
6
+ import hashlib
7
+ from Crypto import Random
8
+ from Crypto.Cipher import AES
9
+ import rsa
10
+ import string
11
+
12
+
13
+ def seedx(path , User_passcode=0, N_days=1, encryption_difficulty = 2**10):
14
+ try:
15
+ with open(path +'indx.txt') as f:
16
+ old_day_index = int(f.read())
17
+ except:
18
+ old_day_index = 0
19
+ print('no old index was found')
20
+ timestamp = datetime.timestamp(datetime.now())
21
+ #total number of days since unix time
22
+ days_span = timestamp/math.factorial(6)/120 + 0.1#*random.random() #first time calculate the days since unix, thae latter randomize the time zone by up to ~7 hours
23
+ day_index = math.floor(days_span/N_days)
24
+ seed = int(day_index**2 + User_passcode)
25
+ if day_index == old_day_index:
26
+ with open('prvt.pem', 'rb') as file:
27
+ key_data = file.read()
28
+ privateKey = rsa.PrivateKey.load_pkcs1(key_data)
29
+ with open('pblc.pem', 'rb') as file:
30
+ key_data = file.read()
31
+ publicKey = rsa.PublicKey.load_pkcs1(key_data)
32
+ else:
33
+ publicKey, privateKey = rsa.newkeys(encryption_difficulty)
34
+ old_day_index = day_index
35
+ #save in a folder
36
+ with open(path +'indx.txt', 'w') as f:
37
+ f.write(str(old_day_index))
38
+ with open(path +'prvt.pem', 'w') as f:
39
+ f.write(privateKey.save_pkcs1().decode('utf-8'))
40
+ with open(path +'pblc.pem', 'w') as f:
41
+ f.write(publicKey.save_pkcs1().decode('utf-8'))
42
+
43
+ return {'seed':seed,'publicKey': publicKey, 'privateKey': privateKey}
44
+
45
+
46
+ def AES_encrypt(User_message,seed, publicKey,encoding = 1, padding = 30):
47
+ #number conversion to encrypt non-english content
48
+ User_message_numbered = (int.from_bytes(bytes(User_message, 'utf-16'), "big"))
49
+ #padding
50
+ front_padding = ''.join(random.choices(string.digits, k=padding)) #string.ascii_lowercase +
51
+ back_padding = ''.join(random.choices(string.digits, k=padding)) #string.ascii_lowercase +
52
+ msg = front_padding + str(User_message_numbered) + back_padding
53
+ msg_len =len(msg) #total number of charachters in the msg
54
+ permutation_list = list(range(0,msg_len))
55
+ random.seed(seed)
56
+ random.shuffle(permutation_list)
57
+ shffled_msg_list = [msg[i] for i in permutation_list]
58
+ shffled_msg = ''.join(shffled_msg_list)
59
+ #print(shffled_msg)
60
+ encMessage = AESCipher(str(publicKey.n)).encrypt(shffled_msg)
61
+ if encoding == 0:
62
+ encMessage_int = encMessage
63
+ elif encoding == 1:
64
+ encMessage_int = encMessage.decode('utf-16')
65
+ else:
66
+ encMessage_int = int.from_bytes(encMessage, "big")
67
+ return encMessage_int
68
+
69
+
70
+ class AESCipher(object):
71
+ def __init__(self, key):
72
+ self.bs = AES.block_size
73
+ self.key = hashlib.sha256(key.encode()).digest()
74
+ def encrypt(self, raw):
75
+ raw = self._pad(raw)
76
+ iv = Random.new().read(AES.block_size)
77
+ cipher = AES.new(self.key, AES.MODE_CBC, iv)
78
+ return base64.b64encode(iv + cipher.encrypt(raw.encode()))
79
+ def decrypt(self, enc):
80
+ enc = base64.b64decode(enc)
81
+ iv = enc[:AES.block_size]
82
+ cipher = AES.new(self.key, AES.MODE_CBC, iv)
83
+ return AESCipher._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')
84
+ def _pad(self, s):
85
+ return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)
86
+ @staticmethod
87
+ def _unpad(s):
88
+ return s[:-ord(s[len(s)-1:])]
89
+
90
+ def invert_perm_list(p):
91
+ return [p.index(l) for l in range(len(p))]
92
+
93
+ def AES_decrypt(encMessage,seed,publicKey, encoding = 1, encryption_difficulty = 2**10, padding = 30):
94
+ if encoding == 0:
95
+ encMessage_byte = encMessage
96
+ elif encoding == 1:
97
+ encMessage_byte = encMessage.encode('utf-16')
98
+ else:
99
+ encMessage_byte = encMessage.to_bytes((encMessage.bit_length() + 7) // 8, "big")
100
+ decMessage = AESCipher(str(publicKey.n)).decrypt(encMessage_byte)
101
+ decMessage_len =len(decMessage) #total number of charachters in the msg
102
+ permutation_list = list(range(0,decMessage_len))
103
+ random.seed(seed)
104
+ random.shuffle(permutation_list)
105
+ inverted_permutation_list = invert_perm_list(permutation_list)
106
+ recovered_list = [decMessage[i] for i in inverted_permutation_list]
107
+ recovered_msg_i_pad = ''.join(recovered_list)
108
+ recovered_msg_i = int(recovered_msg_i_pad[padding:-padding])
109
+ recovered_msg = recovered_msg_i.to_bytes((recovered_msg_i.bit_length() + 7) // 8, "big").decode("utf-16")
110
+ return recovered_msg
111
+
112
+
113
+
114
+ def Encrypt_msg(User_message,user_password,path):
115
+ User_passcode = (int.from_bytes(bytes(str(user_password), 'utf-8'), "little"))
116
+ Num_dict_enc = seedx(path, User_passcode)
117
+ encMessage_i = AES_encrypt(User_message,Num_dict_enc['seed'], Num_dict_enc['publicKey'],encoding = 1, padding = 30)
118
+ #print(encMessage_i)
119
+ return encMessage_i
120
+
121
+
122
+ def Decrypt_msg(encMessage,user_password,path):
123
+ User_passcode = (int.from_bytes(bytes(str(user_password), 'utf-8'), "little"))
124
+ Num_dict_enc = seedx(path, User_passcode)
125
+ recovered_msg = AES_decrypt(encMessage,Num_dict_enc['seed'], Num_dict_enc['publicKey'], encoding = 1, encryption_difficulty = 2**10, padding = 30)
126
+ #print(recovered_msg)
127
+ return recovered_msg