base家族学习

base16

什么是Base16
Base16编码就是将ASCII字符集中可打印的字符(数字0~9和字母A~F)()(2的4次方个)对应的二进制字节数据进行编码

Base16转换表为:
在这里插入图片描述
Base16原理
编码的方式:

1.将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数,不足8比特位高位补0.然后将所有的二进制全部串起来,4个二进制位为一组,转化成对应十进制数.

2.根据十进制数值找到Base16编码表里面对应的字符.Base16是4个比特位表示一个字符,所以原始是1个字节(8个比特位)刚好可以分成两组,也就是说原先如果使用ASCII编码后的一个字符,现在转化成两个字符.数据量是原先的2倍.

Base16案例
假如对字符串love进行Base16加密:

字符串对应AscII表的二进制为:

01101100 01101111 01110110 01100101

按照Base16编码,没四个字符为一组,可分为:

0110 1100 0110 1111 0111 0110 0110 0101

对应Base16表的字符串为:

6C6F7665

解密:

import base64
s = 'key' # 要加密的字符串
a = base64.b16encode(s) # 加密

print a

print base64.b16decode(a) # 解密

base32

Base32编码使用32个ASCII字符(字母A-Z和数字2-7)对任何数据进行编码,Base32与Base64的实现原理类似,同样是将原数据二进制形式取指定位数转换为ASCII码。首先获取数据的二进制形式,将其串联起来,每5个比特为一组进行切分,每一组内的5个比特可转换到指定的32个ASCII字符中的一个,将转换后的ASCII字符连接起来,就是编码后的数据。

Base32通用的字典定义如下:
在这里插入图片描述
Base32还提供了另外一种字典定义,即Base32十六进制字母表。Base32十六进制字母表是参照十六进制的计数规则定义:
在这里插入图片描述
由于数据的二进制传输是按照8比特一组进行(即一个字节),因此Base32按5比特切分的二进制数据必须是40比特的倍数(5和8的最小公倍数)。例如输入单字节字符“%”,它对应的二进制值是“100101”,前面补两个0变成“00100101”(二进制值不足8比特的都要在高位加0直到8比特),从左侧开始按照5比特切分成两组:“00100”和“101”,后一组不足5比特,则在末尾填充0直到5比特,变成“00100”和“10100”,这两组二进制数分别转换成十进制数,通过上述表格即可找到其对应的可打印字符“E”和“U”,但是这里只用到两组共10比特,还差30比特达到40比特,按照5比特一组还需6组,则在末尾填充6个“=”。填充“=”符号的作用是方便一些程序的标准化运行,大多数情况下不添加也无关紧要,而且,在URL中使用时必须去掉“=”符号。

解密:

import base64
s = 'key' # 要加密的字符串
a = base64.b32encode(s) # 加密

print a

print base64.b32decode(a) # 解密

base36

Base36是一个二进制到文本编码表示方案的二进制数据以ASCII通过将其转化为一个字符串格式基数 -36表示。选择36十分方便,因为可以使用阿拉伯数字 0–9和拉丁字母 A–Z [1](ISO基本拉丁字母)表示数字。
每个base36位需要少于6位的信息来表示。

base58

Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。
相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+“和”/"符号。

设计Base58主要的目的是:
1.避免混淆。在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。
2.不使用"

base62

Base62编码将数字转换为ASCII字符串(0-9,az和AZ),反之亦然,这通常会导致字符串较短。
26个小写字母+26个大写字母+10个数字=62

1)62进制与10进制的互相转化

62进制转10进制与2进制转10进制相似。
        2进制转10进制过程为: 从右到左用二进制的每个数去乘以2的相应次方,次方要从0开始。
        62进制转10进制也类似,从右往左每个数*62的N次方,N从0开始。

那么,10进制转62进制也与10进制转2进制类似。 即:不断除以62取余数,然后倒序。
(2)关于短Url的转换

主要思路,维护一个全局自增的id,每来一个长url,将其与一个自增id绑定,然后利用base62将该自增id转换为base62字符串,即完成转换。
在这里插入图片描述

base64

介绍
Base64可以将ASCII字符串或者是二进制编码成只包含A—Z,a—z,0—9,+,/ 这64个字符( 26个大写字母,26个小写字母,10个数字,1个+,一个 / 刚好64个字符)。这64个字符用6个bit位就可以全部表示出来,一个字节有8个bit 位,那么还剩下两个bit位,这两个bit位用0来补充。其实,一个Base64字符仍然是8个bit位,但是有效部分只有右边的6个 bit,左边两个永远是0。Base64的编码规则是将3个8位字节(3×8=24位)编码成4个6位的字节(4×6=24位),之后在每个6位字节前面,补充两个0,形成4个8位字节的形式,那么取值范围就变成了0~63。又因为2的6次方等于64,所以每6个位组成一个单元。一般在CTF逆向题目中base64的加密过程主要是用自定义的索引表,所以如果能一眼能看出是base64加密就会节约很多时间。

