Base64 实现没有给出预期的结果
Base64 implementation is not giving the desired result
我已按照以下 site 说明执行 base64 编码。
这是我的代码:
from bitarray import bitarray
from bitarray.util import ba2int
base64mapping = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcd\
efghijklmnopqrstuvwxyz0123456789+/"
testString1 = "49276d206b696c6c696e6720796f757220627261696e206c\
696b65206120706f69736f6e6f7573206d757368726f6f6d"
stringBits = bitarray()
# We create an unitialized bitarray
stringBits.frombytes(testString1.encode('utf-8'))
# We convert the string to bits
b64stringList = [] # To store the corresponding b64 chars
for sequence in range(0, len(stringBits), 6):
# We scan the bitarray 6 bits at a time
b64stringList += base64mapping[(ba2int(stringBits[sequence:sequence+6]))]
# We store the corresponding b64 char into b64stringlist
print(''.join(b64stringList)) # Lets see the result
testString1 取自 cryptopals set 1 - challenge 1,它告诉我结果应该是:
SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t
然而,我的实现给出了另一个结果:
NDkyNzZkMjA2YjY5NmM2YzY5NmU2NzIwNzk2Zjc1NzIyMDYyNzI2MTY5NmUyMDZjNjk2YjY1MjA2MTIwNzA2ZjY5NzM2ZjZlNmY3NTczMjA2ZDc1NzM2ODcyNmY2ZjZk
我对照 Wikipedia 的 example 进行了检查,得到了相同的输出,但最后没有填充 (TODO)。
我在这里做错了什么或遗漏了什么?
根据站点,任务是将 hex
转换为 base64
。
您的编码似乎工作正常,因为库 base64
输出与您的结果相同 运行 它直接超过十六进制值
t = b'49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d'
base64.b64encode(t)
b'NDkyNzZkMjA2YjY5NmM2YzY5NmU2NzIwNzk2Zjc1NzIyMDYyNzI2MTY5NmUyMDZjNjk2YjY1MjA2MTIwNzA2ZjY5NzM2ZjZlNmY3NTczMjA2ZDc1NzM2ODcyNmY2ZjZk'
使用 binascii
我们可以使用 unhexlify()
将您原本拥有的 hex
值转换为可读文本
binascii.unhexlify(t)
#b"I'm killing your brain like a poisonous mushroom"
鉴于此信息,最好采取以下方法:您存储的不是 string
,而是 string
本身的 hex
表示。
因此,我们需要在编码之前将您的 hex
转换为可读字符串。
当我们将结果字符串传递给 base64
时,您的输出与 link.
中的预期输出匹配
base64.b64encode(binascii.unhexlify(t))
#b'SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t'
我已按照以下 site 说明执行 base64 编码。
这是我的代码:
from bitarray import bitarray
from bitarray.util import ba2int
base64mapping = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcd\
efghijklmnopqrstuvwxyz0123456789+/"
testString1 = "49276d206b696c6c696e6720796f757220627261696e206c\
696b65206120706f69736f6e6f7573206d757368726f6f6d"
stringBits = bitarray()
# We create an unitialized bitarray
stringBits.frombytes(testString1.encode('utf-8'))
# We convert the string to bits
b64stringList = [] # To store the corresponding b64 chars
for sequence in range(0, len(stringBits), 6):
# We scan the bitarray 6 bits at a time
b64stringList += base64mapping[(ba2int(stringBits[sequence:sequence+6]))]
# We store the corresponding b64 char into b64stringlist
print(''.join(b64stringList)) # Lets see the result
testString1 取自 cryptopals set 1 - challenge 1,它告诉我结果应该是:
SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t
然而,我的实现给出了另一个结果:
NDkyNzZkMjA2YjY5NmM2YzY5NmU2NzIwNzk2Zjc1NzIyMDYyNzI2MTY5NmUyMDZjNjk2YjY1MjA2MTIwNzA2ZjY5NzM2ZjZlNmY3NTczMjA2ZDc1NzM2ODcyNmY2ZjZk
我对照 Wikipedia 的 example 进行了检查,得到了相同的输出,但最后没有填充 (TODO)。
我在这里做错了什么或遗漏了什么?
根据站点,任务是将 hex
转换为 base64
。
您的编码似乎工作正常,因为库 base64
输出与您的结果相同 运行 它直接超过十六进制值
t = b'49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d'
base64.b64encode(t)
b'NDkyNzZkMjA2YjY5NmM2YzY5NmU2NzIwNzk2Zjc1NzIyMDYyNzI2MTY5NmUyMDZjNjk2YjY1MjA2MTIwNzA2ZjY5NzM2ZjZlNmY3NTczMjA2ZDc1NzM2ODcyNmY2ZjZk'
使用 binascii
我们可以使用 unhexlify()
hex
值转换为可读文本
binascii.unhexlify(t)
#b"I'm killing your brain like a poisonous mushroom"
鉴于此信息,最好采取以下方法:您存储的不是 string
,而是 string
本身的 hex
表示。
因此,我们需要在编码之前将您的 hex
转换为可读字符串。
当我们将结果字符串传递给 base64
时,您的输出与 link.
base64.b64encode(binascii.unhexlify(t))
#b'SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t'