3年前,我以POJ2447作为切入点介绍了什么是非对称加解密,RSA加解密的步骤。然而RSA为什么可以用两个“风马牛不相及乎”的数字,就能让所有的数字(数据)完成一个轮回(加解密)?为什么在能做到AC POJ2447的情况下,却看不懂OpenSSL公私钥证书的格式?你知道“兔死狗烹”说的是刘邦韩信,那你知道要是刘邦不杀韩信,说不定非对称加解密就是韩信发明的了吗(大雾)?你知道这个世界上最伟大的民科(业余数学家)费马,在写下了“我找到了一个精彩绝伦的证明方法,证明了a^n +bn=cn在n大于2时,没有满足条件的正整数解a、b、c。但是这里空间不够写不下了,我以后再证明。”后,驾鹤西去。后人花了300年的时间,直到上个世纪末才完全证明了,这条被称为费马大定理的猜想是正确的。但是你知道费马还为我们留下了一条费马小定理,在证明的时候,费马同样也用了“精彩绝伦”这样的形容吗?你知道作为RSA算法理论基础的费马小定理,费马真的只用了一行就证明了他的正确性吗?对于奥数学习大家有很多争论,我无意对此做出任何评论。但是学了小学奥数就能找到一种比 Ron Rivest、Adi Shamir、Leonard Adleman在1977年第一次提出非对称加解密论文中的解密算法快3-4倍的算法,如果你学了小学奥数,那你想到了是什么方法吗?
实际上,如果说当前的安全通信体系是武器的话,RSA非对称加解密只能算好钢,要把好钢做成“十步杀一人,千里不留行”的武器,中间又会有什么样的过程呢?这篇文章将会介绍,RSA算法的理论基础,让大家知其然也知其所以然。只有这样,在后续介绍到OpenSSL证书实现方式时,才能游刃有余.
RSA原理与数字证书
// RSA算法伪代码+一个实际例子
#define LL long long
// 首先选取两个素数P和Q
LL P = 601, Q = 997
// 分别计算N=P*Q和T=(P-1)*(Q-1)
LL N = P*Q = 599197
LL T = (P-1)*(Q-1) = 597600
// 寻找一个和T互素的数E。因为素数和任何数都是互素的,所以我们直接选一个素数作为E
LL E = 89
// 寻找一个数D满足公式 (E*D) mod T = 1
LL D = 188009
// 公钥即为 {E,N}={89,599197}
// 私钥即为 {D,N}={188009,599197}
// 假设明文为M,密文为C
// 加密过程为 C = M的E次方 mod N
// 解密过程为 M = C的D次方 mod N
LL M = 386
LL C = (386^89)%599197 = 192403
M = (192403^188009)%599197 = 386
首先我们来做个游戏,游戏的名字叫“我知道你在想什么”,做完这个游戏你会不服。请你任意想一个4位数,比如m=6,996。将m乘以e=19,m*e=6,996*19=132,924=c1,将得到的结果c1的后4位数取出来,构成c=2,924。你不用告诉我你想的数是多少,只要告诉我它经过乘19后的结果的后4位数c,我就能知道你想的是哪个数。不信?我们接着来。将c乘以d=1579,c*d=2,924*1,579=4,616,996=m1,将得到的结果m1的后4位数取出来,构成m=6,996。恰好就是你刚开始想的这个数6,996,是不是有一点点神奇,又有一点不服?
网友评论