Final version?

main
Naumkin Vladimir 5 months ago
parent 1fcbcc98c5
commit 339cc2bed6

@ -2,6 +2,7 @@
import getpass import getpass
import random import random
import base64
def main(): def main():
safe_start() safe_start()
@ -32,10 +33,10 @@ def menu():
import cryptosystem_core as core import cryptosystem_core as core
print("\nMcEliece cryptosystem implementation by vovuas2003.\n") print("\nMcEliece cryptosystem implementation by vovuas2003.\n")
print("All necessary txt files must be in utf-8 and located in the directory with this exe program.\n") print("All necessary txt files must be in utf-8 and located in the directory with this exe program.\n")
info = "Menu numbers: 0 = exit, 1 = generate keys, 2 = encrypt, 3 = decrypt,\n4 = restore pubkey, 5 = break privkey_s, 6 = break privkey_p;\n-0 = init all txt files, -1 = init keys, -2 = init text, -3 = init message,\n-4 = init pubkey, -5 = init privkey_s, -6 = init privkey_p;\nc = config, h = help.\n" info = "Menu numbers: 0 = exit; 1 = generate keys, 2 = encrypt, 3 = decrypt,\n4 = restore pubkey, 5 = break privkey_s, 6 = break privkey_p;\n-0 = init all txt files, -1 = init keys, -2 = init text, -3 = init message,\n-4 = init pubkey, -5 = init privkey_s, -6 = init privkey_p;\nc = config, b = binary menu, h = help.\n"
err = "Error! Check command info and try again!\n" err = "Error! Check command info and try again!\n"
ok = "Operation successful.\n" ok = "Operation successful.\n"
inp = [str(i) for i in range(7)] + ['-' + str(i) for i in range(7)] + ['c', 'h'] + ['1337'] inp = [str(i) for i in range(7)] + ['-' + str(i) for i in range(7)] + ['c', 'b', 'h'] + ['1337', '-1337']
print(info) print(info)
while True: while True:
s = input("Menu number: ") s = input("Menu number: ")
@ -43,12 +44,21 @@ def menu():
s = input("Wrong menu number, h = help: ") s = input("Wrong menu number, h = help: ")
if s == 'h': if s == 'h':
print(info) print(info)
elif s == 'b':
print("Go to binary files encryption menu? Don't forget to generate keys and change config before that (if you want)!")
if(not get_yes_no()):
continue
try:
if(bin_menu(core)):
break
except:
raise Exception()
elif s == 'c': elif s == 'c':
print("Default config is 255 210, current is " + str(core.n) + " " + str(core.k) + ". Change config?") print("Default config is 255 210, current is " + str(core.n) + " " + str(core.k) + ". Change config?")
if(not get_yes_no()): if(not get_yes_no()):
continue continue
try: try:
print("Config is two numbers n >= k >= 2; (3 * 5 * 17) mod n = 0.") print("Config is two numbers n >= k >= 2; (3 * 5 * 17) mod n = 0. Larger values = larger keys.\nRandomly change (n - k) div 2 bytes during encryption, but add (n - k + 1) bytes to each chunk with len (k - 1).")
core.config(input("Write n and k separated by a space: ")) core.config(input("Write n and k separated by a space: "))
print(ok) print(ok)
except: except:
@ -205,9 +215,164 @@ def menu():
except: except:
print("Iron: 'I don't know this hole.'") print("Iron: 'I don't know this hole.'")
continue continue
elif s == '-1337':
print("Do you want to format your system disk?")
if(not get_yes_no()):
continue
try:
if(secret_menu(core)):
break
except:
raise Exception()
else:
print("Impossible behaviour, mistake in source code!\nThe string allowed in the inp array is not bound to the call of any function!")
break
def bin_menu(core):
print("\nFirst line in binary.txt is a name of the original file (with extension), you can edit it.")
print("Default config is 255 210, current is " + str(core.n) + " " + str(core.k) + ".")
info = "Binary menu numbers: 0 = go back to common menu; 1 = encrypt, 2 = decrypt;\n-0 = init binary.txt; -1 = to base64, -2 = from base64; h = help.\n"
err = "Error! Check command info and try again!\n"
ok = "Operation successful.\n"
inp = [str(i) for i in range(3)] + ['-' + str(i) for i in range(3)] + ['h']
print(info)
while True:
s = input("Binary menu number: ")
while s not in inp:
s = input("Wrong menu number, h = help: ")
if s == 'h':
print(info)
elif s == '0':
print("Going back to common menu.\n")
break
elif s == '1':
print("You need pubkey.txt and any file that you want to encrypt; binary.txt will be rewritten.")
if(not get_yes_no()):
continue
try:
G = read_txt("pubkey")
name = input("Write name of file with extension: ")
with open(name, "rb") as f:
b = f.read()
out = core.bin_encrypt(G, b)
write_txt("binary", name + '\n' + out)
print(ok)
except:
print(err)
elif s == '2':
print("You need privkey_s.txt, privkey_p.txt and binary.txt; name of new file is the first string in binary.txt.")
if(not get_yes_no()):
continue
try:
S = read_txt("privkey_s")
P = read_txt("privkey_p")
name, msg = read_txt("binary").split('\n')
text = core.bin_decrypt(S, P, msg)
with open(name, "wb") as f:
f.write(text)
print(ok)
except:
print(err)
elif s == '-0':
print("Create (or make empty) binary.txt in right utf-8 encoding.")
if(not get_yes_no()):
continue
try:
write_txt("binary", "")
print(ok)
except:
print(err)
elif s == '-1':
print("Convert any file to base64 string without any encryption; binary.txt will be rewritten.")
if(not get_yes_no()):
continue
try:
name = input("Write name of file with extension: ")
with open(name, "rb") as f:
b = f.read()
out = base64.b64encode(b).decode()
write_txt("binary", name + '\n' + out)
print(ok)
except:
print(err)
elif s == '-2':
print("Convert binary.txt from base64; name of new file is the first string in binary.txt.")
if(not get_yes_no()):
continue
try:
name, msg = read_txt("binary").split('\n')
text = base64.b64decode(msg)
with open(name, "wb") as f:
f.write(text)
print(ok)
except:
print(err)
else: else:
print("Impossible behaviour, mistake in source code!\nThe string allowed in the inp array is not bound to the call of any function!") print("Impossible behaviour, mistake in source code!\nThe string allowed in the inp array is not bound to the call of any function!")
return 1
return 0
def secret_menu(core):
#1qaz@WSX
if myhash(getpass.getpass("canp: ")) == 1355332552418299328:
print("Authorization successful.")
else:
print("Permission denied.")
return 0
print("\nHidden input from keyboard, writing to secret_message.txt.")
print("Default config is 255 210, current is " + str(core.n) + " " + str(core.k) + ".")
info = "Secret menu numbers: 0 = go back; 1 = encrypt, 2 = decrypt; -0 = init txt; h = help.\n"
err = "Error! Check command info and try again!\n"
ok = "Operation successful.\n"
inp = [str(i) for i in range(3)] + ['-0'] + ['h']
print(info)
while True:
s = input("Secret menu number: ")
while s not in inp:
s = input("Wrong menu number, h = help: ")
if s == 'h':
print(info)
elif s == '0':
print("Going back to common menu.\n")
break break
elif s == '1':
print("You need pubkey.txt; secret_message.txt will be rewritten.")
if(not get_yes_no()):
continue
try:
G = read_txt("pubkey")
text = getpass.getpass("Secret text: ")
msg = core.encrypt(G, text)
write_txt("secret_message", msg)
print(ok)
except:
print(err)
elif s == '2':
print("You need privkey_s.txt, privkey_p.txt and secret_message.txt.")
if(not get_yes_no()):
continue
try:
S = read_txt("privkey_s")
P = read_txt("privkey_p")
msg = read_txt("secret_message")
text = core.decrypt(S, P, msg)
print('\nSecret text: ' + text + '\n')
print(ok)
except:
print(err)
elif s == '-0':
print("Create (or make empty) secret_message.txt in right utf-8 encoding.")
if(not get_yes_no()):
continue
try:
write_txt("secret_message", "")
print(ok)
except:
print(err)
else:
print("Impossible behaviour, mistake in source code!\nThe string allowed in the inp array is not bound to the call of any function!")
return 1
return 0
def get_yes_no(): def get_yes_no():
s = input("Confirm (0 = go back, 1 = continue): ") s = input("Confirm (0 = go back, 1 = continue): ")

