加密算法核心点
存在于一种公式, n=f(p,q) 根据p和q很容易算出 n ,但是对于给定的n很难算出p和q
生日碰撞
假设一个班级有10个人 两个或以上生日在同一天的概率是多少
20个人呢?
50个人呢?
以上的答案
11.7%
47.2%
97.1%
RSA
期望的结果
alice有一个数字4 希望加密后发给bob,且bob可以解密获得4
核心函数
// 欧拉公式
大质数 p
大质数 q
p*q = n
φ(n) = (p-1)(q-1)
// 假设 mn互质数
m^φ(n) = 1 (mod n)
这里rsa用的欧拉公式,如果不是很熟悉高数,只要把φ(n)当成一个值就可以了
公私钥
公钥
区间(1,φ(n) )中选取一个整数e,且e与φ(n) 互质
公钥为 (φ(n) ,e)
私钥
构造一个整数d 满足 e*d ≡ 1(mod φ(n) )
私钥为(φ(n) ,d)
加密解密
加密
设文本为c
加密后密文 为t
加密公式
m^e ≡ c (mod n )
解密公式
c^d ≡ m (mod n )
证明加密解密公式
m^e ≡ c (mod n)
转化为
m^e = c+kn
c = m^e+kn
c^d = (m^e+kn)^d
c^d = m^ed+kn
因为
e*d ≡ 1(mod φ(n) )
ed-1 = kφ(n)
所以
c^d = m^(kφ(n) +1)+kn
c^d = m *(m^(kφ(n)))+kn
// 关键点
因为
m^φ(n) = 1 (mod n)
m^φ(n) = 1+kn
所以
c^d = m*((1+kn)^k)+kn
c^d = m*(1+kn)+kn
c^d = m+knm+kn = m+kn
c^d=m+kn
c^d -m = kn
解密公式
c^d ≡ m (mod n )
c^d = kn +m
c^d-m = kn
例子
1. 找出质数 pq
p = 3 q = 17
2. 计算 p*q = n
n = 51
3.计算 φ(n)
φ(n) = (p-1)(q-1) = 2*16 = 32
4. 取公钥中的e
11 (小于32且与32互质)
5. 计算私钥中的d
(32+1)/11 = 3
至此 私钥 (51,11) 公钥(51,3)
6.随机取一个数字m
m = 4
7.则计算加密结果
(4^11)%51 = 4194304%51 = 13
8.解密
(13^3)%51 = 2197%51 = 4
至此 验证完毕
ECC(ECDSA)
期望的结果
alice有一个数据 希望加密后发给bob,且bob可以解密获得数据
核心函数
// 椭圆曲线
elliptic curve
公私钥
私钥
系统随机生成一个256位的二进制数 共计32个字节,大概可以表示2^256次方个数,私钥重复是小概率事件
公钥
根据私钥 进行ECC算法
取一个点 x,y(根据规范而定,例如secp256开)
私钥k 和x ,y进行椭圆乘法 kx,ky 拼接起来就是公钥
加密解密
alice有公私钥 a:private a:public b:public
bob有公私钥 b:private b:public a:public
所以
alice 可以获得秘钥 a:private*b:public = a:private * b:private *G
bob 可以获得秘钥 b:private * a:public = b:private*a:private*G
由此可以获得对称加密的加密钥匙 进行加密解密
信息身份认证(数字签名,验签)
// 签名
alice 对数据m进行数据签名(证明 m是由a说的)
m * a:private = msg,信息为(m,msg)
// 验签
bob验证msg是否归属于alice
m * a:public = m * g * a:private = msg*G
所以 如果 m *a:public 与 msg *g相等 则可以证明是a所发
安全性
- rsa这个是对于大质数解析,目前尚未有人对800+长度以上的宣布破解
- ecc这个本身由于hash范围很大的就很难碰撞了
其余
- 小概率事件,并非是概率低的事件,实际上指的是可能发生但是概率为0的事件
- 椭圆乘法,多个点相加,例如点与点相加交曲线于A点并做对称点,进行k(私钥)次运算,在多次运算可以用质数运算,所以最多200+次就可以得到结果,并非逐个相加
- secp256k1 规定了曲线方程
哦 这让人感觉到糟糕的形状
规定了质数域
p = 2^256 - 2^32 - 977
规定了G点为
040x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8