DAY 14- 《公钥密码》-RSA(2)

"我想不到要讲什麽。"
---

RSA演算法

演算法的准备步骤有五个,更准确来说是四个。
当 Alice 要传讯息给 Bob 时,

依据我们前天所讲的结论是会使用到 Bob 的公钥加密,所以首先要先设定公钥。

设定的步骤如下:

1.选择两个大质数,分别是 pq
2. n = p×q
3. https://chart.googleapis.com/chart?cht=tx&chl=%5Cphi(n)%3D(p-1)(q-1)
4. 选择一个 e ∈{1, 2 , ... , https://chart.googleapis.com/chart?cht=tx&chl=phi(n)-1},使得e 跟https://chart.googleapis.com/chart?cht=tx&chl=%5Cphi(n) 互质。
5.d×e ≡1(mod https://chart.googleapis.com/chart?cht=tx&chl=%5Cphi(n))

举个例子来说,

  1. p = 11, q = 7
  2. n = 11×7 = 77
  3. https://chart.googleapis.com/chart?cht=tx&chl=%5Cphi(35)%20%3D%20(11-1)(7-1)%3D60
  4. 挑选1到59中跟60互质的数,我挑e = 17
  5. 找到 e ( =17 ) 的乘法反元素 d = 53

公私钥

算完以上的数字之後,

https://chart.googleapis.com/chart?cht=tx&chl=k_%7Bpr%7D%3Dd%2C%5C%20k_%7Bpub%7D%20%3D(n%2C%20e)

从上面的例子来说,就是私钥是53,公钥是(77, 17)
将公钥公开,私钥藏好。
要注意只能公开 n 跟 e。
私钥是绝对不能被别人知道的数字,也就是公开的数字必须不能推导出私钥(d)。

来看一下要推导出公钥 d 需要哪些东西。
看到第五步,d 是 e 的乘法反元素,所以要知道 d 是多少就得知道 e 和模数https://chart.googleapis.com/chart?cht=tx&chl=%5Cphi(n)是多少,
e 跟 n 已经被我们公开了,那就要看光有n 的话能不能把 https://chart.googleapis.com/chart?cht=tx&chl=%5Cphi(n) 算出来。

要想算出https://chart.googleapis.com/chart?cht=tx&chl=%5Cphi(n),看第三步就知道,我们需要 p 跟 q。
而昨天解释过了,光是知道 n 是很难推得 p 跟 q 的,
所以公钥的公开并不会威胁到私钥的隐蔽性。

加解密

RSA 的加解密是做指数运算,所有的运算都要 mod n

https://chart.googleapis.com/chart?cht=tx&chl=y%20%3D%20x%5Ee%20%20mod%20n
https://chart.googleapis.com/chart?cht=tx&chl=x%20%3D%20y%5Ed%20mod%20n

我们知道https://chart.googleapis.com/chart?cht=tx&chl=2%5E5%3D32 ,也可以很轻易的推论出https://chart.googleapis.com/chart?cht=tx&chl=2%5E5%3D2%5C%20(mod%5C%205)
但是跟你说https://chart.googleapis.com/chart?cht=tx&chl=2%5Ex%3D2%5C%20(mod%5C%205)要你推回 x 等於多少的话是困难的。
当然如果你推出来的话,那是因为数字很小很方便计算。
我们要加密的东西绝对不是2这麽简单的数字。

另外要看到,
https://chart.googleapis.com/chart?cht=tx&chl=x%20%3Dy%5Ed%20%3D(x%5Ee)%5Ed%3Dx%5E%7Bed%7D%3Dx(mod%5C%20n)
看到最後一个等号必须使用尤拉定理*来证明,
不过可以简单看成是「d 是 e 的乘法反元素」的结论。

*Euler's Theorem : if a ⊥ n, then https://chart.googleapis.com/chart?cht=tx&chl=a%5E%7B%5Cphi(n)%7D%3D1(mod%5C%20n).

数位签章

RSA有数位签章功能,其算法就是将加密演算法倒过来,
用私钥加密,用公钥解密。

https://chart.googleapis.com/chart?cht=tx&chl=s%20%3D%20x%5Ed%20mod%20n
https://chart.googleapis.com/chart?cht=tx&chl=x'%20%3D%20s%5Ee%20mod%20n

其中 s 是签章後的结果,x'则是解密後的解果,
验章的方式是确认x和x'是否相同,
如果相同就认定是本人所签署。
因此签章者必须传送一份签章前的文件供收件者验章。


以上就是 RSA 的介绍,
而实务上 RSA 若要足够安全,建议使用 2048 或 3072 位元的 n。

图片来源:
http://www.quickmeme.com/meme/3u5s2c


<<:  Day 11 - Roman to Integer

>>:  【Day15】[资料结构]-二元搜寻树Binary Search Tree, BST

【资料结构】树的定义与追踪

树的定义 一种存资料的型态,由最初的节点延伸下多个分支,每个分支都个有个自的子分支,分支下可分割成彼...

学习Python纪录Day16 - 使用Matplotlib绘制图表

使用Matplotlib绘制图表 安装matplotlib套件的命令列指令 pip install ...

【Day13】return的妙传得分

当我们在Chrome的console视窗键入如下程序码,执行一个say()的函式,除了consol...

[Day10] TS:什麽!Conditional Types 中还能建立型别?使用 infer 来实作 ReturnType 和 Parameters

今天会来说明 TypeScript 中内建 ReturnType 和 Parameters 的原始...

Day 1 - 前言,写作动机分享与准备事项

去年参加 Software Development 类别的铁人赛,主题为PHP 大师之路 - 开源的...