关于RSA的学习整理
一、RSA原始模型整理
1. 基础理论:欧拉函数与欧拉定理
- 欧拉函数:,表示[1,n)中与n互素的数的个数。
显然若n为素数,那么。
且欧拉函数满足以下关系:若,有- 欧拉定理:
2. RSA基本原理
(1) 需要参数
实现RSA需要两个大素数:,且有模数
求其欧拉函数:
选取公钥(例如熟知的65537),需要与互素,计算私钥d。
私钥d满足,且称d是e模n的乘法逆元
(私钥d可由egcd拓展欧几里得算法计算)
上诉等式亦可写成:(k为任意正整数)
(2)加解密过程
有明文,用公钥加密得密文
用私钥解密得:
由欧拉定理 得
3. RSA公私钥的另一种关系
最近在阅读Java的第三方开源库BouncyCastle的生成RSA密钥方法时,发现其生成的公私钥关系是不满足,而是满足以下关系:(指两个数的最小公倍数)
部分相关源码如下:
pSub1 = p.subtract(ONE);
qSub1 = q.subtract(ONE);
gcd = pSub1.gcd(qSub1);
lcm = pSub1.divide(gcd).multiply(qSub1);
//
// calculate the private exponent
//
d = e.modInverse(lcm);
包版本:
gradle: org.bouncycastle:bcprov-jdk15on:1.56
类路径:org.bouncycastle.crypto.generators.RSAKeyPairGenerator
方法名:generateKeyPair()
发现这样生成的公私钥也可以做加解密计算,而且私钥d明显比原生的短许多,在做解密计算或签名时,效率必然是更快的。
在查阅部分资料后(主要来自于陈景润同志的《初等数论》(Ⅰ)第四章习题7,有兴趣者可自行查阅),我整理如下证明过程。
首先需要费马小定理:(p是素数)
其实费马小定理也是特殊的欧拉定理,因为当n是素数时,
已知的RSA需要两个大素数 ,对于数,有以下等式
此时假设数
,即是的最小公倍数,
有,且。那么有
上诉等式亦可写成以下等式
那么有
即;
(为任意正整数)
即得到
由于都是素数,那么有
所以有
所以RSA的公私钥只要满足即可。
4. 结合中国剩余定理的RSA计算方法
在使用openssl生成RSA密钥时,发现其私钥文件,除了公钥(e:publicExponent
),私钥(d:privateExponent
),模数(n:modulus
),模数的两个素因子(p:prime1
,q:prime2
)之外,还有三个参数,分别是exponent1
,exponent2
,coefficient
.
在BouncyCastle中,也发现类似的类参数,在查阅RFC标准是,也发现相关方法RFC 2437
public class RSAPrivateCrtKeyParameters
extends RSAKeyParameters
{
private BigInteger e;
private BigInteger p;
private BigInteger q;
private BigInteger dP;
private BigInteger dQ;
private BigInteger qInv;
}
包版本:
gradle: org.bouncycastle:bcprov-jdk15on:1.56
类路径:org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters
在查阅部分资料后(主要来自博客http://jianiau.blogspot.com/2014/05/rsa-decrypt-with-crt.html),发现用私钥结合中国剩余定理(CRT)来做计算(解密或签名),效率会更高。
首先解释上诉参数的含义:
private BigInteger e;//公钥
private BigInteger p;//模数的素因子
private BigInteger q;//模数的素因子
private BigInteger dP;//d mod p-1
private BigInteger dQ;//d mod q-1
private BigInteger qInv;//q模p的乘法逆元,即qInv *q = 1 (mod p)
(1)计算过程(以解密计算为例)
有密文,得
第一次看的时候我直呼what's up.这么牛X.
在一顿搜索和演算之后,整理以下推导过程.
(2)推导过程
从用私钥计算的原始公式 ,再由中国剩余定理(CRT)拆解得,计算一下等式:
由于即(k为任意正整数)
那么
由费马小定理
得
所以可写成
将d拆解为去计算,明显数字的位数短许多,在做指数运算的时候,效率更高。
然后,现在的问题在于,如何用来计算明文结果.
由于分别模的结果,
即
要从来计算构造(凑出),
首先以第二条等式为前提假设,为任意整数
满足第一条等式:
经过一顿操作之后得到,是q模p的乘法逆元。
所以明文得
整理完毕,明天照常搬砖。
参考文档
[1] 《初等数论》(Ⅰ) 第四章习题7,陈景润著。
[2] Java第三方开源库BouncyCastle
[3] 开源程序openssl
[4] RFC 2437
[5] http://jianiau.blogspot.com/2014/05/rsa-decrypt-with-crt.html
[6] 2018年数论课鄙记
[7] 2019计算机安全学鄙记