如何将 Python 二进制转换为 ASCII

How to convert Python binary to ASCII

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

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

如何解密?

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

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

在编码为二进制时使用“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'

参考:

Convert to binary and keep leading zeros in Python

Is ASCII code 7-bit or 8-bit?

它没有按预期工作

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/

你的方法行不通。您所做的只是将加密字符串的 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

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

1101000 1100101110110011011001101111

对于下一个块,看起来我们可以消耗 6 位并留下一个以 1:

开头的字符串
1101000 110010 1110110011011001101111

但是如果我们这样做,那么就不可能再提取 6 或 7 位并留下以 1:

开头的字符串
                      ### invalid ###
1101000 110010 111011 0011011001101111

                       ### invalid ###
1101000 110010 1110110 011011001101111

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

由于长编码字符串可能有大量有效分区,您可能还需要根据启发式算法对每个可能的输入字符串进行排名,例如字母字符数减去 non-alphabet 字符数。在上面的示例中,password 会得到 8 分,但 p0<|>>?%$ 会得到 −7 分。正确的输入字符串可能在 highest-scoring 个备选项中。