Home > Enterprise >  Bruteforce python shuffle function
Bruteforce python shuffle function

Time:05-07

Hello I was wondering how to revert a string that was shuffled with the random.shuffle() function from python. I know that the original string was shuffled with this code:

import random

file_to_shuffle = list(open("file_tot_shuffle.txt", "rb").read().strip()) #rile containing a string
random.seed(random.randint(0, 256))
random.shuffle(file_to_shuffle)
print(bytes(file_to_shuffle).decode())

Thanks to anyone that can help

CodePudding user response:

Let me know if this is what you're looking for:

import random

file_contents = list("Something")

# Get seed for the code
seed = random.randint(0, 256)
random.seed(seed)
random.shuffle(file_contents)

# Re-Inject Same seed
indices = list(range(len(file_contents)))
random.seed(seed)
random.shuffle(indices)

# To Revert
collat = sorted(list(zip(indices, file_contents)), key=lambda x: x[0])

print("".join(list(zip(*collat))[1]))

P.S. This works due to the psuedo random algorithm, which is not true randomness

CodePudding user response:

The issue if the original seed is known or not. If we know it, you can reverse the shuffle by figuring how how that seed shuffles a list of that length.

import random

# file_to_shuffle = list(open("file_tot_shuffle.txt", "rb").read().strip()) #rile containing a string
file_to_shuffle = list(b"HI THIS IS SOME RANDOM TEXT".strip())

SEED = random.randint(0, 256)

random.seed(SEED)
random.shuffle(file_to_shuffle)
print(bytes(file_to_shuffle).decode())

order = list(range(len(file_to_shuffle)))
random.seed(SEED)
random.shuffle(order)

unshuffledList = [0]*len(order)
for i, orig_i in enumerate(order):
    unshuffledList[orig_i] = file_to_shuffle[i]

print(bytes(unshuffledList).decode())

Output:

MIR OION EH TST HSMEASITDX
HI THIS IS SOME RANDOM TEXT

If we don't know the seed, we at least know it's somewhere in the range of 0 to 256... so there may be a way to reverse it if something more is known about the original file.

  • Related