diff --git a/crypto/custom_encryption/custom_encryption.py b/crypto/custom_encryption/custom_encryption.py new file mode 100644 index 0000000..9967cd4 --- /dev/null +++ b/crypto/custom_encryption/custom_encryption.py @@ -0,0 +1,64 @@ +from random import randint +import sys + + +def generator(g, x, p): + return pow(g, x) % p + + +def encrypt(plaintext, key): + cipher = [] + for char in plaintext: + cipher.append(((ord(char) * key*311))) + return cipher + + +def is_prime(p): + v = 0 + for i in range(2, p + 1): + if p % i == 0: + v = v + 1 + if v > 1: + return False + else: + return True + + +def dynamic_xor_encrypt(plaintext, text_key): + cipher_text = "" + key_length = len(text_key) + for i, char in enumerate(plaintext[::-1]): + key_char = text_key[i % key_length] + encrypted_char = chr(ord(char) ^ ord(key_char)) + cipher_text += encrypted_char + return cipher_text + + +def test(plain_text, text_key): + p = 97 + g = 31 + if not is_prime(p) and not is_prime(g): + print("Enter prime numbers") + return + a = randint(p-10, p) + b = randint(g-10, g) + print(f"a = {a}") + print(f"b = {b}") + u = generator(g, a, p) + v = generator(g, b, p) + key = generator(v, a, p) + b_key = generator(u, b, p) + shared_key = None + if key == b_key: + shared_key = key + else: + print("Invalid key") + return + semi_cipher = dynamic_xor_encrypt(plain_text, text_key) + cipher = encrypt(semi_cipher, shared_key) + print(f'cipher is: {cipher}') + + +if __name__ == "__main__": + message = sys.argv[1] + test(message, "trudeau") diff --git a/crypto/custom_encryption/enc_flag b/crypto/custom_encryption/enc_flag new file mode 100644 index 0000000..743ebb5 --- /dev/null +++ b/crypto/custom_encryption/enc_flag @@ -0,0 +1,3 @@ +a = 97 +b = 22 +cipher is: [151146, 1158786, 1276344, 1360314, 1427490, 1377108, 1074816, 1074816, 386262, 705348, 0, 1393902, 352674, 83970, 1141992, 0, 369468, 1444284, 16794, 1041228, 403056, 453438, 100764, 100764, 285498, 100764, 436644, 856494, 537408, 822906, 436644, 117558, 201528, 285498] diff --git a/crypto/custom_encryption/solve.py b/crypto/custom_encryption/solve.py new file mode 100755 index 0000000..be5f326 --- /dev/null +++ b/crypto/custom_encryption/solve.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +def generator(g, x, p): + return pow(g, x) % p + +# xor encryption is symmetric, apart +# from the reversing part +def dynamic_xor_decrypt(plaintext, text_key): + cipher_text = "" + key_length = len(text_key) + for i, char in enumerate(plaintext): + key_char = text_key[i % key_length] + encrypted_char = chr(ord(char) ^ ord(key_char)) + cipher_text += encrypted_char + return ''.join(reversed(cipher_text)) + +def decrypt(cipher, key): + plaintext = '' + for char in cipher: + plaintext += chr(char // (key * 311)) + return plaintext + +cipher = [151146, 1158786, 1276344, 1360314, 1427490, 1377108, 1074816, 1074816, 386262, 705348, 0, 1393902, 352674, 83970, 1141992, 0, 369468, 1444284, 16794, 1041228, 403056, 453438, 100764, 100764, 285498, 100764, 436644, 856494, 537408, 822906, 436644, 117558, 201528, 285498] + +if __name__ == '__main__': + p = 97 + g = 31 + a = 97 + b = 22 + u = generator(g, a, p) + v = generator(g, b, p) + key = generator(v, a, p) + b_key = generator(u, b, p) + assert key == b_key + decrypted = decrypt(cipher, key) + xor_decrypted = dynamic_xor_decrypt(decrypted, 'trudeau') + print(xor_decrypted) + +