对称加密与散列 🔗
有des, aes 方式, 计算性能好,但密钥的安全依赖于双方,密钥有配送安全问题。
散列: func后不可逆, 不是加密方式。有md5, sha256。保证数据没被串改;用户密码散列存储。
RSA 🔗
RSA背景 🔗
1977年由MIT三位学者发明。
相关数论概念 🔗
-
互质 两个数的最大公约数是1。 $$gcd(a,b)=1$$ 两数互质与两数是不是质数没有关系。
-
p与q互质,剩余定理得出 $$\Phi \left( pq\right) =\Phi(p)*\Phi(q)$$
-
欧拉函数 $$\Phi(n)$$
在小于等于n的正整数之中,与n构成互质关系的数的个数
n是质数时, $$\Phi(n) = n - 1$$
n不是质数时,n分解为质数a,b,c...相乘 $$n = a * b * c\cdots$$
$$\Phi(n)=\Phi( a) *\Phi( b)...$$
- 欧拉定理
两个正整数a与n互质, 则:
$$a^{\Phi \left(n\right)}\equiv 1\left( mod\ n\right)$$
- 费马小定理
当n为质数时,则:$$a^{n-1}\equiv 1\left( mod\ n\right)$$
rsa 生成过程 🔗
1 找两个大质数p, q
2 求乘积 n=p * q, $$ \Phi(n) = \Phi (p * q)=(p-1)*(q-1) $$
3 在0 ~ n的欧拉函数之间找一个e,使得e与欧拉函数互质
4 找一个d, 使得 $$e * d \equiv 1 mod\Phi(n) $$
5 则(n, e)公钥, (n, d)私钥
- 加密公式 $$x^e mod n = y $$
- 解密公式 $$y^d mod n = x $$
例子: 两个质数(7, 13), max number为n=7*13=91,n的欧拉函数为72, 公钥可以找5, 私钥为29 (29 * 5 mod 72 余1)。
rsa 证明 🔗
$$ y=x^e - kn \tag{1}$$
$$ y^d \equiv x (mod\ n) \tag{2}$$
$$ (x^e - kn)^d \equiv x (mod\ n) \tag{3} $$
左边多项式展开: $$ x^ed-m_{1}x^{e(d-1)}kn+m_{2}x^{e(d-2)}(kn)^2...m_{n}(kn)^{d} \tag{4} $$
$$x^{ed}$$ 不含n, 所以只需要证明: $$ x^{ed} \equiv x (mod\ n) \tag{5} $$
而ed 等于: $$ ed \equiv 1 (mod\ {\Phi (n)}) \tag{6} $$
$$ ed=h{\Phi(n)})+1 \tag{7} $$
$$ x^{h{\Phi \left(n\right)}}*x\equiv x (mod\ n) \tag{8} $$
若x与n互质,根据欧拉定理 得证 $$ x^{h{\Phi \left(n\right)}}\equiv 1 (mod\ n) \tag{9} $$
$$ x^{h{\Phi \left(n\right)}}x\equiv x (mod\ n) \tag{10} $$
若x与n不互质时, 稍微复杂 todo
工程实现 🔗
- 明文需要分段加密,原因是明文大小不能超过n的限制。
- 同样的明文,同样的公钥,每次加密的结果不会一样。因为随机数填充。
- 填充协议PKCS #1 v1.5: "填充后数据" = "00" + "数据块类型" + "填充字符串" + "00" + "原始数据"
- BT (数据块类型) 00: 填充字符串全为00;01:全为FF; 02:针对公钥时设置BT=02,伪随机字符串,这能解释上面公钥加密的结果会不一样;
TLS 🔗
https的原理, 握手阶段
- 客户端给server发送支持的对称加密算法
- server选择支持的对称加密算法和版本 (确定hash算法,对称加密算法)
- server发送证书(包含公钥, X.509标准公钥证书的标准,定义证书的格式,包含CA机构,公钥等)
- client验证证书后, 用rsa的公钥发送对称加密的密钥给server
- server返回ack,握手完成
后续的传输阶段时使用对称加密进行通信
TLS1.2 and TLS1.3 🔗
Transport Layer Security 1.3 参考链接 https://www.rfc-editor.org/rfc/pdfrfc/rfc8446.txt.pdf
TLS 背景 🔗
提供端到端之间提供安全通信通道。
依赖: 依赖下层协议的可靠性和顺序数据流。
TLS 特性 🔗
认证Authentication方式: RSA, the Elliptic Curve Digital Signature Algorithm (ECDSA), symmetric pre-shared key (PSK)。
机密
完整性
TLS two primary components 🔗
- 握手协议
协商密码模式和参数,并建立共享密钥材料
- 记录协议
TLS1.2 与 TLS1.3 的区别 🔗
TLS1.2 -- performance and security --> TLS 1.3
- 增加O-RTT
O-RTT for repeat clients,1-RTT for native clients,TLS 1.3 shorter handshake。
- static rsa, dh被移除, 增加的密钥交互机制均保证前向数据安全。
DH && ECDH 🔗
DH (Diffie-Hellman) : 能在非安全的信道中安全的交换密钥,用于加密后续的通信消息。
DH 交互流程 🔗

A: 构建密钥对:private key1 和 public key1
A->> B: 公布自己的公钥: public key1
B: 使用public key1构建自己的密钥对 private key2 和 public key2;
B-->> A: 返回自己的public key2;
A: 使用private key1 和 public key2 构建本地密钥;
B : 使用private key2 和 public key1构建本地密钥;
DH 形式话描述 🔗
alice 的私钥x, blob的私钥y
$$ (a^x mod p)^y mod p == a^(xy) mod p y_a = a^x mod p y_b = a^y mod p
k = (y_b)^x mod p k = (y_a)^y mod p $$
alice 本地生成随机数a, 计算$$ G_a= (p^a) mod q$$
bob 本地生成随机数b, 计算$$ G_b = (p^b) mod q $$
进而 alice 计算出通信密钥为: $$ S_a = G_b^a mod q $$
bob 也计算出通信密钥为: $$ S_b =G_a^b mod q $$
需证明 $$S_a == S_b$$
ECDH 🔗
$$y^2 = x^3 + ax + b$$
ECC椭圆曲线加密算法, 为了方便计算, 在有限域(gf)上进行计算
给定椭圆曲线上的一个点P,一个整数k(私钥),求解Q=kP很容易;给定一个点P、Q,知道Q=kP,求整数k确是一个难题。ECDH即建立在此数学难题之上。
密钥的管理kms系统: 信封加密, 密钥轮替,加解密运算 与 存储分离, 访问认证, 数据监控, root key
同态加密(Homomorphic Encryption) 🔗
同态加密 HElib, SEAL 全同态加密开源库。半同态实践:python的phe库
全同态 支持密文上任意次,任意类型的计算
层次同态 支持有限次数的加法和乘法
部分同态 只支持加法或者乘法
可算不可见: 对加密状态的数据直接进行操作。
在密文空间进行运算后与明文空间上仍然一对一,能解密。
只有不对原文进行填充的原始RSA才满足乘法同态性质。 rsa encrypt $$ c= Enc(m) = m^e mod n $$ rsa decryp $$ Dec(c) = c^d mod n $$ $$Enc(m_1) * Enc(m_2) = (m_1 * m_2)^e = Enc(m_1 * m_2)$$
参考 🔗
[1] ECC椭圆曲线加密
[2]《introduction to modern cryptography》 现代密码学导论