在公钥系统中,我们采用公钥加密,私钥解密的方式,使得报文能够比较安全的传输。
假设A和B通信,但他们之间不通过对称密钥,B有一个公钥K+B和一个私钥K?B。为了与B实现通信,A首先需要获得B的公钥K+B对报文m进行加密,即K+B(m);B收到A的加密报文后用私钥K?B进行解密,即K?B(K+B(m))=m。其中的加解密算法通常使用RSA(RSA取创始人Ron Rivest, Adi Shamir, Leonard Adleman的姓氏首字母)。
RSA工作方式
加密时,首先把报文m做e次的幂运算,然后做模n的算数运算,即me%n;解密则先把上述密文值做d次幂,再做模n运算,即(me)d%n=m(ed)%n。
RSA工作原理推导
为了解开RSA工作原理的神秘面纱,需要使用数论中的一个神奇结论:如果p和q是素数,且有n=pq,则xy%n与x(y%(p?1)(q?1))%n相等。应用这个结论,那我们的私钥解密为:
(me)d%n=m(ed%(p?1)(q?1))%n
注意,m<n,并且我们是这样选择e和d的:ed?1能被(p?1)(q?1)整除,等价地说ed%(p?1)(q?1)=1,由此可得:
(me)d%n=m1%n=mm<n,n=pq,ed%(p?1)(q?1)=1,p和q是素数
于是乎,就得到了我们希望的结果:先对m做e次幂(加密)再做d次幂(解密),然后做模n的算数运算,就可得到原始报文m。另外通过颠倒上述公式的加解密次序,一样能得到原来的m。
(me)d%n=m=(md)e%n?K?B(K+B(m))=m=K+B(K?B(m))
因此B对外公开的公钥K+B为二元组(n,e),私钥K?B为二元组(n,d)
举例验证
条件:
m<n,n=pq,ed%(p?1)(q?1)=1,p和q是素数
取简单的值:
p=5,q=7
那么可以推导出:
n=pq=5?7=35,(ed?1)%(p?1)(q?1)=0?(ed?1)%(5?1)(7?1)=0?(ed?1)%24=0
于是,我们可以简单起见,为了减少计算量,设ed?1为24的1倍,那么我们可取值
e=5,d=5
假设传输明文为:
m=3
那么综上所述,我们可以得出:
- 加密,me%n=35%35=33
- 解密,(me%n)d%n=335%35=3=m,因此对RSA加密后的密文解密得到的就是原始的明文m
版权声明:本文为博主原创文章,未经博主允许不得转载。