RSA密码
非对称密码,分组密码
数学基础
- 欧拉函数:
对于一个正整数n,小于n且与n互素的正整数的个数,记为φ(n)。
对于一个素数n,可知φ(n) = n - 1
对于两个素数p和q,他们的乘积n = p * q,则φ(n) = (p-1) * (q-1)。
φ(n) = p*q-(q-1)-(p-1) -1 = (p-1) * (q-1)
最后-1是减去n本身
- 欧几里得算法:
gcd( a,b)表示a和b的最大公约数,gcd(a,b) = 1表示a,b最大公约数为1,说明a、b互质。 - 同余
两个整数a、b。若它们除以整数m所得的余数相等,则称a与b对于模m同余,记作a ≡ b (mod m)。例如26 ≡ 2 ( mod12 )。
RSA加密与解密
- 参数定义和密钥生成:
①选两个大素数p和q (p、q保密)
②计算n = p * q和φ(n) = (p-1) * (q-1) (n公开,φ(n)保密)
③选一整数e,满足1 < e < φ(n) ,且gcd(φ(n),e) = 1(e公开,e就是公钥)
④计算d,满足d * e ≡ 1 (mod φ(n))(d保密,d就是私钥),由于p、q都为素数,则φ(n)一定为2的倍数,因此d、e一定都不为2。 - 加密
c = me mod n - 解密
m = cd mod n
由此可见密文和明文分组长度最大为n的位数,在存储时一般也按照n的位数来存储。
已知p、q如何求d?
①算出n = p * q,φ(n) = (p-1) * (q-1)
②随机选择一个小于φ(n)且互质的整数e
③使用扩展的欧几里得算法求d
- 特点
加解密可逆,可同时确保数据的秘密性和真实性。
效率高效,核心运算为模幂运算 - 安全性
RSA密码的安全性在于大合数的因子分解,应当采用足够大的整数n,一般至少取1024位以上。
Diffie-Hellman密钥交换
素数q和其本原根α是两个公开的整数,
用户A先选择一数字XA < q作为私钥,再计算YA = αXA作为公钥,将YA发送给B。
用户B先选择一数字XB < q作为私钥,再计算YB = αXB作为公钥,将YB发送给A。
两人都可以计算出公共密钥K = YBXA mod q和K = YAXB mod q,
这两个K是相同的。
攻击者在知道q、α、YA、YB的情况下想要知道K的值就必须要算出私钥XA或XB,XA = dlogα、q(YB),这是非常困难的。
破解方法:中间人攻击
假设此时攻击者C截获了发送过程中的YA和YB,由于q和α是公开的,所以C可以选择两个私钥Xc,伪造两份Yc发给A和B,这样A、B会错以为他们之间已经共享密钥K,然而实际上A、B只是分别和C共享了密钥K1和K2,这样A、B之间发送的加密消息都会被C窃听和篡改。
EIGamal密码
这是基于离散对数问题上的公开密钥密码体系。
数学基础
- 有限域:对于素数p,整数集合(0,1,2……p-1),在mod p意义下,关于四则运算构成域,当域的元素数目有限时称为有限域。
- 阶:有限域中元素的个数,比如,模19下7的阶为3。(a、p互质,使得ad ≡ 1 (mod p)成立的最小正整数d称为a对模p的阶。)
71 mod 19 = 7
72 mod 19 = 11
73 mod 19 = 1
阶为3
- 本原元(原根):设p为素数,
若存在一个正整数g使得g1 、g2、g3……gp-1 关于模p互不同余,即模p下g的阶为φ( p ) = p - 1, 则称g为模p的本原元。如果存在ad ≡ 1 (mod p), 且阶d = φ(n),那么a就是p的本原元,一个域的本原元可能不唯一。
EIGamal的加密和解密
- 参数定义和密钥生成
①选取大素数p,并且要求p-1有大素数因子,再选取一个模p的本原元g。p、q为系统中所有用户共享。
②系统中每个用户U都随机挑选一个整数XU,1 <= XU <= p-1。并计算:YU = gXu mod p.
③用户的公钥为(YU,p,q),私钥为XU - 加密算法:
选一数k,k满足k<p且gcd(k, p-1) = 1,计算a = g^k ^mod p和b = yk *M mod p。其中(a,b)为密文对。 - 解密算法:
接收方收到密文对后,计算M = b * (ax ) -1 mod p
数字签名
特征
验证签名的真实性
不可伪造
不可改变
不可抵赖
验证消息的完整性