decodifica base64 come stringa con diverso indice tabella(s)

Il mio problema è che ho qualcosa di codificato (base64) con un diverse tabella indice:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/

invece di

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

quindi, quando si utilizza base64.b64decode() è per me un risultato sbagliato.
C’è un modo per impostare questa tabella durring di conversione (come parametro forse)?

O devo “convertire” il male stringa in base64, intendo sostituire 0 con a, 1 B, ecc… e di utilizzare base64decode? se sì, qual è il migliore e veloce soluzione per questo?

aggiornare 1: io uso questo, che funziona, ma sembra un po ‘ lento e poco professionale. 🙂

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)
InformationsquelleAutor balazs | 2011-04-04



5 Replies
  1. 8

    Qualcosa come questo dovrebbe funzionare (AVVERTENZA: il codice non testato; può essere piena di errori):

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

    Non è possibile effettuare lo standard base64 funzioni (o di livello più basso di quelli in binascii che essi chiamano) l’uso di una tabella personalizzata.

  2. 3

    È possibile utilizzare translate() e maketrans():

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

    Utilizzare maketrans per costruire una tabella di traduzione e poi tradurre dal primo alfabeto per la seconda. Quindi 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)
  4. 0

    questo errore di handle 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
  5. 0
    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)
    • Ciao, benvenuto, si prega di fornire qualche spiegazione del codice anche quando risponde alle domande.

Lascia un commento