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'