RSA算法

算法简介

RSA是一种非对称加密方式。发送者把明文通过公钥加密后发送出去,接受者把密文通过私钥解密得到明文。

算法过程

生成公钥和私钥

选取两个质数p和q,n=p*q。n的长度就是密钥长度。

φ(n)=(p-1)*(q-1)

φ(n)为n的欧拉函数。

找到1-φ(n)间与φ(n)互质的一个数 e,将n和e封装成公钥。

d*e ≡ 1(mod φ(n)),将n和d封装成私钥。

加密过程

假设明文为X

密文 Y=X^e mod N

解密过程

X = Y^d mod N

算法的可靠性

上述加解密过程一共涉及6个数字:

n p q φ(n) e d

公钥 n e 私钥 n d。算法的可靠性即在已知 n和e的情况下能否推出d。

ed ≡ 1(mod φ(n)) 只有知道e和φ(n) 才能得出d

φ(n)=(p-1)*(q-1) 只有知道p和q才能得出φ(n) 

n=p*q 只有将n因数分解 才能得到p和q

算法可靠性在于n因数分解,由于大数的因数分解是指数级别复杂程度,所以保证了加密算法的可靠性。

由RSA算法中大数因数分解复杂程度的延伸

大数分解因数为何困难

分解因数是把合数分解为非平凡解(非平凡解:排除1和本身的质因数)。

常规的因数分解 就是判断这个数能否被某一个质数整除,即 a%b==0。

求余的过程其实是用到了除法。除数较小的情况下,求余不是难事。但是当除数很大时,类似高精度除以高精度,除法的效率就不那么高了。

个人认为,计算机在处理大数的除法效率问题导致了大数分解因数困难。

计算机是如何处理除法运算

计算机的四则运算

传统的数学思维里并不能直接用在计算机的四则运算中,例如加法,13+29=42,传统思维直接对位相加,有进位再加上进位。这种思维对应计算机的处理就要用到异或运算,与运算,和左移运算。

13 的二进制 0000 1101 

29 的二进制 0001 1101

异或运算 :处理0+1的情况

​ 0000 1101 ⊕ 0001 1101 = 0001 0000  ①

与运算:处理1+1的情况,有1代表需要进位,

​ 0000 1101 & 0001 1101 = 0000 1101 

左移运算:非全0就需要左移

​  0000 1101 << 1 =  0001 1010  ②

用 ①、②重复异或运算、与运算、左移运算

0001 0000  ⊕   0001 1010 = 0000 1010  ③ 

0001 0000 & 0001 1010 = 0001 0000 

0001 0000 << 1 = 0010 0000 ④

处理   ③  ④

0000 1010  ⊕ 0010 0000 = 0010 1010 ⑤ 

0000 1010 & 0010 0000 = 0000 0000 ⑥

因为⑥结果全为0,所以 ⑤ 就是最终答案。 ⑤ 转为10进制即2^5+2^3+2^1 = 32+8+2=42
计算机除法结论

减法就是用补码参与加法运算,乘法就是多个加法运算,本次讨论的除法就是不断地减法操作。所以大数的除法就涉及到不断地异或、与、左移运算导致运算复杂程度升高。

本文由 mdnice 多平台发布

你可能感兴趣的:(后端)