Crypto
根据密钥类型不同分为两类:对称加密和非对称加密
对称加密算法常见的包括:DES、3DES、AES
非对称加密算法常见的包括:RSA、DSA、ECC
AES:Advanced Encryption Standard,是一种区块加密标准。
AES加密是在4*4的字节矩阵上运作的,这个矩阵叫做“体state”,其初值是一个明文区块。若需要加密的数据不是16字节的整数倍,则后面补位至16的倍数。若正好是16的倍数,则后面再补16字节。(padding采用PKCS7Padding
python:
length = 16 – (len(message) % 16)
message += chr(length)*length
message += chr(length)*length
加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:
- AddRoundKey —矩阵中得每一个字节与下一轮的RoundKey做异或运算
- SubBytes — 非线性的替换函数,在S-Box中用对应位置的值替换当前字节值
- ShiftRows — 将矩阵中的每一行做循环移位
- MixColumns — 混合每个矩阵中每列的操作
上图来自波士顿大学的Howard Straubing做了这么一个动画来展示AES加密算法的演示(援引自coolshell http://coolshell.cn/articles/3161.html)
在这个展示中对加密的过程和wiki中的描述看起来有些不同,其实是一样,都是在initial round时对Cipher key做一次或运算,然后9轮循环加密,最后再做一次替换函数,移位操作和异或运算。
每一轮做抑或运算的Round key值也是根据Cipher key推算出来的。
在每次计算第 4*i+1列时都会将 4*i列向上移位1位,然后根据S-Box做SubBytes,然后和4*i-3列异或,再和Rcon左边一列异或。
计算非4*i+1列(如j)时则直接计算列(j-1) 异或 列(j-4)得到。
可见整个AES state加密过程中Cipher Key对加密结果起到关键作用,AES也是通过Cipher Key来做对称解密的。
AES的密钥长度可以为128,192,256 Bytes,分别对应的加密Round数为10,12,14
而这种情况每一个state对应一个加密的4*4的块。state之间不存在互相影响的关系,这样在加密时可以并行计算,但随之带来的问题可能会让对方根据字母的统计频次来破解CipherKey值。
因此AES在这个加密的基础上又分为以下几种mode:
- ECB模式
每个state单独地进行加密,相同的明文state会得到相同的密文块
- CBC模式
第一块明文会和初始化向量IV做异或再加密,之后的明文块都需要上一个密文块做异或再进行加密。这样不容易主动攻击,也不利用并行计算。
- CFB模式
- OFB模式
BASE64
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。
在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
编码”man”:
base64 补位:
文本为1Byte的A,相应的二进制上补4个0,生成QQ,对应文本缺少两个Byte到3的倍数,最后的Base64编码补2个=
文本为2Byte的BC,相应的二进制上补2个0,生成QKM,对应文本缺少一个Byte到3的倍数,最后的Base64编码补1个=