descodificar base64 como cadena con diferente tabla (s) de índice

Mi problema es que tengo algo codificado (como en base64) con una tabla de índice differnet:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/ 

en lugar de

 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 

así que cuando uso base64.b64decode() me da un resultado incorrecto. ¿Hay alguna manera de establecer esta tabla durante la conversión (como parámetro quizás)?

¿O debería “convertir” la cadena base64 incorrecta? Quiero decir, reemplazar 0 por A, 1 por B, etc … y luego usar el código base64? Si es así, ¿cuál es la mejor y más rápida solución para esto?

update1 : uso esto, que funciona, pero parece un poco lento y poco profesional. 🙂

 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) 

Algo como esto debería funcionar (ADVERTENCIA: código no probado; puede estar lleno de errores):

 import string my_base64chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/" std_base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" s = s.translate(string.maketrans(my_base64chars, std_base64chars)) data = base64.b64decode(s) 

No es posible hacer que las funciones estándar de base64 (o las de nivel inferior en binascii que llaman) utilicen una tabla personalizada.

Puedes usar translate() y maketrans() :

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

Use maketrans para construir una tabla de traducción y luego traduzca del primer alfabeto al segundo. Luego decodifica base64.

 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) 

esto manejará error TypeError: Incorrect padding

 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 
 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)