使用不同索引表解码类似Base64的字符串

8 投票
5 回答
15222 浏览
提问于 2025-04-16 15:02

我的问题是,我有一些用不同的索引表编码的东西(像是base64编码):

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/

而不是

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

所以当我使用 base64.b64decode() 时,它给我的结果是错误的。有没有办法在转换时设置这个表(可能作为一个参数)?

或者我应该“转换”这个错误的base64字符串,也就是说把0换成A,把1换成B,等等,然后再使用base64解码?如果是这样,最好的快速解决办法是什么?

更新1:我用这个方法,它有效,但看起来有点慢,而且不太专业。:)

def correctbase64(str):
  dicta = [ ['0','A'], ['1','B'], ['2','C'], ['3','D'], ['4','E'], ['5','F'], ['6','G'], ['7','H'], ['8','I'], ['9','J'], ['A','K'], ['B','L'], ['C','M'], ['D','N'], ['E','O'], ['F','P'], ['G','Q'], ['H','R'], ['I','S'], ['J','T'], ['K','U'], ['L','V'], ['M','W'], ['N','X'], ['O','Y'], ['P','Z'], ['Q','a'], ['R','b'], ['S','c'], ['T','d'], ['U','e'], ['V','f'], ['W','g'], ['X','h'], ['Y','i'], ['Z','j'], ['a','k'], ['b','l'], ['c','m'], ['d','n'], ['e','o'], ['f','p'], ['g','q'], ['h','r'], ['i','s'], ['j','t'], ['k','u'], ['l','v'], ['m','w'], ['n','x'], ['o','y'], ['p','z'], ['q','0'], ['r','1'], ['s','2'], ['t','3'], ['u','4'], ['v','5'], ['w','6'], ['x','7'], ['y','8'], ['z','9'] ]
  l = list(str)
  for i in range(len(l)):
    for c in dicta:
      if l[i] == c[0]:
        l[i] = c[1]
        break
  return "".join(l)

5 个回答

1

在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如说,有人可能会在网上发帖求助,描述他们遇到的情况和错误信息。这种情况下,其他人就会根据他们的描述,给出一些建议或者解决方案。

在这个过程中,大家会讨论不同的想法,分享各自的经验,帮助提问的人找到问题的根源。这样一来,提问的人不仅能解决自己的问题,还能学到一些新的知识。

总之,编程社区就像一个大家庭,大家互相帮助,共同进步。

print "Hello Reverse Engineering!\n"

import string
import base64


my_base64chars  = "WXYZlabcd3fghijko12e456789ABCDEFGHIJKL+/MNOPQRSTUVmn0pqrstuvwxyz"
std_base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

s = 'whatever encoded message you have that used my_base64chars index'

c = s.translate(string.maketrans(my_base64chars, std_base64chars))
data = base64.b64decode(c)
print (data)
3

你可以使用 translate()maketrans() 这两个方法:

from string import maketrans

base64fixTable = maketrans("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
def correctbase64(str):
    return str.translate(base64fixTable)
10

像这样的代码应该可以用(警告:这段代码没有经过测试,可能有很多错误):

import string

my_base64chars  = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"
std_base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

s = s.translate(string.maketrans(my_base64chars, std_base64chars))
data = base64.b64decode(s)

不过,标准的 base64 函数(或者它们调用的更底层的 binascii 函数)是无法使用自定义的编码表的。

撰写回答