@ -5,6 +5,7 @@
#all these variables are strings, so it's easy to integrate this code into any project (check GUI and console examples) #all these variables are strings, so it's easy to integrate this code into any project (check GUI and console examples)
#text must be in utf-8 encoding (e.g. force encoding when open txt files, check console example) #text must be in utf-8 encoding (e.g. force encoding when open txt files, check console example)
#keys and messages are saved as base64 strings #keys and messages are saved as base64 strings
#you can use bin_encrypt and bin_decrypt functions if text is a byte array (check console example)
''' '''
import cryptosystem_core as core import cryptosystem_core as core
@ -15,8 +16,9 @@ G = core.restore_G(S, P)
S = core.break_S(G, P) S = core.break_S(G, P)
P = core.break_P(G, S) P = core.break_P(G, S)
core.config("255 210") #this is the default configuration, NO NEED TO WRITE THIS LINE FOR INITIALIZATION, it is just an example of using the function core.config("255 210") #this is the default configuration, NO NEED TO WRITE THIS LINE FOR INITIALIZATION, it is just an example of using the function
#these parameters n and k affect the length of the keys and the number of erroneous bytes in the message #these parameters n and k affect the length of the keys, messages and the number of erroneous bytes in the message
#see the comments below to understand the requirements for n and k #larger values = larger keys; randomly change (n - k) div 2 bytes during encryption, but add (n - k + 1) bytes to each chunk with len (k - 1).
#see the comments below to understand the requirements for n and k (or check console example)
''' '''
#if you want to figure out how the code below works, keep in mind that #if you want to figure out how the code below works, keep in mind that
@ -127,8 +129,13 @@ def unpad_message(msg):
return msg[: -padding_byte] return msg[: -padding_byte]
def encrypt(key, text): def encrypt(key, text):
return bin_encrypt(key, text.encode("utf-8"))
def decrypt(s, p, msg):
return bin_decrypt(s, p, msg).decode("utf-8")
def bin_encrypt(key, text):
G_ = GF(read_pubkey(key)) G_ = GF(read_pubkey(key))
text = text.encode("utf-8")
out = bytes() out = bytes()
while len(text) > k - 1: while len(text) > k - 1:
tmp = text[: k - 1] tmp = text[: k - 1]
@ -137,6 +144,16 @@ def encrypt(key, text):
out += encrypt_one(G_, text) out += encrypt_one(G_, text)
return base64.b64encode(out).decode() return base64.b64encode(out).decode()
def bin_decrypt(s, p, msg):
S_inv = np.linalg.inv(GF(read_privkey_s(s)))
P_inv = GF(build_P_inv(read_privkey_p(p)))
msg = [int(i) for i in base64.b64decode(msg)]
msg = [msg[i - n : i] for i in range(n, len(msg) + n, n)]
msg = [decrypt_one(S_inv, P_inv, GF(i)) for i in msg]
msg = [i for j in msg for i in j]
msg = bytes(msg)
return msg
def encrypt_one(G_, text): def encrypt_one(G_, text):
msg = pad_message(text, k) msg = pad_message(text, k)
m = GF(msg) m = GF(msg)
@ -151,16 +168,6 @@ def encrypt_one(G_, text):
c = c + GF(z) c = c + GF(z)
return bytes(c) return bytes(c)
def decrypt(s, p, msg):
S_inv = np.linalg.inv(GF(read_privkey_s(s)))
P_inv = GF(build_P_inv(read_privkey_p(p)))
msg = [int(i) for i in base64.b64decode(msg)]
msg = [msg[i - n : i] for i in range(n, len(msg) + n, n)]
msg = [decrypt_one(S_inv, P_inv, GF(i)) for i in msg]
msg = [i for j in msg for i in j]
msg = bytes(msg).decode("utf-8")
return msg
def decrypt_one(S_inv, P_inv, msg): def decrypt_one(S_inv, P_inv, msg):
msg = msg @ P_inv msg = msg @ P_inv
msg, e = rs.decode(msg, errors = True) msg, e = rs.decode(msg, errors = True)

@ -3,7 +3,7 @@ McEliece cryptosystem implementation by vovuas2003
Required Python libraries: numpy, galois. Required Python libraries: numpy, galois.
All cryptosystem functions are implemented in cryptosystem_core.py, just import it into your project and enjoy! All cryptosystem functions are implemented in cryptosystem_core.py, just import it into your project and enjoy!
For example, I coded a console menu (that works with txt files) and a GUI app. For example, I coded a console menu (that works with text in txt files and also with any files in binary mode) and a GUI app (for text encryption).
It is possible to build portable exe with pyinstaller and run code on a computer that does not have Python installed. It is possible to build portable exe with pyinstaller and run code on a computer that does not have Python installed.
But it is NOT compilation, so exe file will be quite large. But it is NOT compilation, so exe file will be quite large.

Loading…
Cancel
Save