密码学基础知识
目录:
1.编码系列
2.加密算法
编码系列
1.Base系列编码:Base16、Base32、Base58、Base85、Base100 等
Base64: 使用了 64 个可打印字符(A-Z、a-z、0-9、+、/)一般情况下结尾都会有 1 个或者 2 个等号, 明文很少的时候可能没有;
- Base16:结尾没有等号,数字要多于字母;
- Base32:字母要多于数字,明文数量超过 10 个,结尾可能会有很多等号;
- Base58:结尾没有等号,字母要多于数字;
- Base85:等号一般出现在字符串中间,含有一些奇怪的字符;
- Base100:密文由 Emoji 表情组成。
示例:
|
编码类型
|
示例一
|
示例二
|
|
明文
|
01234567890
|
administrators
|
|
Base16
|
3031323334353637383930
|
61646D696E6973747261746F7273
|
|
Base32
|
GAYTEMZUGU3DOOBZGA======
|
MFSG22LONFZXI4TBORXXE4Y=
|
|
Base58
|
cX8j8pvGzppMKVb
|
BNF5dFLUTN5XwM1yLoF
|
|
Base64
|
MDEyMzQ1Njc4OTA=
|
YWRtaW5pc3RyYXRvcnM=
|
|
Base85
|
0JP==1c70M3&rY
|
@:X4hDJ=06Eaa'.EcV
|
|
Base100
|
🐧🐨🐩🐪🐫🐬🐭🐮🐯🐰🐧
|
👘👛👤👠👥👠👪👫👩👘👫👦👩👪
|
2.Unicode编码: 又称为统一码、万国码、单一码,是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode 编码:以 \u、&# 或 &#x 开头,后面是数字加字母组合
PS:\u 开头和 &#x 开头是一样的,都是 16 进制 Unicode 字符的不同写法,&# 则是 Unicode 字符 10 进制的写法,此外,&# 和 &#x 开头的,也称为 HTML 字符实体转换,字符实体是用一个编号写入 HTML 代码中来代替一个字符,在 HTML 中,某些字符是预留的,如果希望正确地显示预留字符,就必须在 HTML 源代码中使用字符实体。
示例:
|
编码类型
|
示例一
|
示例二
|
|
明文
|
12345
|
admin
|
|
Unicode
|
\u0031\u0032\u0033\u0034\u0035
|
\u0061\u0064\u006d\u0069\u006e
|
3.Escape 编码
Escape 编码又叫 %u 编码,Escape 编码就是字符对应 UTF-16BE 表示方式前面加 %u,Escape 不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / ,其他所有的字符都会被转义序列替换。其主要特征如下:
以 %u 开头,后面是数字加字母组合
示例:
|
编码类型
|
示例一
|
示例二
|
|
|
明文
|
K 哥爬虫
|
我爱 Python
|
|
|
Escape
|
K%u54E5%u722C%u866B
|
%u6211%u7231Python
|
4.URL / Hex 编码
URL 和 Hex 编码的结果是一样的,不同的是当你用 URL 编码网址时是不会把 http、https 关键字和 /、?、&、= 等连接符进行编码的,而 Hex 编码则全部转化了,其主要特征如下:
以 % 开头,后面是数字加字母组合
|
编码类型
|
示例
|
|
明文
|
|
|
Unicode
|
|
|
Hex
|
%68%74%74%70%73%3a%2f%2f%77%77%77%2e%6b%75%61%69%64%61%69%6c%69%2e%63%6f%6d%2f
|
加密算法
1.MD5 实质是一种消息摘要算法,一个数据的 MD5 值是唯一的,同一个数据不可能计算出多个不同的 MD5 值,但是,不同数据计算出来的 MD5 值是有可能一样的,知道一个 MD5 值,理论上是无法还原出它的原始数据的,MD5 是最容易辨别的,主要特征如下:
密文一般为 16 位或者 32 位,其中 16 位是取的 32 位第 9~25 位的值;
组成方式为字母(a-f)和数字(0-9)混合,字母可以全部是大写或者小写。
除了通过密文特征来判断以外,我们还可以搜索源代码,标准 MD5 的源码里是包含了一些特定的值的,没有这些特定值,就无法实现 MD5:
0123456789ABCDEF、0123456789abcdef
1732584193、-271733879、-1732584194、271733878
PS:某些特殊情况下,密文的长度也有可能不止 16 位或者 32 位,有可能是在官方算法上有一些魔改,通常也是在 16 位的基础上,左右填充了一些随机字符串。
示例:
|
编码类型
|
示例一
|
示例二
|
|
明文
|
123456
|
admin
|
|
MD5
(16 位小写)
|
49ba59abbe56e057
|
7a57a5a743894a0e
|
|
MD5
(16 位大写)
|
49BA59ABBE56E057
|
7A57A5A743894A0E
|
|
MD5
(32 位小写)
|
e10adc3949ba59abbe56e057f20f883e
|
21232f297a57a5a743894a0e4a801fc3
|
|
MD5
(32 位大写)
|
E10ADC3949BA59ABBE56E057F20F883E
|
21232F297A57A5A743894A0E4A801FC3
|
2.SHA 是比 MD5 更安全一点的摘要算法,SHA 通常指 SHA 家族算法,分别是 SHA-1、SHA-2、SHA-3,其中 SHA-2 是 SHA-224、SHA-256、SHA-384、SHA-512 的并称,SHA-3 是 SHA3-224、SHA3-256、SHA3-384、SHA3-512、SHAKE128、SHAKE256 的并称,其名字的后缀的数字就代表了结果的大小(bit),注意,SHAKE 算法结果的大小并不是固定的,其他算法特征如下:
SHA-1:字母(a-f)和数字(0-9)混合,固定位数 40 位;
SHA-224/SHA3-224:字母(a-f)和数字(0-9)混合,固定位数 56 位;
SHA-256/SHA3-256:字母(a-f)和数字(0-9)混合,固定位数 64 位;
SHA-384/SHA3-384:字母(a-f)和数字(0-9)混合,固定位数 96 位;
SHA-512/SHA3-512:字母(a-f)和数字(0-9)混合,固定位数 128 位。
示例:
|
编码类型
|
示例
|
|
明文
|
123456
|
|
SHA-1
|
7c4a8d09ca3762af61e59520943dc26494f8941b
|
|
SHA-256
|
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
|
|
SHA3-256
|
c888c9ce9e098d5864d3ded6ebcc140a12142263bace3a23a36f9905f12bd64a
|
3.HMAC 这种算法就是在 MD5、SHA 两种加密的基础上引入了秘钥,其密文也和 MD5、SHA 类似,密文的长度和使用的 MD5、SHA 算法对应密文的长度是一样的。特征如下:
HMAC-MD5:字母(a-f)和数字(0-9)混合,位数一般为 32 位;
HMAC-SHA-1:字母(a-f)和数字(0-9)混合,固定位数 40 位;
HMAC-SHA-224 / HMAC-SHA3-224:字母(a-f)和数字(0-9)混合,固定位数 56 位;
HMAC-SHA-256 / HMAC-SHA3-256:字母(a-f)和数字(0-9)混合,固定位数 64 位;
HMAC-SHA-384 / HMAC-SHA3-384:字母(a-f)和数字(0-9)混合,固定位数 96 位;
HMAC-SHA-512 / HMAC-SHA3-512:字母(a-f)和数字(0-9)混合,固定位数 128 位。
HMAC 和 SHA、MD5 的密文都很像,当无法确定是否为 HMAC 时,可以通过其名称搜索到加密方法,如果传入了密钥 key,说明就是 HMAC,当然你也可以直接当做是 SHA 或 MD5 来解,解密失败时就得考虑是否有密钥,是否为 HMAC 了,在 JS 中,通常一个 HMAC 加密方法是这样写的:
function HmacSHA1Encrypt(word, key) { return CryptoJS.HmacSHA1(word, key).toString(); }
示例(密钥 123456abcde):
|
编码类型
|
示例
|
|
明文
|
123456
|
|
HMAC-MD5
|
432bb95bb00005ddce4a1c757488ed95
|
|
HMAC-SHA-1
|
37a04076b7736c44460d330ee0d00014428b175e
|
|
HMAC-SHA-256
|
50cb1345366df11140fb91b43caaf69627e3f5529705ddf6b0d0cae67986e585
|
|
HMAC-SHA3-256
|
b808ed9f66436e89fba527a01d1d6044318fea8599d9f39bfb6bec4843964bf3
|
4.RSA 加密算法是一种非对称加密算法,通过公钥加密结果,必须私钥解密。同样私钥加密结果,公钥可以解密,应用非常广泛,在网站中通常使用 JSEncrypt 库来实现,其最大的特征就是有一个设置公钥的过程,我们可以通过以下方法来快速初步判断是否为 RSA 算法:
搜索关键词 new JSEncrypt(),JSEncrypt 等,一般会使用 JSEncrypt 库,会有 new 一个实例对象的操作;
搜索关键词 setPublicKey、setKey、setPrivateKey、getPublicKey 等,一般实现的代码里都含有设置密钥的过程。
RSA 的私钥、公钥、明文、密文长度也有一定对应关系,也可以从这方面初步判断:
|
私钥长度
(Base64)
|
公钥长度
(Base64)
|
明文长度
|
密文长度
|
|
428
|
128
|
1~53
|
88
|
|
812
|
216
|
1~117
|
172
|
|
1588
|
392
|
1~245
|
344
|

浙公网安备 33010602011771号