作为Python的初学者,我认为创建一个超出我技能的项目方式来了解语言会很好。不幸的是,项目中最困难的部分涉及移动位,这是另一个挑战,因为我发现很难绕过比特。我知道每个操作员都做了什么,我发现很难让它做任何我想做的事。
显然我失败了,因此这个问题。
我正在尝试通过使用预定义的索引列表更改位顺序来加密字符串。我以为自己做得很好,但是没有用,我也不知道为什么。
即使我的代码应该完成这项工作,我也很不确定它是否仍可以使用不同类型的数据(没有错误)。非常欢迎额外的反馈!
test.py
import bitshuffle, random
# New bit order
# TODO present this as an int, rather a string
code = "01234567"
code = "".join(random.sample(code, len(code)))
# The data obviously
data = b'Jalape\xc3\xb1o\x00\xff'
encrypted = bitshuffle.encrypt(code, data)
decrypted = bitshuffle.decrypt(code, encrypted)
print data # Jalapeño�
print encrypted # �d�d,tGi��
print decrypted # Jalapeño�
bitshuffle.py
import struct
def encrypt(code, data):
"""
encrypt(string, string) --> string
Shuffles bits according to code
"""
format = str(len(data)) + 'c'
chars = struct.unpack(format, data)
args = [format]
for c in chars:
dec = ord(c)
ndec = 0
for i in xrange(8):
bit = dec >> i & 1
ndec = ndec | bit << int(code[i])
args.append(chr(ndec))
return struct.pack(*args)
def decrypt(code, data):
"""
decrypt(string, string) --> string
Shuffles bits according to code
"""
format = str(len(data)) + 'c'
chars = struct.unpack(format, data)
args = [format]
for c in chars:
dec = ord(c)
ndec = 0
for i in xrange(8):
bit = dec >> i & 1
ndec = ndec | bit << code.find(str(i))
args.append(chr(ndec))
return struct.pack(*args)
当我在摆弄时,我设法做到了。问题在于解码。对不起,如果我的问题不清楚。我把这些位错误地转移了。
我仍然想知道当前的代码是否可以接受不同类型的数据。
答案 0 :(得分:1)
你没有具体指明你传递的内容code
,以及为什么你需要在其上调用int()
- 我猜你在0到7之间传递数字,对吗?
那么,其中一个问题就是你总是在同一个方向上进行位移,所以你的“解密”程序不会撤消你的“加密”例程正在做什么。
将0b10000000
向左移动一位并不会使其变为0b00000001
,而是导致0b100000000
。
答案 1 :(得分:1)
7 - code[i]
不起作用。你应该反转code
。
例如,如果代码为[1, 3, 5, 7, 0, 2, 4, 6]
,则反向应为[4, 0, 5, 1, 6, 2, 7, 3]
。 (4
反过来表示原始代码中的0
索引。)
code[4] == 0
code[0] == 1
code[5] == 2
>>> import struct
>>>
>>> def encrypt(code, data):
... return algorithm(code, data)
...
>>> def decrypt(code, data):
... code = {x:i for i, x in enumerate(code)} # <----
... return algorithm(code, data)
...
>>> def algorithm(code, data):
... chars = struct.unpack('c' * len(data), data)
... args = ['c' * len(data)]
... for c in chars:
... dec = ord(c)
... ndec = 0
... for i in xrange(8):
... bit = dec >> i & 1
... ndec = ndec | bit << code[i]
... args.append(chr(ndec))
... return struct.pack(*args)
...
>>> code = [1, 3, 5, 7, 0, 2, 4, 6]
>>> encrypt(code, 'abc')
'\x16\x1c\x1e'
>>> decrypt(code, _)
'abc'