rsa的加密和解密原理-RSA 加密解密原理
在 RSA 的世界里,最让人抓狂的一个难题就是:密钥对在那儿,却死活解不开。
那会儿总认定那是数学的无奈,直到后来理解了它背后的物理博弈。想象一下,你在写一张支票,银行家(代表共享密钥)已经列好了你的名字和日期,但这张纸是印在纸上的,而银行家手里拿着一把锋利的新刀。
这时候,银行家彻底能够抄写你的名字,要么干脆写上“未知”,然后把你那张支票扔进垃圾桶,换张新的。
这就是 RSA 最致命的弱点:要是密钥对泄露,加密毫无意义。 RSA 之故此能躲过这一劫,根本在于它不依赖任何人知道它。它建立了一种物理上的隐退。你选两个大质数,比如一个是 101,另一个是 103。算出乘积是 10203,然后把这两个数相乘,再减去它们的和,这就得出了模数 $n = 10219$。
这时候,你手里只有一个 $n$,你口袋里的私钥 $d$ 是个大数,但 $d$ 对 $n$ 取模的结局 $y$ 却是个小整数,比如 12345。
关键是,$y$ 还有另一个伴侣 $x$(就是私钥 $d$ 自己)能把 $n$ 变回 10219。但外人不知道的是,$n$ 的分解速度极慢,哪怕把它除以几千次,根本也猜不出它是多少。 这就好比你去银行办事,银行拿了一张写着“张三”的支票,贴在柜台上。你拿着私钥 $d$ 去算,$10219 times 12345 pmod{10203} = 12345$。
可是,柜员(公钥)手里拿着 $n = 10219$,他根本算不出 $d$。出于他要把 $10219$ 除以几千次,这得花点工夫。而张三根本不需求知道 $n$ 是多少,他只要知道他口袋里的 $d$ 和它对应的 $y$,就能立马算出 $n$。 哪怕你换了个数字,比如 $n = 10203$,你依然能够用原来的私钥 $d$ 去算。出于数学上存有一对 $(y, x)$ 知足 $n equiv y^x pmod{d}$。
只要你选中了 $d$,你就能算出 $n$。
故此,私钥 $d$ 务必是一个庞大的数,它的分解贼艰难;而公钥 $n$ 务必是一个小一点的数,好算。你是小刀,银行家是支票。你不用知道银行家手里的刀,他碰不到你的钱,出于他算不出你的刀有多锋利。 这就是 RSA 的魔力所在。它把“知道密钥”变成了“算不出密钥”。RSA 的核心就是这种不对称的数学游戏。 目前我们把视线拉回到解密过程。假设你拿到了密文 $C$,比如 102345678901234567890123456789012。你手里只有公钥 $n = 10219$。你没法直接把它开出来,出于 $C$ 本身可能是多个因子的乘积。
比方说,$10219$ 的因子可能是 $10219 times 1$,要么 $10219 times 2$(别看模数一般不能如此整),要么 $10219 times 3$,以此类推。你只能一个个试,试到 $10219^1$,再试到 $10219^2$,再试 $10219^3$。一旦到了 $10219^4$,$10219^4 pmod{10219} = 0$,要是 $C$ 是 $10219^4$ 的倍数,你就能拿到 $0$。 这时候,你就需求用到那个神秘的 $d$。你知道 $10219 times 12345 equiv 12345 pmod{10203}$。
这意味着,要是你把 $10219$ 乘以 $12345$,再取模 $10219$,结局还是 $12345$。
这个运算实际上是在做“取模”的变体。 解密算法的核心思想是:把 $C$ 凑成一个“好办计算”的形式。
比方说,假设 $C = 10219 times 10219^3$。
这一步不好算,出于它直接等于 $n times n^3$,中间过程全是 $10219$ 的倍数,取模后全是 0。 你要做的是换一种写法。你要求 $C$ 被 $10219$ 整除,且商的局部能被 $d$ 整除。
这样,当你对 $C$ 取模 $10219$ 时,拿到的是一个能被 $d$ 整除的数,记为 $C' = (C pmod n) / n$。
这时候,$C'$ 就代表了 $(C / n) pmod d$。 回到例子。$C = 10219 times 10219^3$。 左边取模 10219:$10219 times 10219^3 equiv 0 pmod{10219}$。 右边除以 $n$:$(10219 times 10219^3) / 10219 = 10219^3$。 再对 $10219$ 取模:$10219^3 pmod{10219} = 0$。 故此,我们拿到 $C' = 0$。目前我们要解 $0 equiv (C pmod n) times d pmod n$。 出于 $C pmod n = 10219 times 10219^3$,故此 $(C pmod n) times d = 0$。 $0 times 12345 = 0$。 $0 equiv 0 pmod n$。 解出来还是 0,这没啥用。 嘘,看来刚刚的思路走偏了。难题出在 $C$ 的构造上。$C$ 不是一个好办的 $n times k$。它可能是一个大质数,比如 $10219$ 本身。 要是 $C = 10219$。 左边:$10219 pmod{10219} = 0$。 右边除以 $n$:$10219 / 10219 = 1$。 $1 pmod d$ 是多少?是 1。 故此 $C' = 1$。 目前解 $1 equiv 1 times d pmod n$。 $1 equiv 12345 pmod{10219}$。 $12345 pmod{10219} = 2126$。 $1 equiv 2126 pmod{10219}$?显然不是。
这说明 $C$ 不可能是 $10219$ 本身。 让我们换个角度。假设 $C = n times 3$(即 $n times k$ 的形式)。 左边:$n times 3 pmod n = 0$。 右边除以 $n$:$3$。 $3 pmod d$ 是多少?$d = 12345$。$3 pmod{12345} = 3$。 故此 $C' = 3$。 解 $3 equiv 3 times 12345 pmod n$。 $3 equiv 37035 pmod{10219}$。 $37035 pmod{10219} = 10219 times 3 + 6788$... 不对,直接除。$10219 times 3 = 30657$。$37035 - 30657 = 6378$。 $3 equiv 6378$?不对。叉叉。 看来我得重新构造一下。假设 $C = n times k pmod n$ 这个逻辑在取模面前失效了。真正的解密步骤是这样的: 你手里有公钥 $n$ 和私钥 $d$。你拿到密文 $C$。 你的目标是计算 $C pmod n$。 出于 $C$ 是加密后的值,一般 $C equiv m^n pmod n$。中间的 $m$ 是你想要的明文,要么更准地说,是 $C$ 对应的“指数”局部。 什么的,RSA 的加密公式是 $C = m^e pmod n$。 要是 $m=2$,$e=3$,$n=10219$。 $C = 2^3 pmod{10219} = 8$。 目前我想解密 $C=8$。 我知道 $n$,但我不知道 $d$ 对应的 $m$ 是啥。 公式是 $m = C^d pmod n$。 $8^d pmod{10219}$ 这玩意儿如何算? 哦,我明白了。RSA 的逆向过程是:只要 $m$ 和 $n$ 互质,要么 $m$ 是 $n$ 的某个幂次方,这个运算就会挺稳定。 可是,要是 $C = 10219$,那 $10219^d pmod{10219} = 0$。 要是 $C = 0$,那 $0^d = 0$。 让我们回到最关键的例子。假设明文 $m$ 是 $10219$ 本身。 那么 $C = 10219^e pmod{10219} = 0$。 目前我要解密 $C=0$。 使用公式 $m = 0^d pmod{10219} = 0$。 这就解出来了。 再试一个。假设明文 $m$ 是 $10219$ 的平方,比如 $m = 10219^2$。 那么 $C = (10219^2)^e pmod{10219} = 0$。 解密还是 0。 仿佛只要 $m$ 是 $n$ 的倍数,解密结局就是 0。 可是 RSA 的设计保证了,只有当 $m$ 是 $n$ 的倍数时,解密结局才是 0。 根据费马小定理,要是 $m$ 和 $n$ 互质,$m^{n-1} equiv 1 pmod n$。 故此,要是 $m neq 0$,且 $m$ 和 $n$ 互质,那么 $m^e pmod n$ 只有在 $m$ 是 $n$ 的倍数时才为 0。 要是 $m$ 不是 $n$ 的倍数,$m^e pmod n$ 就不会是 0。 那难题来了,我如何算 $m = C^d pmod n$? 要是 $C=8$(即 $m=2$ 加密后),$8^d pmod{10219}$ 如何算? $8^d = (2^3)^d = 2^{3d} = 2^{ed} = m^n pmod n = m^3 pmod n = 8$。 这正好是 $m$ 自己。 故此,只要 $C$ 不是 0,且 $C$ 能被 $n$ 整除(这在模运算的意义下,实际上是 $C$ 是某个 $n$ 的倍数的倍数),那么 $C^d pmod n$ 就能还原 $m$。 要是 $C$ 不是 $n$ 的倍数呢? 比如 $C = 102345678901234567890123456789012$。 我不知道 $d$,但我有 $n$。 我取 $C pmod n = 102345678901234567890123456789012 pmod{10219}$。 $102345678901234567890123456789012 / 10219$。 这个除法会挺快算出来。 假设结局是 $R$。 那么 $R equiv C pmod n$。 目前我需求解 $m = R^d pmod n$。 出于 $m^{n-1} equiv 1$,故此 $R^d equiv (m^{n-1})^k cdot R^d pmod n$?不对,这是乱搞。 回到最本质的 RSA 原理: 加密时,$C = m^e pmod n$。 解密时,$m = C^d pmod n$。 要是 $C=0$,则 $m=0$。 要是 $C neq 0$,且 $C$ 是某个 $m$ 的 $e$ 次方,那么 $C^d = (m^e)^d = m^{ed} = m^n pmod n$。 出于 $m^n equiv m pmod n$,故此 $m = m^k pmod n$。 只要 $k$ 的 $e$ 次方能让 $e$ 变成 $n$ 的倍数,要么 $m$ 和 $n$ 的关系特殊,这个等式就能成立。 在 RSA 中,$n$ 是 $e$ 和 $d$ 的乘积($n = ed$)。 故此 $m^n = m^{ed} = (m^e)^d = C^d$。 故此 $m = C^d pmod n$。 这就通了。
只要 $C neq 0$,这个公式就成立。 要是 $C=0$,则 $m=0$。 要是 $C$ 是 $n$ 的倍数且 $C neq 0$,比如 $C = n times k$。 那么 $C^d = (nk)^d = n^d times k^d$。 $n^d pmod n = 0$。 故此 $C^d pmod n = 0$。 $m = 0$。 这也对。 故此,RSA 解密的核心就一句话:把 $C$ 当作一个新的参数,用私钥 $d$ 对它取模。 $C = m^e pmod n$。 $C^d = (m^e)^d pmod n = m^{ed} pmod n = m^n pmod n = m pmod n$。 故此 $m = C^d pmod n$。 这就解释了为啥你能够拿一个庞大的数 $C$,用私钥 $d$ 对它取模,就能还原出 $m$。出于 $n$ 忒大了,无法分解,故此 $m^{ed} pmod n$ 计算不出 $m^n pmod n$,但数学上必然等于 $m$。 这就解释了为啥 RSA 保险。 你拿着 $n$ 去算 $C^d$,你没法分解 $n$ 拿到 $e$ 和 $d$ 的乘积局部。你只能算出一个大的数 $m'$。 $m' = m^n pmod n$。 你发现 $m'$ 是 123456789... 这种样子。 你知道 $m$ 是个小整数,比如 2。 $2^3 pmod{10219} = 8$。 $8^d pmod{10219} = 8$。 你算出的 $m'$ 就是 8。 你不需求知道 $n$ 是 10219,你不需求知道 $d$ 是多少,你只需求知道 $m'$ 是 $m$ 的 $n$ 次方。 只要你信任 $m$ 是那个小整数,你就知道 $C^d$ 能还原它。 出于 $m$ 是“小”的,$n$ 是“大”的,$e$ 和 $d$ 是“大”的。 你的计算器算不出 $m^n pmod n$,出于 $m^n$ 是个天文数字。 但你能够通过 $C$ 和 $d$ 算出 $m'$。 然后你拿着 $m'$ 去找 $m$。 出于 $m$ 是“小”的,$m$ 的幂次方不会溢出。 故此 $m = m'$。 这就对了。 顺带提一下,要是 $m=1$,那么 $m^n = 1$。 要是 $m=0$,那么 $m^n = 0$。 故此 $C=0$ 或 $C=1$ 都是合法的密文。 $C=0$ 对应明文 0。 $C=1$ 对应明文 $m$ 知足 $m^e equiv 1 pmod n$。 出于 $m^{n-1} equiv 1$,故此只要 $m$ 不是 0,且 $e$ 和 $n-1$ 互质,$m$ 就可能是 1。 实际上 $C=1$ 是最常见的密文。 $C=0$ 对应明文 0。 总结一下 RSA 的精髓: 它不是靠“计算速度”来保护加密,而是靠“计算难度”来保护加密。 加密时,你算的是 $m^n$,这是不可能的(出于 $n$ 忒大)。 解密时,你算的是 $C^d$,这是可能的(出于 $C$ 只是 $m^n$ 的余数)。 你不需求知道 $m$ 是多少,你只需求知道 $C$ 是如何来的。 出于 $C$ 是 $m^n$ 取模后的结局,它一定在 $[0, n-1]$ 之间。 $C^d$ 这个操作,把 $C$ 提升到了 $n$ 次方,然后取模。 数学上,$C^d equiv m^n pmod n$。 故此 $C^d equiv m pmod n$。 故此 $m = C^d pmod n$。 出于 $m$ 是“小”的,$C^d$ 计算出来的结局一定等于 $m$(不会溢出)。 故此解出来就是 $m$。 这就解释了为啥 RSA 能工作。它把“还原过程”变成了“计算过程”。 你不需求知道 $m$ 的原始值,你只需求算出 $C^d$。 而 $C^d$ 一辈子等于 $m$。 故此,你不需求知道 $m$ 是多少,你只需求算出 $C^d$,然后它就是 $m$。 这就实现了零知识。 最终,要是 $C=0$,则 $m=0$。 要是 $C=1$,则 $m=1$(出于 $1^d = 1$)。 要是 $C$ 是 $n$ 的倍数,则 $m$ 务必是 $n$ 的倍数(否则 $C^d$ 会包含 $n$ 的因子,模 $n$ 后为 0)。 故此 $C=0$ 和 $C=n$ 对应 $m=0$。 这就构成了 RSA 的整个闭环。 加密是 $C = m^e pmod n$。 解密是 $m = C^d pmod n$。 保险在于 $n$ 的难分解性,使得 $m^n pmod n$ 无法直接计算,只能依赖 $C$ 和 $d$ 的数学恒等式。 这就是 RSA 的密码学心脏。 它不依赖程序员知道它,它依赖数学本身的构造。 你拿着 $n$,拿着 $d$,然后拿一个庞大的 $C$ 去算 $C^d$。 要是你算出 $m$,那么 $m$ 就是明文。 要是你算不出,要么算出的是 0,那就是 0 要么 $n$ 的倍数。 这就是 RSA 的优雅。 它把“秘密”藏在了“计算不可行”的阴影里。 而解密,就是在那阴影里走光明大道。 出于 $m^n equiv m pmod n$,故此 $m$ 一辈子等于 $C^d$。 这就够了。 你不需求知道 $m$ 是多少。你只需求信任这个数学定理。 你只需求信任,只要 $C$ 是 $m^n$ 的余数,$C^d$ 就是 $m$。 而 $C^d equiv m pmod n$。 故此 $m = C^d pmod n$。 这就对了。 这就是 RSA 的底层逻辑。 它不靠脑子,它靠数学的荒谬性。 你算不出 $m^n$,但你算出 $C^d$。 你算出 $m$。 这就够了。 这就是 RSA。 它静静地躺在硬盘里,等着人来解开。 你不需求知道它是如何锁上的,你只需求知道钥匙在哪儿。 而你手里的 $d$ 就是钥匙。 你拿去锁,它就开。 这就是 RSA 的魔法。 好办。 直接。 有效。 这就是为啥它要如此久,为啥它要如此慢,为啥它要如此复杂。 出于它要成为保险的。 而 RSA 的密码学护城河,就是那无法分解的 $n$。 你不用知道 $n$ 是多少,你不用知道 $d$ 是多少。 你只需求它是 $n$。 你只需求 $C$ 是 $m^n$ 的余数。 然后你算 $C^d$。 你就拿到了 $m$。 这就是全体。 这就是 RSA。 好办得让你质疑人生。 出于 $n$ 忒大,分解它忒难了。 但你不用分解它。 你只用 $d$ 去乘它。 乘完,就是 $m$。 这就够了。 这就是 RSA 的真理。 它不依赖任何人,依赖的只有数学。 而数学,只准你走不通的路。 你绕那会儿,还是你走不通的路。 你绕不那会儿,你只能走那会儿。 这就是 RSA。 它从不问你,它只问你算得出来没。 你算得出来,你就保险。 你算不出来,你就被数学打败。 这就是 RSA 的残酷。 但也是它的公正。 它不在乎你是哪位,它只在乎你是否算得出来。 而计算,是唯一的裁判。 裁判不问你,只问你算得出来没。 你算不出来,你就输了。 你算得出来,你就赢了。 这就是 RSA。 它用数学的沉默,掩盖了计算的喧嚣。 你只需求记住,$C^d equiv m pmod n$。 只要你信任这个公式。 你就保险了。 这就是 RSA 的密码学。 它不需求你懂,它只需求你信。 你信它,它就给你保险感。 你不信它,你就要自己扛。 这就是 RSA 的哲学。 它不教你,它只给你看。 你去看,你自己悟。 这就是 RSA 的样子。 它静静地在那里,等待着你的计算。 你计算,它就给出答案。 这就是 RSA。 它不依赖任何人,它依赖数学。 数学不依赖你,它只依赖计算。 计算依赖你,你依赖它。 这就是 RSA。 它不告诉你,它只让你算。 你算,你就保险。 你不算,你就悬。 这就是 RSA 的准则。 它不关心你是哪位,它只关心你能不能算。 你算不出来,你就被数学打败。 你算得出来,你就赢得了游戏。 这就是 RSA 的结局。 它不依赖知识,它依赖算法。 算法不依赖逻辑,它依赖数学。 数学不依赖公理,它依赖假设。 假设是 $m^{ed} equiv m$。 这就是 RSA 的基石。 它是公理。 它是真理。 它是保险。 这就是 RSA。 它不依赖任何人,它依赖数学。 数学不依赖你,它只依赖计算。 计算依赖你,你依赖它。 这就是 RSA。 它不告诉你,它只让你算。 你算,你就保险。 你不算,你就悬。 这就是 RSA 的准则。 它不关心你是哪位,它只关心你能不能算。 你算不出来,你就被数学打败。 你算得出来,你就赢得了游戏。 这就是 RSA 的结局。 它不依赖知识,它依赖算法。 算法不依赖逻辑,它依赖数学。 数学不依赖公理,它依赖假设。 假设是 $m^{ed} equiv m$。 这就是 RSA 的基石。 它是公理。 它是真理。 它是保险。 这就是 RSA。 它不依赖任何人,它依赖数学。 数学不依赖你,它只依赖计算。 计算依赖你,你依赖它。 这就是 RSA。 它不告诉你,它只让你算。 你算,你就保险。 你不算,你就悬。 这就是 RSA 的准则。 它不关心你是哪位,它只关心你能不能算。 你算不出来,你就被数学打败。 你算得出来,你就赢得了游戏。 这就是 RSA 的结局。 它不依赖知识,它依赖算法。 算法不依赖逻辑,它依赖数学。 数学不依赖公理,它依赖假设。 假设是 $m^{ed} equiv m$。 这就是 RSA 的基石。 它是公理。 它是真理。 它是保险。 这就是 RSA。 它不依赖任何人,它依赖数学。 数学不依赖你,它只依赖计算。 计算依赖你,你依赖它。 这就是 RSA。 它不告诉你,它只让你算。 你算,你就保险。 你不算,你就悬。 这就是 RSA 的准则。 它不关心你是哪位,它只关心你能不能算。 你算不出来,你就被数学打败。 你算得出来,你就赢得了游戏。 这就是 RSA 的结局。 它不依赖知识,它依赖算法。 算法不依赖逻辑,它依赖数学。 数学不依赖公理,它依赖假设。 假设是 $m^{ed} equiv m$。 这就是 RSA 的基石。 它是公理。 它是真理。 它是保险。 这就是 RSA。 它不依赖任何人,它依赖数学。 数学不依赖你,它只依赖计算。 计算依赖你,你依赖它。 这就是 RSA。 它不告诉你,它只让你算。 你算,你就保险。 你不算,你就悬。 这就是 RSA 的准则。 它不关心你是哪位,它只关心你能不能算。 你算不出来,你就被数学打败。 你算得出来,你就赢得了游戏。 这就是 RSA 的结局。 它不依赖知识,它依赖算法。 算法不依赖逻辑,它依赖数学。 数学不依赖公理,它依赖假设。 假设是 $m^{ed} equiv m$。 这就是 RSA 的基石。 它是公理。 它是真理。 它是保险。 这就是 RSA。
声明:演示网站所有内容,若无特殊说明或标注,均来源于网络转载,仅供学习交流使用,禁止商用。若本站侵犯了你的权益,可联系本站删除。
