gpt4 book ai didi

python - Python 中的混洗位

转载 作者:行者123 更新时间:2023-12-01 05:27:43 25 4
gpt4 key购买 nike

作为 Python 的初学者,我认为创建一个超出我技能范围的项目来了解这门语言是件好事。不幸的是,该项目最困难的部分涉及移动位,这是另一个挑战,因为我发现很难将我的头脑集中在位上。我知道每个运算符(operator)做什么,我只是发现很难让它做我想做的事。

显然我失败了,因此出现了这个问题。

我正在尝试通过使用预定义的索引列表更改位顺序来加密字符串。我以为我做得很好,但没有成功,我不知道为什么。

即使我的代码应该完成这项工作,我也非常不确定它是否仍然可以处理不同类型的数据(没有错误)。非常欢迎其他反馈!

<小时/>

测试.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)
<小时/>

更新 (10:32)

正当我胡思乱想的时候,我终于做到了。问题出在解码上。抱歉,如果我之前的问题不清楚。我有点把位移错了。

我仍然想知道当前的代码是否可以接受不同类型的数据。

最佳答案

7 - code[i] 不起作用。您应该反转代码

例如,如果代码为[1, 3, 5, 7, 0, 2, 4, 6],则反转应为[4, 0, 5, 1, 6,2,7,3]。 (4反过来表示原代码中0的索引。)

  • 代码[4] == 0
  • 代码[0] == 1
  • 代码[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'

关于python - Python 中的混洗位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21015356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com