密码学基础之对称加密算法
消息摘要算法
消息摘要算法又称为单向散列,hash算法。其主要特点是加密过程中不需要密钥,加密后会生成一个固定长度的hash值,因为一般被加密的数据都比较长,经过hash之后生成一个固定长度并且较短的数据hash值(压缩),所以不同的数据经过hash后的值可能会相同,且由hash值无法反推出原始数据。常见的消息摘要算法有md系列(md3,md4,md5),sha系列(sha-1,sha-2),crc系列等。一般hash后的结果位数越长越安全,md5计算的散列值为128位(16个字节),而sha-160计算的hash值为160位(20个字节),所以相比md5而言sha-160更安全。
对称加密算法
对称加密算法的特点是加密与解密使用相同的秘钥,解密算法相当于加密算法的逆运算,对称加密又分为序列密码加密和分组密码加密。常见的序列密码加密有RC系列(RC4,RC2),分组密码加密又DES,AES和IDEA。对称加密中的秘钥的保存尤为重要,因为一旦秘钥泄露加密的数据就会被轻松地解密,而且因为一般对称加密中的秘钥都是一组无意义的字节数据,所以秘钥的管理很麻烦。
序列密码加密
最常见的序列密码加密就是RC4,RC4的密钥经过密钥流生成器处理后会生成一个和加密数据长度相同的密钥流,然后将密钥流与原数据进行异或后生成加密后的数据,所以其加密数据与原始数据长度相同。解密算法和加密算法一致,就是生成相同的密钥流然后与加密数据异或后就会得到原始数据。
分组密码加密
分组密码加密常见的有AES,DES。以AES为例根据密钥长度的不同又分为AES-128,AES-192和AES-256,加密的时候会将原数据进行分组加密,每一组的长度固定为128位(16个字节),长度不满足要求需要进行填充。AES加密需要:明文 + 密钥+ 偏移量(IV)+密码模式(算法/模式/填充),AES加密后密文长度是16的整数倍,而DES加密后密文长度是8的整数倍。
PBE算法
这里的PBE(Password based encryption)算法又叫基于口令加密,其并不是一种全新的算法而是对称加密算法的一种包装。因为在对称加密中key(秘钥)是一组无意义的数据不方便表示,而在PBE中口令也叫密码是一个字符串。
- 先将口令 + salt盐值(一个随机数)经过单向散列后得到hash值,然后用这个hash值作为对称加密的秘钥对数据进行加密。因为salt盐值是随机的,所以每次对应的秘钥key也是不同的,那通过对称加密后的到的密文每次也是不一样的。
crypto-js 中的aes加密
crypto-js是js代码实现的一个加密库,其提供的aes算法就支持PBE形式。
- 其会先将口令和一个8个字节的盐值(随机数)通过md5散列后生产一个128位的数据作为iv
- 然后将口令和盐值通过sha-256散列后生成一个256位的数据作为key
- 然后利用这个iv和key将明文通过AES加密后生成密文
- 在传输给服务端时会将八个字节的salt盐值也传递过去,这样服务端在得到数据后就可以取出salt值,然后通过实现约定的口令经过相同的散列算法得到iv和key,然后对密文进行aes解密。
所以PBE基于口令的加密算法的优点是不需要单独保存key,以口令(密码)的形式进行加密。缺点是口令如果过于简单可能会被猜测到。