RSA
RSA Algorithem
欧拉函数
\[\varphi(n) = \begin{cases} 1&(n = 1) \\ n-1&(n是质数) \\ p^k - p^{k-1}&(n是某个质数的次方,p为质数 prime 的简写) \\ \varphi(p1)\varphi(p2)&(n为两个互质整数之积) \end{cases}\]任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?) from 阮一峰
其中在 阮一峰 的第三种 case 有错误:
$\varphi(p^k) = p^k - p^{(k-1)}$
当一个数不包含质数 p,才能与 n 互质。而包含质数 p 的数一共有 $p^{k-1}$ 个,分别是
$1$, $1 \times p$, $2 \times p$, $(p^{k-1} - 1) \times p$
最后那个 $(p^{k-1} \times p)$ 是 $p^k$ 本身,不应该包含,而第一个 $1$ 需要包含进去。所以,一共有 $(p^{k-1}-1) + 1 = p^{k-1}$ 个。
分解质因数 和 $\varphi(n)$ 的计算
有了以上的相关前提条件之后,根据 算术基本定理 就能得到一般公式。
\[\begin{align*} n &= p_1^{k_1}p_2^{k_2}p_3^{k_3}...p_n^{k_r} \\ \Rightarrow \varphi(n) &= \varphi(p_1^{k_1})\varphi(p_2^{k_2})...\varphi(p_r^{k_r}) \end{align*}\]其中每一项又可写成如下形式:
\[\begin{align*} \because \varphi(p^k) &= p^k - p^{k-1} \\ &= p^k( 1 - \frac{1}{p}) \end{align*}\]代入公式可得:
\[\begin{align*} \therefore \varphi(n) &= p_1^{k_1} p_2^{k_2} ... p_r^{k_r} (1 - \frac{1}{p_1})(1 - \frac{1}{p_2})...(1 - \frac{1}{p_r}) \\ &= n(1 - \frac{1}{p_1})(1 - \frac{1}{p_2})...(1 - \frac{1}{p_r}) \end{align*}\]Example:
$\varphi(1323) = \varphi(3^3 \times 7 ^ 2) = 1323(1 - \frac{1}{3})(1 - \frac{1}{7}) = 756$
欧拉函数速查表
模反元素
\[当 a 与 n 互质时,b 一定存在,使得 ab - 1 被 n 整除。 \\ ab \equiv 1 (mod\ n) \\ \because a^{\varphi(n)} \equiv 1 (mod\ n) \\ \because a \times a^{\varphi(n) - 1} = a \times b \equiv 1 (mod\ n) \\ \therefore b = a^{\varphi(n) - 1}\]由于模反元素不止一个,所以集合 $b$ 有: $ {b} = b + kn, k \in \mathbb{Z}$
RAS 过程
变量名列表,举个例子
变量 | 含义 | 例子 |
---|---|---|
p | 一个质数,来自 prime 的简写 | 61 |
q | 一个质数 | 53 |
n | 为 pq 相乘 $ = p \times q $ | $3233 = 61 \times 53$ |
$\varphi(n)$ | 根据欧拉定理,由于 pq 都为质数, 所以 $\varphi(n) = \varphi(pq) = \varphi(p) \varphi(q) = (p-1)(q-1)$ | $(61 - 1) \times (53 - 1) = 60 \times 52 = 3120$ |
e | $ 1 < e < \varphi(n) $ 的质数 | 17 |
d | $ed \equiv 1(mod \ \varphi(n)) \to {d} = e^{\varphi(\varphi(n)) - 1} + kn, k \in \mathbb{Z} $ | $17^{\varphi(3120) - 1} mod\ 3120 = 17^{(768-1)} mod\ 3120 = 2753$ |
- 欧拉函数计算器 eulertotientfunction calculators
- d 的计算,由于正常的计算机无法计算出 $17^{767}$,所以,只能用循环处理掉。
// a ^ b mod c function expMod(a, b, c) { let res = 1; for (let i = 1; i <= b; i++ ) { res = (res * a) % c; } return res; } expMod(17, 767, 3120) > 2753
质因数分解困难吗?
- 首先分解质因数不难,给定整数,用试除法一个个试就行
- 但是大整数的分解比较困难,这里的困难是指:没有高效的方式来分解,除了一个个试。
- 那一个个试有多难?有了素数表是否就不难了?
- 有素数表,也只能用试除法,增长是线性的。
- 小于 n 的素数个数约为 $ \frac{x}{lnx}$
- 大的素数表可行吗?
- 基本不可行,如果简单的按 ASCII 码存储
- 一个 1000 位的整数(目前 RAS 通常使用 2048 位),约占 1KB
- 存 1000 个 1000 位的整数就需要 1MB
- 1e6 个 1000 位的整数就需要 1GB
- 1e9 个 1000 位的整数就需要 1TB
- 。。。
- 而我们需要存的是 1e1000 个 1000 位的整数,这个存储是个天文数字
- 基本不可行,如果简单的按 ASCII 码存储
- 参考
- https://www.reddit.com/r/math/comments/2jo786/why_is_the_prime_factorization_of_very_large/
- https://www.quora.com/Why-is-factoring-numbers-into-primes-a-difficult-problem
References
- Symbols: https://kapeli.com/cheat_sheets/LaTeX_Math_Symbols.docset/Contents/Resources/Documents/index
- Math Cheat Sheet: https://jojozhuang.github.io/tutorial/mathjax-cheat-sheet-for-mathematical-notation/
- RSA part one: https://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
- RSA part two: https://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
- Demos
- Online Demo