加密过程
base64的编码都是按字符串长度,以每3个8bit的字符为一组,
然后针对每组,首先获取每个字符的ASCII编码,
然后将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节
然后再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节
然后将这4个8bit的字节转换成10进制,对照Base64编码表 ,得到对应编码后的字符
在这里插入图片描述
如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:

(1)先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。
    (2)在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。

也就是说:
    当最后剩余两个八位(待补足)字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;
    如果最后剩余一个八位(待补足)字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。
在这里插入图片描述

base85

base85 也称为Ascii85,是Paul E. Rutter为btoa实用程序开发的一种二进制文本编码形式。通过使用五个ASCII字符来表示四个字节的二进制数据(使编码量1 / 4比原来大,假设每ASCII字符8个比特),它比更有效UUENCODE或Base64的,它使用四个字符来表示三个字节的数据(1 / 3的增加,假设每ASCII字符8个比特)。
用途是Adobe的PostScript和Portable Document Format文件格式,以及Git使用的二进制文件的补丁编码。
与Base64一样,Base85编码的目标是对二进制数据可打印的ASCII字符进行编码。但是它使用了更大的字符集,因此效率更高一些。具体来说,它可以用5个字符编码4个字节(32位)。

例子:
在这里插入图片描述

base91

顾名思义,base91需要91个字符来表示ASCII编码的二进制数据。 从94个可打印ASCII字符(0x21-0x7E)中,以下三个字符被省略以构建base91字母:

-(破折号,0x2D)
    \(反斜杠,0x5C)
    '(撇号,0x27)
base91是将二进制数据编码为ASCII字符的高级方法。
它类似于UUencode或base64,但效率更高。 base91产生的开销取决于输入数据。 它的数量最多为23%(而base64为33%),范围可以降低到14%,通常发生在0字节块上。
这使得base91对于通过二进制不安全连接(例如电子邮件或终端线)传输较大的文件非常有用。
在这里插入图片描述

base92

“ 如果您对将二进制信息从一个地方转移到另一地方一无所知,那么就知道将数据从一个地方转移到另一地方 可能很危险。就是说,这对您的数据有害:也许您需要在仅用于ASCII文本的通道上传输Blob ,并且所有’\n’以C样式字符串表示的字节都会突然有一个同级符号’\r’。或者,您的传输层实际上真的真的是以null终止的字符串,并且您恰好在字节边界上连续有8个连续的0位,即使它位于blob中一个32位整数的中间,并且你结束了只有一半您的数据。

解决此问题的一种方法是使用base64,它使用所有数字和大写/小写字母字符对数据进行编码(再加上两个,但现在我们将忽略它们)。现在,您在传输层上尝试解释您的字节时没有任何问题,因为每个人都可以很好地处理字母数字字符,如果没有,您可能不想使用它们。
当然,使用base64了一段时间后,您可能会注意到,虽然您不会因为一位反复无常的上帝以为他在提供帮助,却没有按照自己的意愿对数据进行更改,但您却通过使用放弃了效率base64。对于二进制blob中的每3个字节,如果需要传输字母数字字符,则有4个字节,因此您要以33%的容量税来支付数据保护费用:如果暴徒可以在保护球拍中掠走33%,相信他们会的。
  看一下base64,您可能会注意到,除了可以使用的64个字符外,还有更多可显示的ASCII字符,base64可以在编码中使用这些字符以提高传输密度。这样就base85诞生了,使用了……您猜对了,有85个字符!这次,将4字节的二进制数据编码为5个ASCII字符,这将导致20%的传输大小开销。但你能做什么呢?好像没有更多可显示的ASCII了……哦,等等。

所以似乎没有人试图超越明显的下一步base85,所以我决定尝试自己做base92。

在键入编码的字符串时,`和“与普通引号’太相似,以使其舒适。希望在区分l / 1和0 / O时使用的字体好。但是,我们将〜用作特殊符号(空字符串)。有94个可打印的ascii字符,因此我们最终得到91个字符,或每个字符6.5位。一旦包含〜,则将有92个字符:因此,为base92。(老实说,base91的名字太丑陋了,无法处理)
  一旦每个字符有6.5位,则可以一次使用13位,并使用类似于base85的除法和取模方案,用它们产生两个输出字符。这可能意味着,与base92编码相比,它更能抵抗损坏,因为任何损坏都更加局限(一位更改仅影响2-3个字节,而不影响4个字节)。

注意:在某些需要某些输出的情况下,可能需要将〜用作空字符串分号:但是,传递空字符串进行解码不会导致它变成barf,因此不要求使用〜。
旁注:以前base92产生的输出的长度与输入的长度非单调增长。这已不再是这种情况。
另一个旁注:base64和base85更加优雅,将一个较小的字节整数干净地映射到另一个较小的字节整数。base92将13个字节映射为16个字符,从大小的角度来看,这比base85的4至5个字符更好,但是相当不雅观。我们还遵循使用高除数乘积作为第一个字节的base85约定。”

以上是用谷歌翻译直接搬运的,如有描述不懂的小伙伴,请参照原文链接进行参考~
https://thenoviceoof.com/blog/projects/base92/

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值