From 123b8a30ad5cf4357f2980fc232b101f2d936dde Mon Sep 17 00:00:00 2001 From: "Maciej A. Czyzewski" Date: Sat, 14 Oct 2017 15:46:59 +0200 Subject: [PATCH] added simple chaos machine impl. to hashes/ --- hashes/chaos_machine.py | 96 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 hashes/chaos_machine.py diff --git a/hashes/chaos_machine.py b/hashes/chaos_machine.py new file mode 100644 index 000000000..b9d8dd750 --- /dev/null +++ b/hashes/chaos_machine.py @@ -0,0 +1,96 @@ +"""example of simple chaos machine""" + +# Chaos Machine (K, t, m) +K = [0.33, 0.44, 0.55, 0.44, 0.33]; t = 3; m = 5 + +# Buffer Space (with Parameters Space) +buffer_space, params_space = [], [] + +# Machine Time +machine_time = 0 + +def push(seed): + global buffer_space, params_space, machine_time, \ + K, m, t + + # Choosing Dynamical Systems (All) + for key, value in enumerate(buffer_space): + # Evolution Parameter + e = float(seed / value) + + # Control Theory: Orbit Change + value = (buffer_space[(key + 1) % m] + e) % 1 + + # Control Theory: Trajectory Change + r = (params_space[key] + e) % 1 + 3 + + # Modification (Transition Function) - Jumps + buffer_space[key] = \ + round(float(r * value * (1 - value)), 10) + params_space[key] = \ + r # Saving to Parameters Space + + # Logistic Map + assert(max(buffer_space) < 1) + assert(max(params_space) < 4) + + # Machine Time + machine_time += 1 + +def pull(): + global buffer_space, params_space, machine_time, \ + K, m, t + + # PRNG (Xorshift by George Marsaglia) + def xorshift(X, Y): + X ^= Y >> 13 + Y ^= X << 17 + X ^= Y >> 5 + return X + + # Choosing Dynamical Systems (Increment) + key = machine_time % m + + # Evolution (Time Length) + for i in range(0, t): + # Variables (Position + Parameters) + r = params_space[key] + value = buffer_space[key] + + # Modification (Transition Function) - Flow + buffer_space[key] = \ + round(float(r * value * (1 - value)), 10) + params_space[key] = \ + (machine_time * 0.01 + r * 1.01) % 1 + 3 + + # Choosing Chaotic Data + X = int(buffer_space[(key + 2) % m] * (10 ** 10)) + Y = int(buffer_space[(key - 2) % m] * (10 ** 10)) + + # Machine Time + machine_time += 1 + + return xorshift(X, Y) % 0xFFFFFFFF + +def reset(): + global buffer_space, params_space, machine_time, \ + K, m, t + + buffer_space = K; params_space = [0] * m + machine_time = 0 + +####################################### + +# Initialization +reset() + +# Pushing Data (Input) +import random +message = random.sample(range(0xFFFFFFFF), 100) +for chunk in message: + push(chunk) + +# Pulling Data (Output) +while True: + print("%s" % format(pull(), '#04x')) + print(buffer_space); print(params_space)