跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

  • 0

Python对于自定义字符表的Base64编码求解


HACK1949

问题

Python对于自定义字符表的Base64编码求解

5ff2562897fd9.png

说到自定义字符表(Alphabet Table)解码Base64,咱们先得知道Base64是怎样进行编码操作的。接下来咱们先来介绍一下Base64是怎样进行编码的。

首要咱们先来引进ASCII码表:1607223374_5fcc484e0c3f6ba47c72e.png!small?1607223374834

2、一个字节是8个比特,先找到对应的ASCII码,再将其转化为8位的二进制,转化如下:

H 对应码值为72,它对应的二进制是 01001000

e对应码值为101,它对应的二进制是:01100101

l对应码值为108,它对应的二进制是:01101100

l对应码值为108,它对应的二进制是:01101100

o对应码值为111,它对应的二进制是:01101111

Base64的码值是0-63,所以用6位的二进制就可以完全表示Base64的码值(如:000000对应十进制0,111111对应的十进制为63),将上面8位一组的二进制变成6位一组的二进制,因为上面是5*8=40个二进制,不能被6整除,所以要加一组0将其变成48个二进制数(假如还是不能整除,还要持续补8个0,其实就是最小公倍数的倍数)。

原来:01001000 01100101 01101100 01101100 01101111 00000000

现在:010010 000110 010101 101100 011011 000110 111100 000000

3、然后将6位一组的二进制计算出十进制,再跟Base64的编码表做比照,再将最后补位的0变成=,即可得到Base64字符

010010 对应二进制是:18,18对应Base64字符为:S

000110 对应二进制是:6, 6对应Base64字符为:G

010101 对应二进制是:21, 21对应Base64字符为:V

101100 对应二进制是:44, 44对应Base64字符为:s

011011 对应二进制是:27, 27对应Base64字符为:b

000110 对应二进制是:6,  6对应Base64字符为:G

111100 对应二进制是:18, 18对应Base64字符为:8

000000 补位的0变成=

所以Hello对应的Base64编码就是:SGVsbG8=

而咱们在上述过程中多少数字对应的多少的Base64字符,这个就是运用了Base64规范的Alphab Table,规范的Table如下:

1607223450_5fcc489a990c6d0e8406f.png!small?1607223451156

咱们在运用Python去解决自定义表的Base64编码的时候,咱们该怎样去做呢?

接下来进行到咱们的正题:

其实很简单,咱们将自带的Base64中他的原始Table运用str中的maketrans类进行替换即可,为什么呢?

咱们通过上述的编码过程可以进行分析,咱们在编码的过程中只是在最后运用到了表,但是实践上表所对应的咱们原始的数据信息是不变的,所以咱们先对编码过的内容字符进行替换即可得到正常的Base64编码,咱们在进行解码即可。

于是咱们得到了如下的代码:

import base64

import string
 
str1 = "NhFpbUihxvB="

string1 = "ZYXABCDEFGHIJKLMNOPQRSTUVWzyxabcdefghijklmnopqrstuvw0123456789+/"

string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))

上述代码是一个将表替换为:

“ZYXABCDEFGHIJKLMNOPQRSTUVWzyxabcdefghijklmnopqrstuvw0123456789+/”的代码。

咱们再来看看怎样进行编码

str2='BB,yyds!'.encode()

print(str(base64.b64encode(str2)).translate(str.maketrans(string2,string1)))

上述就是运用替换字符表的加密编码。

这次的代码很简单,但是要理解str字符串类中的translate方法是包含了maketrans这种子方法的。

链接帖子
意见的链接
分享到其他网站

这个问题有0个答案

推荐的帖子

此问题没有答案

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...