基于Python的Base64编码实现未得到预期结果的技术求助
Base64实现中的核心错误定位
输入对象理解偏差
- Cryptopals挑战给出的长串字符
"49276d206b69..."是十六进制格式承载的原始待编码字节,不是需要Base64编码的文本本身。 - 当前代码直接对这串十六进制文本做UTF-8编码,相当于把每个ASCII字符('4'、'9'、'2'、'7'...)对应的8位编码值拼成比特流再做切分映射。这种逻辑下的输出
NDkyNzZkMjA2...本质就是这段十六进制文本本身的合法Base64编码,和题目要求的目标结果自然完全对不上。 - 正确的输入处理步骤是:先把十六进制字符串用
bytes.fromhex(testString1)解码为原始字节流,再对这个原始字节流做比特序列转换,而不是直接对原始字符串做encode('utf-8')。
位切分逻辑的细节疏漏
- 就算修正了输入解析的问题,当前代码的切片逻辑也存在可预见的错误:当遍历到比特序列末尾、剩余位长度不足6位时,直接切片会得到长度小于6的比特片段,
ba2int计算出的数值会因为位长度不够完全偏离预期值。 - Base64的标准要求是:对末尾不足6位的片段,需要在片段右侧补0凑满6位长度后再做映射,不能直接截断。
- 另外需要在补位完成后,根据最终拼接的Base64字符数量计算补等号的数量:如果总长度对4取余为2,末尾补2个
=;取余为3则末尾补1个=,保证最终长度是4的整数倍。
错误对照验证
当前得到的输出开头为NDky...,其实就是对字符串"49276d..."本身做Base64编码的标准结果,这也完全印证了输入解析错误的判断——如果把输入换成正确解码后的原始字节,输出开头就会和题目给出的预期SSdt...对齐。
内容的提问来源于stack exchange,提问作者user15245452
相关产品推荐
相关产品推荐

