#pyinstaller -F -i "icon.ico" McEliece_console.py
import hashlib
import getpass
import random
import base64
def main ( ) :
safe_start ( )
def safe_start ( ) :
try :
start_menu ( )
except :
print ( " \n Unknown error (maybe ctrl+c), emergency exit! " )
def start_menu ( ) :
f = True
print ( " \n A soldering iron is into a black hole. " )
#thermorectal cryptanalysis
if myhash ( getpass . getpass ( " Login: " ) ) != 1314399736851798576 :
f = False
if myhash ( getpass . getpass ( " Password: " ) ) != 192441972608755898 :
f = False
if f :
print ( " Authorization successful, wait a bit. " )
menu ( )
else :
print ( " Permission denied. " )
print ( " \n Press ENTER to exit. " , end = ' ' )
input ( )
def menu ( ) :
import cryptosystem_core as core
print ( " \n McEliece 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 " )
info = " Menu numbers: 0 = exit; 1 = generate keys, 2 = encrypt, 3 = decrypt, \n 4 = 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; \n c = config, b = binary menu, u = unsafe keygen by password, h = help. \n "
err = " Error! Check command info and try again! \n "
ok = " Operation successful. \n "
inp = [ str ( i ) for i in range ( 7 ) ] + [ ' - ' + str ( i ) for i in range ( 7 ) ] + [ ' c ' , ' b ' , ' h ' , ' u ' ] + [ ' 1337 ' , ' -1337 ' ]
print ( info )
while True :
s = input ( " Menu number: " )
while s not in inp :
s = input ( " Wrong menu number, h = help: " )
if s == ' h ' :
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 ' :
print ( " Default config is 255 210, current is " + str ( core . n ) + " " + str ( core . k ) + " . Change config? " )
if ( not get_yes_no ( ) ) :
continue
try :
print ( " Config is two numbers n >= k >= 2; (3 * 5 * 17) mod n = 0. Larger values = larger keys. \n Randomly 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: " ) )
print ( ok )
except :
print ( err )
elif s == ' 0 ' :
print ( " \n Good luck! " )
break
elif s == ' u ' :
print ( " WARNING: setting sha256hash(password) mod 2^32 as random seed is VERY unsafe practice! \n It is better to use menu number 1 for independent random. " )
print ( " This operation will rewrite pubkey.txt, privkey_s.txt and privkey_p.txt; are you sure? " )
if ( not get_yes_no ( ) ) :
continue
try :
seed = normalhash ( getpass . getpass ( " Any password for hashing: " ) )
G , S , P = core . unsafe_generate ( seed )
write_txt ( " pubkey " , G )
write_txt ( " privkey_s " , S )
write_txt ( " privkey_p " , P )
print ( ok )
except :
print ( err )
elif s == ' 1 ' :
print ( " This operation will rewrite pubkey.txt, privkey_s.txt and privkey_p.txt; are you sure? " )
if ( not get_yes_no ( ) ) :
continue
try :
G , S , P = core . generate ( )
write_txt ( " pubkey " , G )
write_txt ( " privkey_s " , S )
write_txt ( " privkey_p " , P )
print ( ok )
except :
print ( err )
elif s == ' 2 ' :
print ( " Write your text into text.txt; pubkey.txt is required, message.txt will be rewritten. " )
if ( not get_yes_no ( ) ) :
continue
try :
G = read_txt ( " pubkey " )
text = read_txt ( " text " )
msg = core . encrypt ( G , text )
write_txt ( " message " , msg )
print ( ok )
except :
print ( err )
elif s == ' 3 ' :
print ( " You need message.txt, privkey_s.txt and privkey_p.txt; text.txt will be rewritten. " )
if ( not get_yes_no ( ) ) :
continue
try :
S = read_txt ( " privkey_s " )
P = read_txt ( " privkey_p " )
msg = read_txt ( " message " )
text = core . decrypt ( S , P , msg )
write_txt ( " text " , text )
print ( ok )
except :
print ( err )
elif s == ' 4 ' :
print ( " You need privkey_s.txt and privkey_p.txt; pubkey.txt will be rewritten. " )
if ( not get_yes_no ( ) ) :
continue
try :
S = read_txt ( " privkey_s " )
P = read_txt ( " privkey_p " )
G = core . restore_G ( S , P )
write_txt ( " pubkey " , G )
print ( ok )
except :
print ( err )
elif s == ' 5 ' :
print ( " You need pubkey.txt and privkey_p.txt; privkey_s.txt will be rewritten. " )
if ( not get_yes_no ( ) ) :
continue
try :
G = read_txt ( " pubkey " )
P = read_txt ( " privkey_p " )
S = core . break_S ( G , P )
write_txt ( " privkey_s " , S )
print ( ok )
except :
print ( err )
elif s == ' 6 ' :
print ( " You need pubkey.txt and privkey_s.txt; privkey_p.txt will be rewritten. " )
if ( not get_yes_no ( ) ) :
continue
try :
G = read_txt ( " pubkey " )
S = read_txt ( " privkey_s " )
P = core . break_P ( G , S )
write_txt ( " privkey_p " , P )
print ( ok )
except :
print ( err )
elif s == ' -0 ' :
print ( " Create (or make empty) all 5 necessary txt files in right utf-8 encoding. " )
if ( not get_yes_no ( ) ) :
continue
try :
write_txt ( " pubkey " , " " )
write_txt ( " privkey_s " , " " )
write_txt ( " privkey_p " , " " )
write_txt ( " text " , " " )
write_txt ( " message " , " " )
print ( ok )
except :
print ( err )
elif s == ' -1 ' :
print ( " Create (or make empty) all 3 keys txt files in right utf-8 encoding. " )
if ( not get_yes_no ( ) ) :
continue
try :
write_txt ( " pubkey " , " " )
write_txt ( " privkey_s " , " " )
write_txt ( " privkey_p " , " " )
print ( ok )
except :
print ( err )
elif s == ' -2 ' :
print ( " Create (or make empty) text.txt in right utf-8 encoding. " )
if ( not get_yes_no ( ) ) :
continue
try :
write_txt ( " text " , " " )
print ( ok )
except :
print ( err )
elif s == ' -3 ' :
print ( " Create (or make empty) message.txt in right utf-8 encoding. " )
if ( not get_yes_no ( ) ) :
continue
try :
write_txt ( " message " , " " )
print ( ok )
except :
print ( err )
elif s == ' -4 ' :
print ( " Create (or make empty) pubkey.txt in right utf-8 encoding. " )
if ( not get_yes_no ( ) ) :
continue
try :
write_txt ( " pubkey " , " " )
print ( ok )
except :
print ( err )
elif s == ' -5 ' :
print ( " Create (or make empty) privkey_s.txt in right utf-8 encoding. " )
if ( not get_yes_no ( ) ) :
continue
try :
write_txt ( " privkey_s " , " " )
print ( ok )
except :
print ( err )
elif s == ' -6 ' :
print ( " Create (or make empty) privkey_p.txt in right utf-8 encoding. " )
if ( not get_yes_no ( ) ) :
continue
try :
write_txt ( " privkey_p " , " " )
print ( ok )
except :
print ( err )
elif s == ' 1337 ' :
c = input ( " Move the soldering iron into the black hole number: " )
try :
PT ( int ( c ) )
except :
print ( " Iron: ' I don ' t know this hole. ' " )
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! \n The string allowed in the inp array is not bound to the call of any function! " )
break
def bin_menu ( core ) :
print ( " \n First 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 :
print ( " Impossible behaviour, mistake in source code! \n The 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 ( " \n Hidden 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
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 ( ' \n Secret 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! \n The string allowed in the inp array is not bound to the call of any function! " )
return 1
return 0
def get_yes_no ( ) :
s = input ( " Confirm (0 = go back, 1 = continue): " )
while s not in [ ' 0 ' , ' 1 ' ] :
s = input ( " Try again, 0 or 1: " )
return int ( s )
def myhash ( s , m = 2 * * 61 - 1 , p = 257 ) :
a = 0
for i in range ( len ( s ) ) :
a = ( ( a * p ) % m + ord ( s [ i ] ) ) % m
return a
def normalhash ( s ) :
return int ( hashlib . sha256 ( bytearray ( s , ' utf-8 ' ) ) . hexdigest ( ) , 16 )
def PT ( m , M = 3 ) :
if m == 0 :
print ( " Iron: ' OK, I will choose the number by myself. ' " )
while m == 0 :
m = random . randint ( - M , M )
s = " PT! "
p = " "
f = False
if m < 0 :
s , p = p , s
m * = - 1
f = True
if m > M :
print ( " Iron: ' Are you sure to move me so far? ' " )
if ( not get_yes_no ( ) ) :
return
print ( )
if f :
print ( p * ( 10 * m + 1 ) )
print ( p + ( s * 3 + p + s * 3 + p + s + p ) * m )
print ( p + ( s + p + s + p * 2 + s + p * 2 + s + p ) * m )
print ( p + ( s * 3 + p * 2 + s + p * 2 + s + p ) * m )
print ( p + ( s + p * 4 + s + p * 4 ) * m )
print ( p + ( s + p * 4 + s + p * 2 + s + p ) * m )
if f :
print ( p * ( 10 * m + 1 ) )
print ( )
def write_txt ( name , string ) :
with open ( name + " .txt " , " w " , encoding = " utf-8 " ) as f :
f . write ( string )
def read_txt ( name ) :
with open ( name + " .txt " , " r " , encoding = " utf-8 " ) as f :
out = f . read ( )
return out
if __name__ == " __main__ " :
main ( )