公钥密码系统主要依赖下面三种数学难题
1.大整数因子分解问题,如 RSA 系统
1.数理
- 将两个大素数相乘容易,但对其乘积进行因式分解极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥
- 先找到两个非常大的质数P和Q,使N=PQ,T=(P-1)(Q-1)
- 在区间(0~N)之间取一个与T互质的数 E,即GCD(E,T)=1
- 计算得到D,使得 (E*D)%T=1,也就是E再模T意义下的乘法逆元。
- 加密时得到密文的方法就是C=(M^E)%N ,由密文得到明文就是M=(C^D)%N;
2.流程
- 以 A 要把信息发给 B 为例,确定角色:A 为加密者,B 为解密者,{E,N}作为公钥,{D,N}作为密钥
- 首先由 B 随机确定一个 KEY 为私钥;然后,由这个 KEY 计算出另一个 KEY 为公钥
- 通过网络把这个公钥传给 A,A 收到公钥后,利用公钥对信息加密,并把密文通过网络发送到 B
- 最后 B 利用已知的私钥,就能对密文进行解码
2.离散对数问题 (DLP问题)
1.数理:
- 设G为一个有限Abel加法群,假定g为G的某个本原元,a为任意的整数,如果已知g及ag数值,如何求出整数a来的问题在数学上称为离散对数问题。
本原元:设P为素数,若存在一个正整数g使得g1,g2,g3…g m-1
(g的m-1次方),关于模m互不同余( 模p下g的阶=φ ( p ) ),则g为模p的本原元(又称为原根)
同余:两个整数 a, b,若它们除以正整数 m所得的余数相等,则称 a, b对于模 m同余(a同余于b 模m或a与 b关于模 m同余),记作 a≡b(modm) , 比如 26≡14(mod12).
- 这类算法有Massey—omura公钥系统,EIGamal 公钥系统等等。
2.流程:(EIGamal 公钥系统)
- 私钥(p,g,x):取大素数 p ,要求p-1有大素数因子,再选择一个模p的本原元g ;随机选取一整数 x (2 <= x <= (p - 2)
- 公钥(p,g,y):随机选取一整数 x (2 <= x <= (p - 2),计算 y = g^x (mod p)
- 加密:用户A加密并发送给用户B
A将明文M编码为一个在0到p-1之间的整数m作为传输的明文;
随机选取一整数 r (2 <= r<= (p - 2) 且 k 与 (p - 1) 互素);
计算 c1= g^r mod p,c2 = m*y^r mod p(y为用户B的公钥);得到密文 C = (c1, c2); - 解密:用户B接收并解密计算明文m;
m = c2 * c1^(-x) mod p ;(x为用户B的私钥)
c2 * c1^(-x) mod p Ξ m * y^r * g^(-xr) Ξ m * g^(xr) * g^(-xr) Ξ m
3. 椭圆曲线上的离散对数问题 (ECDLP)
1.数理
- 等式Q=dG(
Q,G为Ep(a,b)上的点,d为小于n的整数,n是点G的阶) - 在有限域上的椭圆曲线,给定d和G,根据有限域上的加法法则,很容易计算出Q
- 这就是椭圆曲线的离散对数难题。点G称为基点,d为私钥,Q为公钥。
2.流程
- 选定一条椭圆曲线 Ep(a,b) 并取椭圆曲线上一点,作为基点P。
- 选择一个大数k作为私钥,并生成公钥 Q=kP。将 Ep(a,b) 和点Q、P传给用户。
- 用户接到信息后 ,将待传输的明文编码到Ep(a,b)上的一点M,并产生一个随机整数r。
- 公钥加密(密文C是一个点对): C={C1,C2}{rP, M+rQ}
- 私钥解密(解密结果是点M),对点M进行解码就可以得到明文
公式如下: C2-kC1=M + rQ - k(rP) = M + r(kP) - k(rP) = M