常见编码分析
二进制(bit)
0或1
字节(byte)
一个字节占8个bit位,一个字节可以表示0到255之间的整数值。如果要表示256这个数值,需要使用至少两个字节。
例如,十进制数值10的字节表示为00001010。
字节是计算机信息存储的基本单位,通常由8个二进制位(bit)组成。
1 KB(kilobyte,千字节)等于1024字节;
1 MB(megabyte,兆字节)等于1024 KB;
1 GB(gigabyte,吉字节)等于1024 MB;
1 TB(terabyte,太字节)等于1024 GB;
1 PB(petabyte,拍字节)等于1024 TB;
1 EB(exabyte,艾字节)等于1024 PB;
1 ZB(zettabyte,泽字节)等于1024 EB;
1 YB(yottabyte,佑字节)等于1024 ZB。
ASCII码
每个字符用一个字节表示,范围是0到127。例如,字符 'A' 的ASCII码是65,用二进制表示就是01000001。
UTF-8编码
采用1至4个字节不等的编码长度。
英文大小写字母和数字,特殊符号都采用一个字节表示, 中文用三个字节表示,
ISO-8859-1
每个字符用一个字节表示,范围是0到255,覆盖了拉丁字母及西欧其他语言的字符。
GB2312、GBK、Big5
这些中文编码方式通常采用两个字节表示一个中文字符,范围不同,可以覆盖简体中文和繁体中文的字符。
Hex编码(Hexadecimal Encoding) 十六进制
十六进制使用0-9以及a-f 表示数字0到15
一个字节(8位)的二进制数 可以用两个十六进制数字表示
例如,二进制数11011011可以转换为十六进制数:
1101 -> D
1011 -> B
11011011的十六进制表示为DB
Base64编码
使用64个字符来表示二进制数据,包括大小写字母、数字和两个额外的符号。
每3个字节的二进制数据会被编码为4个字符。编码后的数据长度比原始数据稍长
Base64编码的原理是将输入数据按照3个字节(24位)一组进行分割,每个字节占8位,然后将这24位的数据按照6位一组分割成4组,每组6位转换为一个Base64字符。如果数据不足3字节,则在末尾添加0,并且用=字符填充。
编码类型示例:
Unicode编码: \u0068\u0065\u006c\u006c\u006f\u0031\u0032\u0033\u5468\u6dd1\u6021
十六进制编码: \x68\x65\x6c\x6c\x6f\x31\x32\x33\x5468\x6dd1\x6021
十进制编码: 104,101,108,108,111,49,50,51,21608,28113,24609
Base64编码: aGVsbG8xMjPlkajmt5HmgKE=
常见加密算法分析
MD5
识别:
长度32位,结果不变 123456 >> e10adc3949ba59abbe56e057f20f883e
介绍:
加密不可逆,不可破解,但简单的明文加密后可以通过撞库破解
应用场景:
校验数据或文件完成性
SHA-1、SHA-256、SHA-512
识别:
SHA-1:长度160
SHA-256:长度256
SHA-512:长度512
MAC -> MD5、SHA-1、SHA-256、SHA-512
注意:
加密时多了一个密钥,密钥是随机生成的
DES/ECB DES/CBC
识别:
ECB模式没有IV,没有CBC安全 CBC模式有IV
key不变结果不变,长度随密文长度而变长
介绍:
DES 密钥本身是 64 位 (固定8个字节)
DES 有效密钥长度为 56 位。 其中 8 位是用于奇偶校验的
填充方式:NoPadding、PKCS5Padding
DES/ECB模式 采用每个8字节一组,相同的组的内容加密出来是一样的。
DES/CBC模式 采用位异或,即使每组相同,加密出的结果也不同
密钥长度较短,DES 被认为是不安全的,被人破解过
应用场景:
适合大量数据的加密
DESSede
介绍:
DES 密钥本身是 168 位 (固定24个字节)
其他和DES差不多
AES/ECB AES/CBC
识别:
ECB模式没有IV CBC模式有IV
key不变结果不变,长度随密文长度而变长
介绍:
AES 支持三种不同的密钥长度:128 位(16字节)、192 位(24字节)、256 位(32字节)
默认128位
分组长度 128位、 iv向量长度 128位
填充方式:NoPadding、PKCS5Padding
应用场景:
适合大量数据的加密
RSA
识别:
公钥要比密文长 公钥216 得到长度172 公钥392 得到长度344
使用 PKCS1_v1_5,PKCS1_OAEP等随机填充 即使公钥相同,每次结果变化
RSA 公有指数+模数生成公钥 进行nopadding模式(填充数全部为0)的加密,每次结果一样
MD5withRSA、SHA1withRSA、SHA256withRSA
介绍:
RSA密钥长度 512 - 65536位,长度必须是64 的倍数
MD5withRSA RSA密钥默认长度 1024
SHA1withRSA RSA密钥默认长度 1024
SHA256withRSA RSA密钥默认长度 2048
签名长度 与密钥长度相同 使用RSA私钥签名,使用公钥验证
使用的填充方式都是NoPadding,保证对同一个数据签名之后的结果一致
流程:
MD5withRSA示例:
签名:
原数据MD5加密,再使用RSA私钥进行加密,得到签名
将原数据和签名一同发出,用户拿到签名使用公钥进行验证
验证:
传入原数据,签名,公钥
将原数据重新MD5加密,再使用RSA私钥进行加密,得到签名,进行传入签名的比对
返回True或False
应用场景:
数字签名算法可以对传输的数据进行很好的保护
其他
关于re.findall()
re.findall()取数据时会把字符串中的\n变成\\n
所以还是要加一个replace
publicKey = re.findall('"key":"(.*?)"', html)[0].replace('\\n', '\n')
关于RSA
RSA源码关键词判别:this.doPublic(m) c.toString(16)
function RSAEncrypt(text) {
var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
if(m == null) return null;
var c = this.doPublic(m);
if(c == null) return null;
var h = c.toString(16);
if((h.length & 1) == 0) return h; else return "0" + h;
}
前端加密出来之后将结果从十六进制转成b64,就相当于python的RSA加密
关于公钥的创建关键词搜索:
setPublicKey
关于DES的key长度
var key = "passport-gw-pc";
前端这里会自动处理
var keyHex = CryptoJS.enc.Utf8.parse(key);
后端需要是八个字节,取前八位,加密出来结果和前端一样
key = "passport-gw-pc".encode('utf-8')[:8]