decode base64 like string with different index table(s)
我的问题是,我已经编码了一些东西(与base64类似),并带有一个differnet索引表:
1 | 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/ |
而不是
1 | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ |
所以当我使用
有没有一种方法可以在转换过程中设置此表(可能作为参数)?
还是应该"转换"错误的base64字符串,我的意思是将0替换为A,将1替换为B,等等...而不是使用base64decode?如果是这样,什么是最佳且快速的解决方法?
update1:??我使用它,它可以工作,但是看起来有点慢,而且不专业。 :)
1 2 3 4 5 6 7 8 9 | 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) |
类似的事情应该起作用(警告:未经测试的代码;可能充满错误):
1 2 3 4 5 6 7 | import string my_base64chars ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/" std_base64chars ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" s = s.translate(string.maketrans(my_base64chars, std_base64chars)) data = base64.b64decode(s) |
不可能使标准的
您可以使用
1 2 3 4 5 | from string import maketrans base64fixTable = maketrans("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); def correctbase64(str): return str.translate(base64fixTable) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | print"Hello Reverse Engineering!\ " 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) |
这将处理错误
1 2 3 4 5 6 7 8 9 10 11 12 13 | from string import maketrans import base64 STANDARD_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' CUSTOM_ALPHABET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/' def correctbase64(input): DECODE_TRANS = maketrans(CUSTOM_ALPHABET, STANDARD_ALPHABET) newStr = input.translate(DECODE_TRANS) # Add '=' char at the end of the string newStr += '=' return base64.b64decode(newStr) print custom_base64decode('x/Tcw/g') # hello |
使用maketrans构建转换表,然后从第一个字母转换为第二个字母。然后base64解码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import string import base64 def decode(str): #make a translation table. table = string.maketrans( #your alphabet string.digits + string.uppercase + string.lowercase +"+/", #the original alphabet string.uppercase + string.lowercase + string.digits +"+/" ) #translate str.translate(s, table) #finally decode return base64.b64decode(str) |