密码学

两方在使用不可靠信道进行数据交互时,发送方需要使用加密算法进行数据加密后发送,而接收方需要使用对应的解密算法进行解密。通常,在发送数据前,发送方接收方需要通过某种协议首先进行加解密算法密钥的同步。

数据加密算法

对称算法 - 加密解密过程可逆,即使用ABC进行加密,使用CBA进行解密

  • DES(已废弃):分组加密,密钥长度56位
  • 3DES :替换DES的暂时性方案,随着运算性能的增加,DES的密钥长度不足以满足安全性要求,因此使用三组不同的DES密钥对数据进行三次加密
    • 临时方案,可以复用DES的硬件,减少成本
    • 为什么不是两组?可以使用空间换时间的方案,从头尾两端同时进行解密,对中间结果建立hashmap
  • AES(推荐):对称分组密码体系,密钥长度可选128位,192位,256位,分组长度为128位

密钥交换相关算法

建立可信通路前,通过密钥交换算法交换密钥,可以动态的协商加密解密的密钥,避免本地储存过多密钥。

  • RSA(PKCS#1):基于两个大素数的乘积难以因式分解,因此可以将乘积公开作为加密密钥。RSA需要
    • 素数p,q,密码学 - 图1 , 密码学 - 图2%3Dpq#card=math&code=%5Cphi%28n%29%3Dpq&id=qcnYS)
    • 找到整数e,与$\phi (n) $ 互斥;取d,使得 密码学 - 图3%20%3D%201#card=math&code=de%20%5C%20mod%20%5C%20%5Cphi%20%28n%29%20%3D%201&id=Md4ib)
    • 公开模值n(1024/2048/…位),公钥e (通常为65537)
    • $ cipher = text^e \ mod \ n$
    • $ text = cipher^d \ mod \ n$
    • 原理:欧拉定理:设 m 是大于 1 的整数,如果 a ,m互质,则:$ a^{\phi (m)} = 1 (mod \ m)$
  • ECC(PKCS#13):利用椭圆曲线的性质
  • Diffie-Hellman(PKCS#3):
    • 公开素数p和素数的本原根g
    • A生成随机数a,公开密码学 - 图4;B生成b,公开密码学 - 图5
    • 公共密钥 密码学 - 图6

摘要算法

  • Merkle-Damgard结构: 消息被分成了很多个block,最开始的初始化向量和第一个block进行f操作,得到了的结果再和第二个block进行操作,如此循环进行,最终得到了最后的结果
    密码学 - 图7
  • MD-5
  • SHA-1
  • SHA-224, SHA-255, SHA-384, SHA-512
  • 密码学 - 图8

填充算法

在分组密码 / 定长加密算法中,如RSA,AES中,若数据不足分组长度,需要将数据填补至指定长度

  • ZeroPadding:补0,无法区分数据尾部0
  • PKCS7Padding(多用于对称加密):补n个字节,值为n, n = len % block_size;n = n==0?block_size:n;
  • PKCS#1_v1.5(用于RSA):00 02 [a bunch of non-zero random bytes] 00 [the message],随机数长度 = 公钥位数 - 明文位数 - 3 * 8,且大于等于8字节,因此使用该padding算法的RSA明文长度最多为公钥位数-11bytes
  • PKCS#1_v2 / OAEP(用于RSA):引入了随机数和校验
    • 生成一个k0位的随机数r
    • 原文m补上 k1位0,得到消息M, k1 = n - size(m) - k0
    • 对r取hash获得G(r)
    • 补位后的消息M与G(r)进行异或操作,得到X
    • 然后随机数r与X的hash值进行异或操作,得到Y
    • 将X与Y合并成补位后的消息
    • 密码学 - 图9