Skip to content

Instantly share code, notes, and snippets.

@edelooff
Last active November 10, 2021 00:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save edelooff/133547839a5cf0a2322c4a147a74fd34 to your computer and use it in GitHub Desktop.
Save edelooff/133547839a5cf0a2322c4a147a74fd34 to your computer and use it in GitHub Desktop.
Simple Python Feistel encoder/decoder
"""A simple 8-round Feistel network to encode/decode 8-bit integers.
See https://en.wikipedia.org/wiki/Feistel_cipher for construction details.
"""
from random import randint
ROUNDS = 8
KEYS = [(randint(11, 19), randint(1, 200)) for _ in range(ROUNDS)]
def encode(number):
"""Feistel encryption operation to map 8-bit inputs to 8-bit outputs."""
left, right = number >> 4, number & 0x0f
for keynum in range(ROUNDS):
left, right = right, left ^ feistel(right, keynum)
return left << 4 | right
def decode(number):
"""Inverse (decryption) Feistel operation."""
left, right = number >> 4, number & 0x0f
for keynum in reversed(range(ROUNDS)):
left, right = right ^ feistel(left, keynum), left
return left << 4 | right
def feistel(number, keynum):
"""Feistel non-invertible transformation function,"""
offset, multiplier = KEYS[keynum]
return (number + offset) * multiplier & 0x0f
if __name__ == '__main__':
assert [decode(encode(n)) for n in range(256)] == range(256)
@ahmedyasserays
Copy link

if __name__ == '__main__':
    for i in range(256):
            assert decode(encode(i)) == i

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment