加密算法

ps:本文默认阅读者配置了node.js运行环境

base64编码

Base64编码,是由64个字符组成编码集:26个大写字母AZ,26个小写字母az,10个数字0~9,符号“+”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后根据Base64的对应表,得到对应的编码数据。

当原始数据凑不够三个字节时,编码结果中会使用额外的符号“=”来表示这种情况。

base64测试

base64编码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import base64

# 将原始数据转化为二进制/字节数据
data = "you".encode("utf-8")
print(data)

# 把字节转化成b64
bs = base64.b64encode(data).decode()
print(bs)

bs = "yo".encode("utf-8")
# 把字节转化成b64
print(base64.b64encode(bs).decode())

# 猜测结果
bs = "y".encode("utf-8")
# 把字节转化成b64
print(base64.b64encode(bs).decode())

base64解码示例:

注意, base64编码处理后的字符串长度. 一定是4的倍数(因为Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节). 如果在网页上看到有些密文的b64长度不是4的倍数. 会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
import base64

s = "eW91"
ret = base64.b64decode(s)
print(ret) #正确

s = "eW91eQ=="
ret = base64.b64decode(s)
print(ret) #正确

s = "eW91eQ"
ret = base64.b64decode(s)
print(ret) #报错,s不是4的倍数

如果不是4的倍数如何处理呢?解决思路. 使用=填充为4的倍数即可

1
2
3
4
5
6
s = "eW91eQ"
#填充为4的倍数
s += ("=" * (4 - len(s) % 4))
print("填充后", s)
ret = base64.b64decode(s).decode()
print(ret)

base64 编码的优点:

  • 算法是编码,不是压缩,编码后只会增加字节数(一般是比之前的多1/3,比如之前是3, 编码后是4)
  • 算法简单,基本不影响效率
  • 算法可逆,解码很方便,不用于私密传输。

js常见的加密方式

  • 加密在前端开发和爬虫中是经常遇见的。掌握了加密、解密算法也是你从一个编程小白到大神级别质的一个飞跃。且加密算法的熟练和剖析也是很有助于帮助我们实现高效的js逆向。下述只把我们常用的加密方法进行总结。不去深究加密的具体实现方式。

  • 常见的加密算法基本分为这几类,

    • 线性散列算法(签名算法)MD5
    • 对称性加密算法 AES DES
    • 非对称性加密算法 RSA