30余种加密编码类型的密文特征分析(1),渣本毕业两年经验

Base64编码要求把3个8位字节(3_8=24)转化为4个6位的字节(4_6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用‘=’,因此编码后输出的文本末尾可能会出现1或2个‘=’,如图。

在这里插入图片描述

为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。

Base64编码表

| 码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 |

| — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — |

| 0 | A | 8 | I | 16 | Q | 24 | Y | 32 | g | 40 | o | 48 | w | 56 | 4 |

| 1 | B | 9 | J | 17 | R | 25 | Z | 33 | h | 41 | p | 49 | x | 57 | 5 |

| 2 | C | 10 | K | 18 | S | 26 | a | 34 | i | 42 | q | 50 | y | 58 | 6 |

| 3 | D | 11 | L | 19 | T | 27 | b | 35 | j | 43 | r | 51 | z | 59 | 7 |

| 4 | E | 12 | M | 20 | U | 28 | c | 36 | k | 44 | s | 52 | 0 | 60 | 8 |

| 5 | F | 13 | N | 21 | V | 29 | d | 37 | l | 45 | t | 53 | 1 | 61 | 9 |

| 6 | G | 14 | O | 22 | W | 30 | e | 38 | m | 46 | u | 54 | 2 | 62 | + |

| 7 | H | 15 | P | 23 | X | 31 | f | 39 | n | 47 | v | 55 | 3 | 63 | / |

Base64使用注意问题


一、Base64和URL传参问题

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充’='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

二、Base64和URL传参问题改善

另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。

此外还有一些变种,它们将“+/”改为“-”或“.”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。

三、Base64转换后比原有的字符串长1/3

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3_8 = 4_6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

四、Base64转换总结

Base64转换,最好是不要用在加密上,尤其是参数加密,很容易出问题。

2、Base58——示例6tmHCZvhgfNjQu


它最大的特点是没有等号

Base58是用于比特币(Bitcoin)中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。

相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+“和”/"符号。

比特币的Base58字母表:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

简单的说:Base58一种编码方式,跟十进制,十六进制一样,不过更短更省空间。

Base58的原理是什么?

二进制:0和1

十进制:1到10

十六进制:十进制的基础上加上了A-F 六个字母

Base58可以理解为一种58进制。

Base58包含了阿拉伯数字、小写英文字母,大写英文字母。

但是去掉了一些容易混淆的数字和字母:0(数字0)、O(o的大写字母)、l( L的小写字母)、I(i的大写字母)

在这里插入图片描述

3、Base32——示例GEZDGNBVGY3TQOJQGE======


他的特点是明文超过十个后面就会有很多等号

Base32使用了ASCII编码中可打印的32个字符(大写字母AZ和数字27)对任意字节数据进行编码.Base32将串起来的二进制数据按照5个二进制位分为一组,由于传输数据的单位是字节(即8个二进制位).所以分割之前的二进制位数是40的倍数(40是5和8的最小公倍数).如果不足40位,则在编码后数据补充"=“,一个”="相当于一个组(5个二进制位),编码后的数据是原先的8/5倍.

Base32编码表

| 值 | 符号 | 值 | 符号 | 值 | 符号 | 值 | 符号 |

| :-- | :-- | :-- | :-- | :-- | :-- | :-- | :-- |

| 0 | A | 8 | I | 16 | Q | 24 | Y |

| 1 | B | 9 | J | 17 | R | 25 | Z |

| 2 | C | 10 | K | 18 | S | 26 | 2 |

| 3 | D | 11 | L | 19 | T | 27 | 3 |

| 4 | E | 12 | M | 20 | U | 28 | 4 |

| 5 | F | 13 | N | 21 | V | 29 | 5 |

| 6 | G | 14 | O | 22 | W | 30 | 6 |

| 7 | H | 15 | P | 23 | X | 31 | 7 |

| 填充 | = | | | | | | |

Base32将任意字符串按照字节进行切分,并将每个字节对应的二进制值(不足8比特高位补0)串联起来,按照5比特一组进行切分,并将每组二进制值转换成十进制来对应32个可打印字符中的一个。

在这里插入图片描述

由于数据的二进制传输是按照8比特一组进行(即一个字节),因此Base32按5比特切分的二进制数据必须是40比特的倍数(5和8的最小公倍数)。例如输入单字节字符“%

  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值