Message-Encryption / msg_encX.py
Amould's picture
Update msg_encX.py
e63086e
raw
history blame
5.64 kB
import os
from datetime import datetime
import random
import math
import base64
import hashlib
from Crypto import Random
from Crypto.Cipher import AES
import rsa
import string
encoding0 = int(os.environ['encoding'])
padding0 = int(os.environ['padding'])
encryption_difficulty0 = int(os.environ['encryption_difficulty'])
N_days0=int(os.environ['N_days'])
User_passcode0=int(os.environ['User_passcode'])
power0 = float(os.environ['power'])
#path0 = float(os.environ['path'])
#publicKey0 = int(os.environ['publicKey'])
def seedx(path , User_passcode=User_passcode0, N_days=N_days0, encryption_difficulty = encryption_difficulty0):
try:
with open(path +'indx.txt') as f:
old_day_index = int(f.read())
except:
old_day_index = 0
print('no old index was found')
#os.environ['old_day_index'] = str(old_day_index)
timestamp = datetime.timestamp(datetime.now())
#total number of days since unix time
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
day_index = math.floor(days_span/N_days)
seed = int(day_index**power0 + User_passcode)
if day_index == old_day_index:
# with open('prvt.pem', 'rb') as file:
# key_data = file.read()
# privateKey = rsa.PrivateKey.load_pkcs1(key_data)
with open('pblc.pem', 'rb') as file:
key_data = file.read()
publicKey = rsa.PublicKey.load_pkcs1(key_data)
else:
publicKey, privateKey = rsa.newkeys(encryption_difficulty)
old_day_index = day_index
#save in a folder
with open(path +'indx.txt', 'w') as f:
f.write(str(old_day_index))
#with open(path +'prvt.pem', 'w') as f:
# f.write(privateKey.save_pkcs1().decode('utf-8'))
with open(path +'pblc.pem', 'w') as f:
f.write(publicKey.save_pkcs1().decode('utf-8'))
return {'seed':seed,'publicKey': publicKey} #, 'privateKey': privateKey}
def AES_encrypt(User_message,seed, publicKey,encoding = encoding0, padding = padding0):
#number conversion to encrypt non-english content
User_message_numbered = (int.from_bytes(bytes(User_message, 'utf-16'), "big"))
#padding
front_padding = ''.join(random.choices(string.digits, k=padding)) #string.ascii_lowercase +
back_padding = ''.join(random.choices(string.digits, k=padding)) #string.ascii_lowercase +
msg = front_padding + str(User_message_numbered) + back_padding
msg_len =len(msg) #total number of charachters in the msg
permutation_list = list(range(0,msg_len))
random.seed(seed)
random.shuffle(permutation_list)
shffled_msg_list = [msg[i] for i in permutation_list]
shffled_msg = ''.join(shffled_msg_list)
#print(shffled_msg)
encMessage = AESCipher(str(publicKey.n)).encrypt(shffled_msg)
if encoding == 0:
encMessage_int = encMessage
elif encoding == 1:
encMessage_int = encMessage.decode('utf-16')
else:
encMessage_int = int.from_bytes(encMessage, "big")
return encMessage_int
class AESCipher(object):
def __init__(self, key):
self.bs = AES.block_size
self.key = hashlib.sha256(key.encode()).digest()
def encrypt(self, raw):
raw = self._pad(raw)
iv = Random.new().read(AES.block_size)
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return base64.b64encode(iv + cipher.encrypt(raw.encode()))
def decrypt(self, enc):
enc = base64.b64decode(enc)
iv = enc[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return AESCipher._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')
def _pad(self, s):
return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)
@staticmethod
def _unpad(s):
return s[:-ord(s[len(s)-1:])]
def invert_perm_list(p):
return [p.index(l) for l in range(len(p))]
def AES_decrypt(encMessage,seed,publicKey, encoding = encoding0, encryption_difficulty = encryption_difficulty0, padding = padding0):
if encoding == 0:
encMessage_byte = encMessage
elif encoding == 1:
encMessage_byte = encMessage.encode('utf-16')
else:
encMessage_byte = encMessage.to_bytes((encMessage.bit_length() + 7) // 8, "big")
decMessage = AESCipher(str(publicKey.n)).decrypt(encMessage_byte)
decMessage_len =len(decMessage) #total number of charachters in the msg
permutation_list = list(range(0,decMessage_len))
random.seed(seed)
random.shuffle(permutation_list)
inverted_permutation_list = invert_perm_list(permutation_list)
recovered_list = [decMessage[i] for i in inverted_permutation_list]
recovered_msg_i_pad = ''.join(recovered_list)
recovered_msg_i = int(recovered_msg_i_pad[padding:-padding])
recovered_msg = recovered_msg_i.to_bytes((recovered_msg_i.bit_length() + 7) // 8, "big").decode("utf-16")
return recovered_msg
def Encrypt_msg(User_message,user_password,path=''):
User_passcode = (int.from_bytes(bytes(str(user_password), 'utf-8'), "little"))
Num_dict_enc = seedx(path, User_passcode)
encMessage_i = AES_encrypt(User_message,Num_dict_enc['seed'], Num_dict_enc['publicKey'],encoding = encoding0, padding = padding0)
#print(encMessage_i)
return encMessage_i
def Decrypt_msg(encMessage,user_password,path=''):
User_passcode = (int.from_bytes(bytes(str(user_password), 'utf-8'), "little"))
Num_dict_enc = seedx(path, User_passcode)
recovered_msg = AES_decrypt(encMessage,Num_dict_enc['seed'], Num_dict_enc['publicKey'], encoding = encoding0, encryption_difficulty = encryption_difficulty0, padding = padding0)
#print(recovered_msg)
return recovered_msg