79 lines
1.8 KiB
Python
79 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import sys, random
|
|
|
|
def bitflip(byte, bit):
|
|
bits = [
|
|
0b00000001,
|
|
0b00000010,
|
|
0b00000100,
|
|
0b00001000,
|
|
0b00010000,
|
|
0b00100000,
|
|
0b01000000,
|
|
0b10000000
|
|
]
|
|
negbits = [
|
|
0b11111110,
|
|
0b11111101,
|
|
0b11111011,
|
|
0b11110111,
|
|
0b11101111,
|
|
0b11011111,
|
|
0b10111111,
|
|
0b01111111
|
|
]
|
|
if byte | bits[bit] == byte:
|
|
return byte & bits[bit]
|
|
return byte | bits[bit]
|
|
|
|
def n_bits_off(byte, n):
|
|
if n>8:
|
|
raise Error
|
|
|
|
bits = []
|
|
|
|
while len(bits) < n:
|
|
bit = random.randint(0,7)
|
|
if bit in bits:
|
|
continue
|
|
bits.append(bit)
|
|
|
|
for bit in bits:
|
|
byte = bitflip(byte, bit)
|
|
|
|
return byte
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if not len(sys.argv) == 2:
|
|
print("This program takes exactly one argument: the string to scramble.")
|
|
|
|
output = []
|
|
for character in list(sys.argv[1]):
|
|
a = random.randint(0, 36)
|
|
if ord(character)<33 or ord(character) > 126:
|
|
output.append(character)
|
|
elif a%18==0:
|
|
byte = n_bits_off(ord(character), 3)
|
|
if byte > 32 and byte < 127:
|
|
output.append(chr(byte))
|
|
else:
|
|
output.append(character)
|
|
elif a%12==0:
|
|
byte = n_bits_off(ord(character), 2)
|
|
if byte > 32 and byte < 127:
|
|
output.append(chr(byte))
|
|
else:
|
|
output.append(character)
|
|
elif a%9==0:
|
|
byte = n_bits_off(ord(character), 1)
|
|
if byte > 32 and byte < 127:
|
|
output.append(chr(byte))
|
|
else:
|
|
output.append(character)
|
|
else:
|
|
output.append(character)
|
|
|
|
print("".join(output))
|