如何将 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 个备选项中。
我有一个用这个加密的二进制字符串:(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 个备选项中。