Initial commit

This commit is contained in:
Blue Fox 2023-10-14 15:56:37 +02:00
commit 42b7f5de64
40 changed files with 305 additions and 0 deletions

3
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

4
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/theoEnc.iml" filepath="$PROJECT_DIR$/.idea/theoEnc.iml" />
</modules>
</component>
</project>

8
.idea/theoEnc.iml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.10" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

0
PACKAGE/__init__py Executable file
View File

View File

@ -0,0 +1,32 @@
#!/usr/bin/python3
from .otp import encrypt_otp, decrypt_otp
from .compress import compress, decompress
from .random import random_string
class E2EE:
def __init__(self, seed: str):
self.seed = seed
self.key = seed
def get_key(self):
return self.key
def add_compressed_key_part(self, ckeypart: bytes):
length = len(ckeypart)
ckeypart = decrypt_otp(ckeypart, self.key[length-1:])
self.key = self.key[length-1:] # delete the used part of the full key
self.key += decompress(ckeypart)
def generate_compressed_key_part(self, length: int, destroy_used_key=True):
ckeypart = random_string(length)
ckeypart = compress(ckeypart)
ckeypart_enc = encrypt_otp(ckeypart, self.key[len(ckeypart)-1:])
if destroy_used_key:
self.key = self.key[len(ckeypart)-1:] # delete the of the full key which is used now
return ckeypart_enc
def addCKeyPart(self, ckeypart: bytes):
self.add_compressed_key_part(ckeypart, length)
def generateCKeyPart(self, length: int, destroy_used_key=True):
self.generate_compressed_key_part(length, destroy_used_key)

View File

View File

@ -0,0 +1,14 @@
#!/usr/bin/python3
import sys
import zlib
import secrets
import string
def compress(to_compress: str):
ret = zlib.compress(bytes(to_compress, "ascii"), 9)
return ret
def decompress(to_decompress: bytes):
ret = zlib.decompress(to_decompress)
return ret.decode("ascii")

View File

@ -0,0 +1,15 @@
#!/usr/bin/python3
def encrypt_otp(message: bytes, key: str):
if len(message) > len(key): return False;
l = []
for counter, i in enumerate(message):
l.append(i ^ key.encode()[counter])
return bytes(l)
def decrypt_otp(cipher: bytes, key: str):
if len(cipher) > len(key): return False;
l = []
for counter, i in enumerate(cipher):
l.append(i ^ key.encode()[counter])
return bytes(l)

View File

@ -0,0 +1,11 @@
#!/usr/bin/python3
import secrets
import string
def random_string(length: int):
symbols = string.punctuation + string.ascii_letters + string.digits
ret = ""
for _ in range(length):
ret += secrets.choice(symbols)
return ret

10
PACKAGE/setup.py Executable file
View File

@ -0,0 +1,10 @@
#!/usr/bin/env python
from __future__ import unicode_literals
from distutils.core import setup
setup(name='theoEnc',
version='1.0',
description='Library for using the OTP (OneTimePad) in Python3',
author='Benjamin Burkhardt',
packages=['theoEnc'])

32
PACKAGE/theoEnc/E2EE.py Executable file
View File

@ -0,0 +1,32 @@
#!/usr/bin/python3
from .otp import encrypt_otp, decrypt_otp
from .compress import compress, decompress
from .random import random_string
class E2EE:
def __init__(self, seed: str):
self.seed = seed
self.key = seed
def get_key(self):
return self.key
def add_compressed_key_part(self, ckeypart: bytes):
length = len(ckeypart)
ckeypart = decrypt_otp(ckeypart, self.key[length-1:])
self.key = self.key[length-1:] # delete the used part of the full key
self.key += decompress(ckeypart)
def generate_compressed_key_part(self, length: int, destroy_used_key=True):
ckeypart = random_string(length)
ckeypart = compress(ckeypart)
ckeypart_enc = encrypt_otp(ckeypart, self.key[len(ckeypart)-1:])
if destroy_used_key:
self.key = self.key[len(ckeypart)-1:] # delete the of the full key which is used now
return ckeypart_enc
def addCKeyPart(self, ckeypart: bytes):
self.add_compressed_key_part(ckeypart, length)
def generateCKeyPart(self, length: int, destroy_used_key=True):
self.generate_compressed_key_part(length, destroy_used_key)

0
PACKAGE/theoEnc/__init__.py Executable file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

14
PACKAGE/theoEnc/compress.py Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/python3
import sys
import zlib
import secrets
import string
def compress(to_compress: str):
ret = zlib.compress(bytes(to_compress, "ascii"), 9)
return ret
def decompress(to_decompress: bytes):
ret = zlib.decompress(to_decompress)
return ret.decode("ascii")

