在Python中洗牌

时间:2014-01-09 08:45:00

标签: python python-2.7 encryption

作为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)

更新(10:32)

当我在摆弄时,我设法做到了。问题在于解码。对不起,如果我的问题不清楚。我把这些位错误地转移了。

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

2 个答案:

答案 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'