情景引入:
先来看这样一道例题:在使用RSA密码体制中,如果截获了发送给其他用户的密文c=10,若此用户的公钥为e=7,n=77,请问明文的内容是什么?
通过学习RSA,我们可以得到以下信息:
两个素数:p=7,q=11;
n=p*q=7*11=77;
φ(n)=(p-1)*(q-1)=60;
公钥e=7,
则公私钥的关系是e*d=1mod φ(n)。 7 * d = 1 mod 60。
这个问题可以转化为求解模逆元的问题。
多的不谈,这篇文章只是单纯的简单粗暴求解逆元。利用到的原理是扩展欧几里得算法。给予二个整数a、b,必存在整数x、y使得ax + by = gcd(a,b)。如果a,b互素,并且a>b,求解的y就是b的逆元。
求解过程:
在本题中,式子是 60x + 7y = 1, 求出的y就是7的逆元(私钥),利用辗转相除法,求解方程。
60=7*8+4; 4=1*60+(-8)*7
7=4*1+3 ; 3=1*7+(-1)*4
4=3*1+1; 1=1*4+(-1)*3
3=1*3+0; 0=1*3+(-3)*1
将上述式子从上到下依次代入,得到以下式子。
根据矩阵运算,算出,根据60*x+7*y=1的形式,左侧矩阵第一行的1可以通过右侧的矩阵运算得到,1=2*60+7*(-17)。所以-17就是7的逆元,转为正数就是 60 - 17 =43,43是7的逆元。
通过上述计算,发现规律了吗?
第一列是矩阵形式,第二列是辗转相除法,第三列是第二列变形。等号右边的矩阵总是的形式,a/b=p余r。最终可以化简成这种形式
,y就是b的逆元。
再举个例子,30*d=1 mod 47,求解d。
首先构造 30x+47y=1。然后按照步骤暴力求解。
总结
遇到类似RSA这种求解逆元问题(相乘模为1的问题),记住方法,暴力求解就对了。