【问题标题】:decode base64 like string with different index table(s)使用不同的索引表解码 base64 类字符串
【发布时间】:2011-04-04 11:22:08
【问题描述】:

我的问题是,我使用不同的索引表进行了编码(类似 base64):

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)

【问题讨论】:

    标签: python django


    【解决方案1】:

    这样的事情应该可以工作(警告:未经测试的代码;可能充满错误):

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

    不可能使标准的base64 函数(或他们调用的binascii 中的低级函数)使用自定义表。

    【讨论】:

      【解决方案2】:

      您可以使用translate()maketrans()

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

      【讨论】:

        【解决方案3】:
        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)
        

        【讨论】:

        • 您好,欢迎您,请在回答问题时对您的代码进行一些解释。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          这将处理错误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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-18
            • 1970-01-01
            相关资源
            最近更新 更多