From 893bf7152810a91e4402de87ff60dec576451b8d Mon Sep 17 00:00:00 2001 From: nihonium Date: Fri, 18 Oct 2024 11:27:57 +0300 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=D0=92=D1=8B=D0=BD=D0=B5=D1=81=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- McEliece_tests.py | 50 +++++++++++++++++++++++++++++++++++++++++ cryptosystem_core.py | 53 -------------------------------------------- 2 files changed, 50 insertions(+), 53 deletions(-) create mode 100644 McEliece_tests.py diff --git a/McEliece_tests.py b/McEliece_tests.py new file mode 100644 index 0000000..83028c1 --- /dev/null +++ b/McEliece_tests.py @@ -0,0 +1,50 @@ +from cryptosystem_core import * + +def main(): #comment "return" for testing + core = McEliece_core() + n, k = core.get_config() + print(n, k) + core.change_config(5, 3) #check comments in class implementation to understand possible values + n, k = core.get_config() + print(n, k) + print() + core.generate_keys() #true random + print(core.get_pubkey()) + print(core.get_privkey_S()) + print(core.get_privkey_p()) + print() + core.generate_keys(sum([ord(i) for i in list("password")])) #very simple seed + G = core.get_pubkey() + S = core.get_privkey_S() + p = core.get_privkey_p() + print(G) + print(S) + print(p) + print() + core.change_config(5, 3) #unset all keys inside core + core.set_privkey_S(S) + core.set_privkey_p(p) + core.restore_pubkey() + print(core.get_pubkey() == G) + core.change_config(5, 3) #unset all keys inside core + core.set_pubkey(G) + core.set_privkey_p(p) + core.restore_privkey_S() + print(core.get_privkey_S() == S) + core.change_config(5, 3) #unset all keys inside core + core.set_pubkey(G) + core.set_privkey_S(S) + core.restore_privkey_p() + print(core.get_privkey_p() == p) + print() + for j in range(2): + text = [i + 1 for i in range(5)] + msg = core.encrypt(text) + print(msg) + text = core.decrypt(msg) + print(text) + print() + print("All tests are finished!") + +if __name__ == "__main__": + main() diff --git a/cryptosystem_core.py b/cryptosystem_core.py index eaf3070..66fd2f7 100644 --- a/cryptosystem_core.py +++ b/cryptosystem_core.py @@ -11,56 +11,6 @@ import numpy as np import galois import random -#import cryptosystem_core_v2 as ME_core -#core = ME_core.McEliece_core() - -def main(): #comment "return" for testing - return - core = McEliece_core() - n, k = core.get_config() - print(n, k) - core.change_config(5, 3) #check comments in class implementation to understand possible values - n, k = core.get_config() - print(n, k) - print() - core.generate_keys() #true random - print(core.get_pubkey()) - print(core.get_privkey_S()) - print(core.get_privkey_p()) - print() - core.generate_keys(sum([ord(i) for i in list("password")])) #very simple seed - G = core.get_pubkey() - S = core.get_privkey_S() - p = core.get_privkey_p() - print(G) - print(S) - print(p) - print() - core.change_config(5, 3) #unset all keys inside core - core.set_privkey_S(S) - core.set_privkey_p(p) - core.restore_pubkey() - print(core.get_pubkey() == G) - core.change_config(5, 3) #unset all keys inside core - core.set_pubkey(G) - core.set_privkey_p(p) - core.restore_privkey_S() - print(core.get_privkey_S() == S) - core.change_config(5, 3) #unset all keys inside core - core.set_pubkey(G) - core.set_privkey_S(S) - core.restore_privkey_p() - print(core.get_privkey_p() == p) - print() - for j in range(2): - text = [i + 1 for i in range(5)] - msg = core.encrypt(text) - print(msg) - text = core.decrypt(msg) - print(text) - print() - print("All tests are finished!") - class McEliece_core: def __init__(self): self._order = 256 #p^m = 2**8; encryption of each byte @@ -262,6 +212,3 @@ class McEliece_core: if msg[-i] != last_value: raise Exception() return msg[: -last_value] - -if __name__ == "__main__": - main() From d66419d906fda70a8f14519612b08c46ca72094d Mon Sep 17 00:00:00 2001 From: nihonium Date: Fri, 18 Oct 2024 11:41:44 +0300 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=D0=9F=D0=BE=D0=B4=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D1=81=20=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- McEliece_console.py | 8 +++----- cryptosystem_core.py | 14 +++++++------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/McEliece_console.py b/McEliece_console.py index cb8b33a..8302861 100644 --- a/McEliece_console.py +++ b/McEliece_console.py @@ -1,5 +1,3 @@ -#pyinstaller -F -i "icon.ico" McEliece_console_v2.py - import hashlib import getpass @@ -9,8 +7,8 @@ def main(): def safe_start(): try: start_menu() - except: - print("\nUnknown error (maybe ctrl+c), emergency exit!") + except (KeyboardInterrupt, EOFError): + print("\nExiting...") def start_menu(): f = True @@ -29,7 +27,7 @@ def start_menu(): input() def menu(): - import cryptosystem_core_v2 as ME_core + import cryptosystem_core as ME_core core = ME_core.McEliece_core() global_info = "All files are interpreted as raw bytes and must be located in the directory with this executable file.\nDefault filenames with .bin extension: pubkey, privkey_S, privkey_p, plaintext, ciphertext, ciphered_string.\nDon't forget to import (or generate) keys before encryption/decryption and after changing config!\nYou can restore any one key from two another (don't forget to import before).\n" info = "Menu numbers: 0 = exit, s = print short info, h = print this info, g = print global info, c = change config;\n1 = generate keys, 10 = unsafe generate keys (seed = hash(password)),\n11 = export pubkey, 12 = export privkey_S, 13 = export privkey_p,\n14 = import pubkey, 15 = import privkey_S, 16 = import privkey_p,\n17 = restore pubkey, 18 = restore privkey_S, 19 = restore privkey_p;\n2 = encrypt,\n21 = encrypt non-default filename, 22 = encrypt string from keyboard, 23 = encrypt hided string.\n3 = decrypt,\n31 = decrypt non-default filename, 32 = decrypt string and show on screen\n" diff --git a/cryptosystem_core.py b/cryptosystem_core.py index 66fd2f7..bd92664 100644 --- a/cryptosystem_core.py +++ b/cryptosystem_core.py @@ -30,7 +30,7 @@ class McEliece_core: raise Exception() rs = galois.ReedSolomon(n, k, field = self._GF) except: - raise Exception() + raise else: self._n = n self._k = k @@ -65,7 +65,7 @@ class McEliece_core: G = [G[i - self._n : i] for i in range(self._n, self._n * self._k + self._n, self._n)] G = self._GF(G) except: - raise Exception() + raise else: self._G = G def set_privkey_S(self, S): @@ -74,7 +74,7 @@ class McEliece_core: S = self._GF(S) S_inv = np.linalg.inv(S) except: - raise Exception() + raise else: self._S = S self._S_inv = S_inv @@ -96,7 +96,7 @@ class McEliece_core: try: S_inv = np.linalg.inv(S) except: - raise Exception() + raise self._S = S self._S_inv = S_inv def restore_privkey_p(self): @@ -134,14 +134,14 @@ class McEliece_core: out += self._encrypt_one(text) return out except: - raise Exception() + raise def decrypt(self, msg): try: msg = [msg[i - self._n : i] for i in range(self._n, len(msg) + self._n, self._n)] msg = [self._decrypt_one(self._GF(i)) for i in msg] return [i for j in msg for i in j] except: - raise Exception() + raise #End of top-level functions, please do NOT use functions below without understanding! def _generate_S(self): S = self._GF.Random((self._k, self._k)) @@ -199,7 +199,7 @@ class McEliece_core: try: msg = self._unpad_message(msg) except: - raise Exception() + raise return msg def _pad_message(self, msg): last_value = self._k - (len(msg) % self._k)