目录
公钥和私钥的产生:
加密消息:
解密消息:
数论基础:
算法优化:
确保万无一失
数字证书签发和验证流程
签发:
验证:
RSA算法是以数论为基础发展而来的,而数论——或者一些人称之为的算术,是最古老、最纯粹、最有活力、最初等却也是最深奥的数学领域。这门学科具有“数学皇后”的名声绝非偶然。一些最为复杂的传统的数学思想便是由对数论的基本问题的研究发展起来的。早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的思维游戏中。直到计算机诞生之后,几千年来的数论研究成果突然有了实际的应用,这个过程可以说是最为激动人心的数学话题之一。
RSA算法便是那个时代的产物,并且在密码学中拥有绝对的地位
原因很简单:
所以说不管你从哪个方向入门密码学,RSA算法都是当之无愧的经典必学。
密码学不仅仅研究加密解密的数学算法。更多的时候,密码学研究保护信息安全的策略,我们可以称之为“协议”。在已有的数学模型基础上,我们往往忽略具体的数学实现方法,转而专注地研究借助这些数学工具能够构建的安全措施。
接下来来看RSA算法的具体实现过程
假设Alice 想通过一个不可靠的媒体接收 Bob 的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:
假设Bob 想给 Alice 送一个消息,他知道 Alice 产生的公钥。Bob使用事先与 Alice 约好的格式将转换为一个小于的整数 ,比如他可以将每一个字符转换为其数宇形式的 Unicode 码,然后将这些数字连在一起组成整数(假如他的信息非常长的话,他可以将这个信息分为几段,逐段加密)。公钥应用下面的同余公式,将加密为:
即
Bob 算出C 后就可以将它经公开媒体传递给 Alice。
Alice 得到Bob 的消息后利用她的私钥来解码。Alice 可以应用以下的同余公式将转换为:
即
Alice 得到的就是Bob的,因此可以将原来的信息准确复原。
看到这里是不是看懵了,没有系统学过数论的读者也许无法理解其背后的含义,这里先来介绍几个最基本的定理:
现在回头再看一遍是不是清晰很多了,但是以上的均是结论,没有给出证明,读者如果想要了解的话,可以拿任意一本初等数论的书进行精读。
我们现在只记住上面的结论,来看给有意思的问题“如何简化RSA算法的时间复杂度?”
现实中, 和 都是上百位的大数,老老实实的去做乘法,内存迟早要崩溃。怎么办呢?别忘了,“反正最后都要对乘积取余,相乘之前事先对乘数取余不会对结果造成影响”,因此我们可以在运算过程中边算边取余,每做一次乘法都只取乘积除以 的余数。这样一来,我们的每次乘法都是两个 以内的数相乘了。而 是两个质数 和 的乘积。由于 和 都是质数,它们显然也就互质了。因而,如果我们知道分别除以 和 的余数,也就能够反推出它除以 的余数了。因此,在反复平方的过程中,我们只需要保留所得的结果除以 的余数和除以 的余数即可,运算时的数字规模进一步降低到了 和 所在的数量级上。更神的是,别忘了, 除以 的余数是以为周期的,同理处以的余数也是以为周期的。由于余数的周期性现象,计算 就相当于计算 。这样一来,连指数的数量级也减小到了和 、 相同的水平, RSA 运算的速度会有明显的提升。
上述方案让双方在不安全的通信线路上神奇地约定好了密码,一切看上去似乎都很完美了。然而,在这个漂亮的解决方案背后,有一个让人意想不到的、颇有些喜剧色彩的漏洞——中间人攻击。在 A 、 B 两人建立会话的过程中,攻击者很容易在线路中间操纵信息,让 A 、 B 两人误以为他们是在直接对话。让我们来看看这具体是如何操作的吧。建立会话时, A 首先呼叫 B 并索要 B 的公钥,此时攻击者注意到了这个消息。当 B 将公钥回传给 A 时,攻击者截获 B 的公钥,然后把他自己的公钥传给 A 。接下来, A 随便想一个密码,然后用他所收到的公钥进行加密,并将加密后的结果传给 B 。 A 以为自己加密时用的是 B 的公钥,但他其实用的是攻击者的公钥。攻击者截获 A 传出来的信息,用自己的私钥解出密码,再把密码用 B 的公钥加密后传给 B 。 B 收到信息后不会发现什么异样,因为这段信息确实能用 B 的私钥解开,而且确实能解出正确的信息。今后, A 、 B 将会用密码进行通话,而完全不知道有攻击者已经掌握了密码。
怎么封住这个漏洞呢?我们得想办法建立一个获取对方公钥的可信渠道。一个简单而有效的办法就是,建立一个所有人都信任的权威机构,由该权威机构来储存并分发大家的公钥。这就是我们通常所说的数字证书认证机构,英文是 Certificate Authority ,通常简称 CA 。任何人都可以申请把自己的公钥放到 CA 上去,不过 CA 必须亲自检查申请者是否符合资格。如果 A 想要和 B 建立会话,那么 A 就直接从 CA 处获取 B 的公钥,这样就不用担心得到的是假的公钥了。
客户端拿到了服务端的数字证书后,要怎么校验该数字证书是真实有效的呢?
在说校验数字证书是否可信的过程前,我们先来看看数字证书是什么,一个数字证书通常包含了:
至此为止,建立安全的通信线路终于算是有了一个比较完美的方案。在我们日常上网中,也许在不知不觉中就进行了几次RSA算法验证,最经典的例子就是HTTPS基于RSA算法的T LS握手,可见,它直到今天也仍然绽放着光彩。