0

我有一个用这个加密的二进制字符串:( S 是二进制字符串)

res = ''.join(format(ord(i), 'b') for i in s)

我如何解密它?

我尝试了以下但字符串为空?

    for i in s:
      res += chr(int(str(i),2))
   print(res)
4

3 回答 3

1

在编码为二进制时使用格式中的“07b”或“08b”,因为它将保留前导零并以 7 或 8 位表示数字,这将使其易于解码。现在我们将一次考虑 8 位,因为现在每个字符都用 8 位表示。如果您碰巧在格式中使用“07b”,请在任何地方使用 7。Ascii 字符需要 7 位来表示。

>>> s = "abcde"
>>> res = ''.join(format(ord(i), '08b') for i in s)
>>> ans = []
>>> for i in range(0, len(res), 8):
...      ans.append(chr(int(res[i:i+8],2)))
... 
>>> ''.join(ans)
'abcde'

一个班轮:

>>> ''.join([ chr(int(res[i:i+8],2)) for i in range(0,len(res),8)])
'abcde'

参考:

转换为二进制并在 Python 中保留前导零

ASCII 码是 7 位还是 8 位?

于 2020-09-21T10:06:31.077 回答
1

你的方法行不通。您所做的只是将加密字符串的 1 和 0 转换为\x01\x00字节,它们都不能打印。

无论如何,这并不是真正的加密。这只是一个有缺陷的二进制编码,不同的输入可以给你相同的输出:

encode('0p')            == '1100001110000'
encode('a0')            == '1100001110000'
encode('\x01!\x18\x00') == '1100001110000'

encode('password')      == '11100001100001111001111100111110111110111111100101100100'
encode('p0<|>>?%$')     == '11100001100001111001111100111110111110111111100101100100'

作为解码此函数输出的一种策略,您需要对原始输入做出一些假设。

首先,假设消息仅包含 32 到 126 范围内的可打印 ASCII 值可能是合理的。在这种情况下,每个输入字符将在输出中编码为六或七个二进制数字的块,并且每个块都将从开始1(因为format(ord(i), 'b')不会以0除非开始i==0)。

例如,假设您要解码以下字符串:

11010001100101110110011011001101111

第一个块必须是 7 位,否则下一个块将以 开头0,这是不可能的。

1101000 1100101110110011011001101111

对于下一个块,看起来我们可以消耗 6 位并留下一个以 开头的字符串1

1101000 110010 1110110011011001101111

但如果我们这样做,就不可能再提取 6 或 7 位并留下以 开头的字符串1

                      ### invalid ###
1101000 110010 111011 0011011001101111

                       ### invalid ###
1101000 110010 1110110 011011001101111

这表明早先的假设是不正确的。使用回溯算法,您可以识别编码数据的所有有效分区。

由于长编码字符串可能具有大量有效分区,因此您可能还需要根据启发式方法对每个可能的输入字符串进行排名,例如字母字符数减去非字母字符数。在上面的示例中,password得分为 8 分,但p0<|>>?%$得分为 -7。正确的输入字符串可能是得分最高的选项之一。

于 2020-09-22T10:48:25.957 回答
0

它没有按预期工作

s =(" Hello")
#Encrypted
res = ''.join(format(ord(i), 'b') for i in s)
print("Encrypted:" + res)

#Decrypt
res = ''.join([chr(int(res[i:i+7],2)) for i in range(0,len(res),7)])
print("Decrypted: " + res)

结果:

加密:10000010010001100101110110011011001101111

解密:AKYY/

于 2020-09-21T14:51:11.673 回答