декодировать base64 как строку с различными индексными таблицами - PullRequest
7 голосов
/ 04 апреля 2011

Моя проблема в том, что у меня есть что-то закодированное (как base64) с таблицей индексов difnet:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/

вместо

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

поэтому, когда я использую base64.b64decode(), это дает мне неверный результат. Есть ли способ установить эту таблицу во время преобразования (возможно, в качестве параметра)?

Или я должен "преобразовать" неправильную строку base64, я имею в виду заменить 0 на A, 1 на B и т. Д ... и чем использовать base64decode? Если да, то как лучше и быстрее обойти это?

update1 : Я использую это, которое работает, но выглядит немного медленно и непрофессионально. :)

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 ]

8 голосов
/ 04 апреля 2011

Примерно так должно работать (ВНИМАНИЕ: непроверенный код; возможно, в нем много ошибок):

import string

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

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

Невозможно выполнить стандартные функции base64 (или функции более низкого уровня)в binascii, который они вызывают) использовать пользовательскую таблицу.

3 голосов
/ 04 апреля 2011

Вы можете использовать translate() и maketrans():

from string import maketrans

base64fixTable = maketrans("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
def correctbase64(str):
    return str.translate(base64fixTable)
0 голосов
/ 13 декабря 2018
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)
0 голосов
/ 26 апреля 2017

это обработает ошибку 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
0 голосов
/ 04 апреля 2011

Используйте maketrans, чтобы построить таблицу перевода, а затем перевести с первого алфавита на второй. Затем 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...