本文:公钥密码及分类,单向陷门函数,RSA
公钥密码
一般,将对称密码的密钥称为 秘密钥,记为KM;
将公钥密码的两个密钥称为 公钥和私钥,记公钥为PUa,私钥为PRa。
有关数字签名:
发送方首先用自己的私钥PRa加密消息,然后用对方的公钥PUb再加密。
接受方首先用自己的私钥PRb解密,然后用对方的公钥PUa再解密。
这样既能提供认证,也能保证消息的保密性,但是每次传输要执行4次公钥算法。
公钥密码分类:
RSA
可以 加密解密;可以 数字签名;可以 密钥交换
椭圆曲线
可以 加密解密;可以数字签名;可以密钥交换
diffie-hellman
不可以 加密解密;不可以 数字签名;可以 密钥交换
DSS
不可以 加密解密;可以数字签名;不可以密钥交换
单向陷门函数 特点:
1、正向 正常算。
2、反向 有K很简单,没有K特别难算。
攻击:
1、穷举密钥
2、反解私钥
3、穷举密文(非对称密码特有):
密文里装着密钥,提前穷举所有密钥对应的密文,类似字典攻击
公钥密码目前仅应用在密钥管理和签名。
.
.
RSA
原理:
需要 C = Me mod n ; M = Cd mod n 来加密解密
所以想找 Med mod n = M
只能找 Mk*φ(n)+1 mod n = M (欧拉定理)
即 ed mod φ(n) = 1
即 ed ≡ 1 mod φ(n)
即 d ≡ e-1 mod φ(n)
或 d = 1/e * ( k * φ(n) + 1 ) (k任取,只需满足d是整数)
接收方 密钥产生过程:
1、找两个大素数 p,q,且 p≠q
2、计算 n = p * q
3、计算 φ(n) = (p-1) * (q-1) (根据欧拉函数)
4、找一个整数e,满足gcd(e,φ(n)) = 1,1<e<φ(n)
5、计算 d = e-1 mod φ(n)
6、公钥PU = { e,n }
7、私钥PR = { d,n }
发送方 加密:
C = Pe mod n
接收方 解密:
P = Cd mod n , 唯一的d
数学原理:
若n很大,想求φ(n),目前只能分解n=pq,然后φ(n)=(q-1)(p-1).
RSA中,e和n公开,需要破译的只有d,d由e和φ(n)决定,并且e已知道,于是问题就变成了通过n解出φ(n),可惜这并不能做到(目前)。
计算方面的问题
1、模里面的幂运算: 迭代
例子:计算x15 mod n
x mod n = a,
x2 mod n = a 2 mod n = b,
x4 mod n = b 2 mod n = c,
x8 mod n = c 2 mod n = d,
x15 mod n = ( x * x2 * x4 * x8 ) mod n = ( a * b * c * d ) mod n
2、用公钥进行有效运算:
为了加快运算速度,一般e是特定的(反正e也会公开),e大多会选216+1=65537,如果e太小,攻击者可以从中国剩余定理CRT计算出结果。
3、用私钥进行有效运算:
d太小会遭到穷举攻击。
4、密钥产生:
寻找大素数,用的是Miller-rabin测试算法。
对RSA的攻击
1、因子分解的防范策略
1,q和p的长度应仅相差几位(?)
2,p-1和q-1都应有个较大的素因子
3,gcd( p-1,q-1 ) 尽量小
2、计时攻击的防御
固定幂运算时间(降低性能)
随机延时
隐蔽(幂运算前乘个随机数)
.
.
.
.
.