From 65a0c8d509d2909e4e88454e8043b0809f98ac92 Mon Sep 17 00:00:00 2001 From: Donovan Date: Mon, 20 May 2024 16:19:59 -0500 Subject: [PATCH] working version of darc --- src/mimick_csharp_test.py | 67 +++++++++++-------- src/models.py | 131 +++++++++++++++++++++++++++++++++----- 2 files changed, 153 insertions(+), 45 deletions(-) diff --git a/src/mimick_csharp_test.py b/src/mimick_csharp_test.py index d73690b..842c259 100644 --- a/src/mimick_csharp_test.py +++ b/src/mimick_csharp_test.py @@ -237,7 +237,6 @@ def merge_message(alphabet: DarcKey, medium: DarcKey, client_peristent_keys: Cli message = operand ^ (operand1 << inner_function_key_applied) - outer_position_shuffle_function_key_applied = client_peristent_keys.OuterPositionShuffleFunctionMediumKey << mutual_ephemeral_keys.OuterPositionShuffleFunctionMediumEphemeralKey position_shuffle_key_applied = client_peristent_keys.PositionShuffleMediumKey << mutual_ephemeral_keys.PositionShuffleMediumEphemeralKey @@ -288,26 +287,6 @@ def darc_phase_4(darc_message: DarcKey, server_persistent_keys: ServerPersistent rx_data = operand ^ (operand1 << inner_key) ^ (operand2 << inner_key) ^ (operand3 << inner_key) ^ (operand4 << inner_key) - - """ - - FunctionTranslation PositionFunctionKey = ServerPersistentKeys.PositionFunctionMediumKey; - FunctionTranslation PositionFunctionEphemeralKey = MutualEphemeralKeys.PositionFunctionMediumEphemeralKey; - FunctionTranslation PositionFunctionEphemeralKeyApplied = new FunctionTranslation { Data = Transform.TransformationCompliment(Transform.PermuteInnerTransformation(PositionFunctionKey.Data, PositionFunctionEphemeralKey.Data)) }; - - - #region Inner Shuffle - - RxData = Transform.PermuteInnerTransformation( - RxData.Convert(), - Transform.PermuteInnerTransformation( - Transform.TransformationCompliment( - PositionShuffleEphemeralKeyApplied.Data - ), - Transform.PermuteOuterTransformation( - PositionFunctionEphemeralKeyApplied.Data.Convert(), - OuterPositionFunctionEphemeralKeyApplied.Data).Convert())).Convert(); - """ position_function_ephemeral_key_applied = server_persistent_keys.PositionFunctionMediumKey << mutual_ephemeral_keys.PositionFunctionMediumEphemeralKey rx_data = rx_data << (~(position_shuffle_ephemeral_key_applied) << (~position_function_ephemeral_key_applied < outer_position_function_ephemeral_key_applied)) @@ -370,20 +349,52 @@ if __name__ == "__main__": server_ephemeral_keys = {k: {"matrix": v} for k, v in server_ephemeral_keys.items()} mutual_ephemeral_keys = {k: {"matrix": v} for k, v in mutual_ephemeral_keys.items()} - client_persistent_keys = ClientPersistentKeys(**client_persistent_keys) - client_ephemeral_keys = ClientEphemeralKeys(**client_ephemeral_keys) - server_persistent_keys = ServerPersistentKeys(**server_persistent_keys) - server_ephemeral_keys = ServerEphemeralKeys(**server_ephemeral_keys) - mutual_ephemeral_keys = MutualEphemeralKeys(**mutual_ephemeral_keys) +# client_persistent_keys = ClientPersistentKeys(**client_persistent_keys) +# client_ephemeral_keys = ClientEphemeralKeys(**client_ephemeral_keys) +# server_persistent_keys = ServerPersistentKeys(**server_persistent_keys) +# server_ephemeral_keys = ServerEphemeralKeys(**server_ephemeral_keys) +# mutual_ephemeral_keys = MutualEphemeralKeys(**mutual_ephemeral_keys) + + client_persistent_keys = ClientPersistentKeys.random_init(height, width) + client_ephemeral_keys = ClientEphemeralKeys.random_init(height, width) + server_persistent_keys = ServerPersistentKeys.random_init(height, width) + server_ephemeral_keys = ServerEphemeralKeys.random_init(height, width) + mutual_ephemeral_keys = MutualEphemeralKeys.random_init(height, width) + + server_persistent_keys.ServerKey = server_persistent_keys.ServerKey ^ client_persistent_keys.MutualKey + server_persistent_keys.ServerMediumKey = server_persistent_keys.ServerMediumKey ^ client_persistent_keys.MutualMediumKey + + client_persistent_keys.MutualKey = client_persistent_keys.MutualKey ^ client_persistent_keys.ClientKey + client_persistent_keys.MutualMediumKey = client_persistent_keys.MutualMediumKey ^ client_persistent_keys.ClientMediumKey + + server_persistent_keys.MutualKey = client_persistent_keys.MutualKey + server_persistent_keys.MutualMediumKey = client_persistent_keys.MutualMediumKey + + server_persistent_keys.OuterFunctionKey = client_persistent_keys.OuterFunctionKey + server_persistent_keys.OuterFunctionFunctionKey = client_persistent_keys.OuterFunctionFunctionKey + server_persistent_keys.OuterServerShuffleFunctionKey = client_persistent_keys.OuterServerShuffleFunctionKey + server_persistent_keys.FunctionKey = client_persistent_keys.FunctionKey + server_persistent_keys.ClientShuffleKeyX = client_persistent_keys.ClientShuffleKeyX + server_persistent_keys.OuterFunctionMediumKey = client_persistent_keys.OuterFunctionMediumKey + server_persistent_keys.OuterFunctionFunctionMediumKey = client_persistent_keys.OuterFunctionFunctionMediumKey + server_persistent_keys.OuterServerShuffleFunctionMediumKey = client_persistent_keys.OuterServerShuffleFunctionMediumKey + server_persistent_keys.FunctionMediumKey = client_persistent_keys.FunctionMediumKey + server_persistent_keys.ClientShuffleMediumKeyX = client_persistent_keys.ClientShuffleMediumKeyX + server_persistent_keys.OuterPositionShuffleMediumKey = client_persistent_keys.OuterPositionShuffleMediumKey + server_persistent_keys.OuterPositionShuffleFunctionMediumKey = client_persistent_keys.OuterPositionShuffleFunctionMediumKey + server_persistent_keys.OuterPositionFunctionMediumKey = client_persistent_keys.OuterPositionFunctionMediumKey + server_persistent_keys.PositionFunctionMediumKey = client_persistent_keys.PositionFunctionMediumKey + server_persistent_keys.PositionShuffleMediumKey = client_persistent_keys.PositionShuffleMediumKey + (phase1_alphabet, phase1_medium) = darc_phase1(server_persistent_keys, server_ephemeral_keys, mutual_ephemeral_keys) (phase2_alphabet, phase2_medium) = darc_phase2(phase1_alphabet, phase1_medium, client_persistent_keys, client_ephemeral_keys, mutual_ephemeral_keys) (phase3_alphabet, phase3_medium) = darc_phase3(phase2_alphabet, phase2_medium, client_persistent_keys, client_ephemeral_keys, mutual_ephemeral_keys) -# original_message = [0, 2, 4, 6, 0, 5, 9, 9, 1, 7] - original_message = [0, 2, 4, 6] + original_message = [0, 2, 4, 6, 7, 8, 9] darc_message = merge_message(phase3_alphabet, phase3_medium, client_persistent_keys, client_ephemeral_keys, mutual_ephemeral_keys, original_message) message = darc_phase_4(darc_message, server_persistent_keys, server_ephemeral_keys, mutual_ephemeral_keys) + print(original_message) print(message) diff --git a/src/models.py b/src/models.py index 949aeb0..b38549a 100644 --- a/src/models.py +++ b/src/models.py @@ -111,9 +111,9 @@ class OuterShuffleKey(DarcKey): key_type = DarcKeyTypes.outer_shuffle @classmethod - def init_matrix(cls, row_length: int): + def init_matrix(cls, height: int): """ originally buildRandom """ - matrix = [cls._random_shuffle(list(range(row_length)))] + matrix = [cls._random_shuffle(list(range(height)))] return OuterShuffleKey( matrix=matrix, ) @@ -123,9 +123,9 @@ class InnerShuffleKey(DarcKey): key_type = DarcKeyTypes.inner_shuffle @classmethod - def init_matrix(cls, row_length: int, column_length: int): + def init_matrix(cls, width: int, height: int): """ originally buildRandom """ - matrix = [cls._random_shuffle(list(range(row_length))) for _ in range(column_length)] + matrix = [cls._random_shuffle(list(range(width))) for _ in range(height)] return InnerShuffleKey( matrix=matrix, ) @@ -136,9 +136,9 @@ class AlphabetKey(DarcKey): max_value: int = 255 @classmethod - def init_matrix(cls, row_length: int, column_length: int, max_value: int): + def init_matrix(cls, width: int, height: int, max_value: int): """ originally buildScramble """ - matrix = [cls._random_mask(row_length, max_value) for _ in range(column_length)] + matrix = [cls._random_mask(width, max_value) for _ in range(height)] return AlphabetKey( matrix=matrix, max_value=max_value @@ -152,6 +152,9 @@ class ServerPersistentKeys(BaseModel): MutualKey: AlphabetKey FunctionKey: InnerShuffleKey ClientShuffleKeyX: InnerShuffleKey + OuterServerShuffleKey: OuterShuffleKey + ServerKey: AlphabetKey + ServerShuffleKey: InnerShuffleKey MutualMediumKey: AlphabetKey OuterFunctionMediumKey: OuterShuffleKey @@ -164,13 +167,34 @@ class ServerPersistentKeys(BaseModel): OuterPositionFunctionMediumKey: OuterShuffleKey PositionFunctionMediumKey: InnerShuffleKey PositionShuffleMediumKey: InnerShuffleKey - - OuterServerShuffleKey: OuterShuffleKey - ServerKey: AlphabetKey - ServerShuffleKey: InnerShuffleKey - ServerMediumKey: AlphabetKey + @classmethod + def random_init(cls, height: int, width: int): + return ServerPersistentKeys( + OuterFunctionKey=OuterShuffleKey.init_matrix(height), + OuterFunctionFunctionKey=OuterShuffleKey.init_matrix(height), + OuterServerShuffleFunctionKey=OuterShuffleKey.init_matrix(height), + MutualKey=AlphabetKey.init_matrix(width, height, 255), + FunctionKey=InnerShuffleKey.init_matrix(width, height), + ClientShuffleKeyX=InnerShuffleKey.init_matrix(width, height), + OuterServerShuffleKey=OuterShuffleKey.init_matrix(height), + ServerKey=AlphabetKey.init_matrix(width, height, 255), + ServerShuffleKey=InnerShuffleKey.init_matrix(width, height), + MutualMediumKey=AlphabetKey.init_matrix(width, height, 255), + OuterFunctionMediumKey=OuterShuffleKey.init_matrix(height), + OuterFunctionFunctionMediumKey=OuterShuffleKey.init_matrix(height), + OuterServerShuffleFunctionMediumKey=OuterShuffleKey.init_matrix(height), + FunctionMediumKey=InnerShuffleKey.init_matrix(width, height), + ClientShuffleMediumKeyX=InnerShuffleKey.init_matrix(width, height), + OuterPositionShuffleMediumKey=OuterShuffleKey.init_matrix(height), + OuterPositionShuffleFunctionMediumKey=OuterShuffleKey.init_matrix(height), + OuterPositionFunctionMediumKey=OuterShuffleKey.init_matrix(height), + PositionFunctionMediumKey=InnerShuffleKey.init_matrix(width, height), + PositionShuffleMediumKey=InnerShuffleKey.init_matrix(width, height), + ServerMediumKey=AlphabetKey.init_matrix(width, height, 255) + ) + class ClientPersistentKeys(BaseModel): OuterFunctionKey: OuterShuffleKey @@ -179,6 +203,10 @@ class ClientPersistentKeys(BaseModel): MutualKey: AlphabetKey FunctionKey: InnerShuffleKey ClientShuffleKeyX: InnerShuffleKey + ClientKey: AlphabetKey + ClientShuffleKeyA: InnerShuffleKey + OuterClientShuffleKey: OuterShuffleKey + OuterClientShuffleFunctionKey: OuterShuffleKey MutualMediumKey: AlphabetKey OuterFunctionMediumKey: OuterShuffleKey @@ -191,25 +219,59 @@ class ClientPersistentKeys(BaseModel): OuterPositionFunctionMediumKey: OuterShuffleKey PositionFunctionMediumKey: InnerShuffleKey PositionShuffleMediumKey: InnerShuffleKey - - ClientKey: AlphabetKey - ClientShuffleKeyA: InnerShuffleKey - OuterClientShuffleKey: OuterShuffleKey - OuterClientShuffleFunctionKey: OuterShuffleKey - OuterClientShuffleMediumKey: OuterShuffleKey OuterClientShuffleFunctionMediumKey: OuterShuffleKey ClientShuffleMediumKeyA: InnerShuffleKey ClientMediumKey: AlphabetKey + @classmethod + def random_init(cls, height: int, width: int): + return ClientPersistentKeys( + OuterFunctionKey=OuterShuffleKey.init_matrix(height), + OuterFunctionFunctionKey=OuterShuffleKey.init_matrix(height), + OuterServerShuffleFunctionKey=OuterShuffleKey.init_matrix(height), + MutualKey=AlphabetKey.init_matrix(width, height, 255), + FunctionKey=InnerShuffleKey.init_matrix(width, height), + ClientShuffleKeyX=InnerShuffleKey.init_matrix(width, height), + ClientKey=AlphabetKey.init_matrix(width, height, 255), + ClientShuffleKeyA=InnerShuffleKey.init_matrix(width, height), + OuterClientShuffleKey=OuterShuffleKey.init_matrix(height), + OuterClientShuffleFunctionKey=OuterShuffleKey.init_matrix(height), + MutualMediumKey=AlphabetKey.init_matrix(width, height, 255), + OuterFunctionMediumKey=OuterShuffleKey.init_matrix(height), + OuterFunctionFunctionMediumKey=OuterShuffleKey.init_matrix(height), + OuterServerShuffleFunctionMediumKey=OuterShuffleKey.init_matrix(height), + FunctionMediumKey=InnerShuffleKey.init_matrix(width, height), + ClientShuffleMediumKeyX=InnerShuffleKey.init_matrix(width, height), + OuterPositionShuffleMediumKey=OuterShuffleKey.init_matrix(height), + OuterPositionShuffleFunctionMediumKey=OuterShuffleKey.init_matrix(height), + OuterPositionFunctionMediumKey=OuterShuffleKey.init_matrix(height), + PositionFunctionMediumKey=InnerShuffleKey.init_matrix(width, height), + PositionShuffleMediumKey=InnerShuffleKey.init_matrix(width, height), + OuterClientShuffleMediumKey=OuterShuffleKey.init_matrix(height), + OuterClientShuffleFunctionMediumKey=OuterShuffleKey.init_matrix(height), + ClientShuffleMediumKeyA=InnerShuffleKey.init_matrix(width, height), + ClientMediumKey=AlphabetKey.init_matrix(width, height, 255) + ) class ServerEphemeralKeys(BaseModel): OuterServerShuffleEphemeralKey: OuterShuffleKey ServerEphemeralKey: AlphabetKey ServerShuffleEphemeralKey: InnerShuffleKey + ServerMediumEphemeralKey: AlphabetKey Alphabet: AlphabetKey + @classmethod + def random_init(cls, height: int, width: int): + return ServerEphemeralKeys( + OuterServerShuffleEphemeralKey=OuterShuffleKey.init_matrix(height), + ServerEphemeralKey=AlphabetKey.init_matrix(width, height, 255), + ServerShuffleEphemeralKey=InnerShuffleKey.init_matrix(width, height), + ServerMediumEphemeralKey=AlphabetKey.init_matrix(width, height, 255), + Alphabet=AlphabetKey.init_matrix(width, height, 255) + ) + class MutualEphemeralKeys(BaseModel): MutualEphemeralKey: AlphabetKey @@ -217,6 +279,7 @@ class MutualEphemeralKeys(BaseModel): OuterFunctionEphemeralKey: OuterShuffleKey OuterFunctionFunctionEphemeralKey: OuterShuffleKey OuterServerShuffleFunctionEphemeralKey: OuterShuffleKey + MutualMediumEphemeralKey: AlphabetKey FunctionMediumEphemeralKey: InnerShuffleKey PositionFunctionMediumEphemeralKey: InnerShuffleKey @@ -228,13 +291,47 @@ class MutualEphemeralKeys(BaseModel): PositionShuffleMediumEphemeralKey: InnerShuffleKey OuterPositionShuffleMediumEphemeralKey: OuterShuffleKey + @classmethod + def random_init(cls, height: int, width: int): + return MutualEphemeralKeys( + MutualEphemeralKey=AlphabetKey.init_matrix(width, height, 255), + FunctionEphemeralKey=InnerShuffleKey.init_matrix(width, height), + OuterFunctionEphemeralKey=OuterShuffleKey.init_matrix(height), + OuterFunctionFunctionEphemeralKey=OuterShuffleKey.init_matrix(height), + OuterServerShuffleFunctionEphemeralKey=OuterShuffleKey.init_matrix(height), + MutualMediumEphemeralKey=AlphabetKey.init_matrix(width, height, 255), + FunctionMediumEphemeralKey=InnerShuffleKey.init_matrix(width, height), + PositionFunctionMediumEphemeralKey=InnerShuffleKey.init_matrix(width, height), + OuterFunctionMediumEphemeralKey=OuterShuffleKey.init_matrix(height), + OuterFunctionFunctionMediumEphemeralKey=OuterShuffleKey.init_matrix(height), + OuterPositionFunctionMediumEphemeralKey=OuterShuffleKey.init_matrix(height), + OuterServerShuffleFunctionMediumEphemeralKey=OuterShuffleKey.init_matrix(height), + OuterPositionShuffleFunctionMediumEphemeralKey=OuterShuffleKey.init_matrix(height), + PositionShuffleMediumEphemeralKey=InnerShuffleKey.init_matrix(width, height), + OuterPositionShuffleMediumEphemeralKey=OuterShuffleKey.init_matrix(height) + ) + class ClientEphemeralKeys(BaseModel): OuterClientShuffleEphemeralKey: OuterShuffleKey OuterClientShuffleFunctionEphemeralKey: OuterShuffleKey ClientEphemeralKey: AlphabetKey ClientShuffleEphemeralKeyA: InnerShuffleKey + OuterClientShuffleMediumEphemeralKey: OuterShuffleKey OuterClientShuffleFunctionMediumEphemeralKey: OuterShuffleKey ClientShuffleMediumEphemeralKeyA: InnerShuffleKey ClientMediumEphemeralKey: AlphabetKey + + @classmethod + def random_init(cls, height: int, width: int): + return ClientEphemeralKeys( + OuterClientShuffleEphemeralKey=OuterShuffleKey.init_matrix(height), + OuterClientShuffleFunctionEphemeralKey=OuterShuffleKey.init_matrix(height), + ClientEphemeralKey=AlphabetKey.init_matrix(width, height, 255), + ClientShuffleEphemeralKeyA=InnerShuffleKey.init_matrix(width, height), + OuterClientShuffleMediumEphemeralKey=OuterShuffleKey.init_matrix(height), + OuterClientShuffleFunctionMediumEphemeralKey=OuterShuffleKey.init_matrix(height), + ClientShuffleMediumEphemeralKeyA=InnerShuffleKey.init_matrix(width, height), + ClientMediumEphemeralKey=AlphabetKey.init_matrix(width, height, 255) + )