15
PACKAGE/theoEnc/otp.py Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/python3
def encrypt_otp(message: bytes, key: str):
if len(message) > len(key): return False;
l = []
for counter, i in enumerate(message):
l.append(i ^ key.encode()[counter])
return bytes(l)
def decrypt_otp(cipher: bytes, key: str):
if len(cipher) > len(key): return False;
l = []
for counter, i in enumerate(cipher):
l.append(i ^ key.encode()[counter])
return bytes(l)

11
PACKAGE/theoEnc/random.py Executable file
View File

@ -0,0 +1,11 @@
#!/usr/bin/python3
import secrets
import string
def random_string(length: int):
symbols = string.punctuation + string.ascii_letters + string.digits
ret = ""
for _ in range(length):
ret += secrets.choice(symbols)
return ret

12
client.py Executable file
View File

@ -0,0 +1,12 @@
#!/usr/bin/python3
from theoEnc.E2EE import E2EE
seed = input("Seed: ")
e2ee = E2EE(seed)
while True:
ckeypart = input("Neuer Schlüsselteil: ").encode()
e2ee.add_compressed_key_part(ckeypart, 10)
print("\nKey: " + e2ee.get_key())

14
server.py Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/python3
from theoEnc.E2EE import E2EE
from theoEnc.random import random_string
seed = random_string(20)
print("Seed: " + seed)
e2ee = E2EE(seed)
while True:
input("Neuer Schlüsselteil: [ENTER] ")
ckeypart = e2ee.generate_compressed_key_part(10)
print("\nKey: " + e2ee.get_key() + "\nNeuer kompressierter Schlüsselteil: " + ckeypart.decode())

24
test.py Executable file
View File

@ -0,0 +1,24 @@
#!/usr/bin/python3
from theoEnc.E2EE import E2EE
from theoEnc.random import random_string
LEN = 499900
seed = random_string(500000)
print("[SERVER] Length of Seed: " + str(len(seed)))
e2ee_server = E2EE(seed)
e2ee_client = E2EE(seed)
print("\n[SERVER] Generating new compressed key part (CKP)...")
ckp = e2ee_server.generate_compressed_key_part(LEN, destroy_used_key=False)
e2ee_server.add_compressed_key_part(ckp)
print("[SERVER] Generated.")
print("[SERVER] Length of Key: " + str(len(e2ee_server.get_key())))
print("[CLIENT] Adding CCP...")
e2ee_client.add_compressed_key_part(ckp)
print("[CLIENT] Added.")
print("[CLIENT] Length of Key: " + str(len(e2ee_client.get_key())))

32
theoEnc/E2EE.py Executable file
View File

@ -0,0 +1,32 @@
#!/usr/bin/python3
from .otp import encrypt_otp, decrypt_otp
from .compress import compress, decompress
from .random import random_string
class E2EE:
def __init__(self, seed: str):
self.seed = seed
self.key = seed
def get_key(self):
return self.key
def add_compressed_key_part(self, ckeypart: bytes):
length = len(ckeypart)
ckeypart = decrypt_otp(ckeypart, self.key[length-1:])
self.key = self.key[length-1:] # delete the used part of the full key
self.key += decompress(ckeypart)
def generate_compressed_key_part(self, length: int, destroy_used_key=True):
ckeypart = random_string(length)
ckeypart = compress(ckeypart)
ckeypart_enc = encrypt_otp(ckeypart, self.key[len(ckeypart)-1:])
if destroy_used_key:
self.key = self.key[len(ckeypart)-1:] # delete the of the full key which is used now
return ckeypart_enc
def addCKeyPart(self, ckeypart: bytes):
self.add_compressed_key_part(ckeypart, length)
def generateCKeyPart(self, length: int, destroy_used_key=True):
self.generate_compressed_key_part(length, destroy_used_key)

0
theoEnc/__init__.py Executable file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

14
theoEnc/compress.py Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/python3
import sys
import zlib
import secrets
import string
def compress(to_compress: str):
ret = zlib.compress(bytes(to_compress, "ascii"), 9)
return ret
def decompress(to_decompress: bytes):
ret = zlib.decompress(to_decompress)
return ret.decode("ascii")

15
theoEnc/otp.py Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/python3
def encrypt_otp(message: bytes, key: str):
if len(message) > len(key): return False;
l = []
for counter, i in enumerate(message):
l.append(i ^ key.encode()[counter])
return bytes(l)
def decrypt_otp(cipher: bytes, key: str):
if len(cipher) > len(key): return False;
l = []
for counter, i in enumerate(cipher):
l.append(i ^ key.encode()[counter])
return bytes(l)

11
theoEnc/random.py Executable file
View File

@ -0,0 +1,11 @@
#!/usr/bin/python3
import secrets
import string
def random_string(length: int):
symbols = string.punctuation + string.ascii_letters + string.digits
ret = ""
for _ in range(length):
ret += secrets.choice(symbols)
return ret