转载互联网,作者不详,是一篇好的科普贴。
        我们在互联网上发布和接收着各种各样的信息:浏览网页,发布文章,下载文件,上传视频,网购...... 诸位,我们肯定希望自己接收或发布的信息不被篡改吧?我们肯定不希望自己被钓鱼吧?我们也不希望自己干了吗都被别人看得一清二楚吧?
        很可惜互联网先贤们在设计互联网的时候重点放在连接上了,而没有考虑安全,导致我们所熟悉的互联网到处是漏洞:
        1,信息是以明文的方式传输的,也就是说,路上随便谁都可以看到信息内容;
        2,通信双方没有身份认证机制,随便来个家伙都能冒充其中一方进行通信 (想到钓鱼网站了吗?)
        3,没有对信息的完整性校验机制,导致第三方能随意篡改信息 (例如对下载的软件挂马)
        没办法,后人只能当救火队员了!各种加密算法由此而生,DES,AES,RSA,Diffie-Hellman...... 说起加密,那可是一门复杂的学问,对称加密和非对称加密,各种不同的加密算法,他们各有各的特点,各有各的适用范围。例如对称加密 (加密密钥和解密密钥是同一个) 适合给大量数据加密,多用于维持加密连接;而非对称加密 (加密密钥和解密密钥不同) 适合给少量信息加密,再加上加密密钥和解密密钥不同,多用于在不安全的信道上完成密钥交换建立加密连接。(这只是很简单的介绍,我有空会仔细聊聊,密码学非常复杂)
        大概会有人认为有了加密算法之后就万事大吉了:只要保管好密钥,信息在传递过程中自然不会被第三方得知内容,面对无意义的密文,第三方也无从下手,可以说通信双方是高枕无忧了!
哪有这么美好的事情?
        首先很多时候都没办法事先保管密钥的,例如用户和网站发起连接,请问怎么事先商定密钥?线下商量吗?而如果线上商量,那么第三方就可以制作钓鱼网站,诱使用户落入陷阱。
        还有就是,第三方虽说无法得知通信内容,但照样可以搞鬼:第三方可以在密文中增加或减少几个字符,从而完全改变内容;还可以复制密文,再进行重放 (即重放攻击,例如截取并重放 cookie,可以直接在不知道用户名密码的情况下完成登录,从而偷取账号);也可以把木马加入进去 (特别是下载的时候)。
        而且不仅仅第三方会捣鬼呢。想象一下这样的场景:A 和 B 达成了一笔交易 (B 以一定价格向 A 买了一定数量的货物),A 送去了一条确认信息 (确认 B 花 C 美金买了 D 吨货物),然后 B 就把钱打到了 A 的账户里;可是等 B 向 A 索取货物时,A 赖账了。A 说:” 我从来没有送过什么确认信息。“
        对,A 和 B 的通信一直是加密的,两者事先商量好了密钥。可是当 B 提出了这一点时,A 却说:” 首先,你怎么证明和你商量密钥的是我?而且你也完全可以自己伪造一条确认信息,然后说是我发的。“B 没有办法了。
        如果 A 和 B 有多笔交易,情况会更复杂:A 和 B 正常完成了第一笔交易,但是在第二次交易的时候,货物价格暴涨了。B 不想当冤大头,就故意复制了第一次交易时 A 的确认信息,然后取代了第二次交易的时候 A 发送的确认信息。A 发现不对,就找到 B 说:” 这根本不是我发送的信息!“然后 B 很淡定的说:” 拜托,这就是你发送的好不好?不信你自己看看!“A 发现这信息和第一次的确认信息一模一样,怀疑 B 复制并替代了信息,但是找不到任何证据。
        怎么解决呢?
        首先是双方要都有身份证明 (具体拿什么做身份证明合适以后再说,总之要有身份证明,否则就可以随便赖皮了)
        然后该怎样解决伪造和复制的问题呢?
        对付复制其实很简单:time stamp(时间戳),在每条信息上都打上时间戳,这样就能识破冒充新信息的旧信息了。
        那伪造呢?这就比较复杂了。
        如果采用对称加密,那么有个问题始终解决不了:双方都可以伪造对方的加密信息然后互相赖皮 (如果说双方直接通信的话),除非.....
        老大哥出场!老大哥知道一切,所有人都信任老大哥,这是前提;因为只要有一个人不信任,那就又可以赖皮了。
直接看图吧 [1]:A 是 A 的身份证明,B 是 B 的身份证明,RA 是 A 生成的随机数,t 是时间戳,P 是确认信息内容,KA 括起来的是 A 用自己的私钥         加密的信息;A 将信息传送给老大哥,老大哥解密之后再用 B 和自己的密钥 BB 重新生成信息,其中的 KBB 加密部分是 B 无法解密的。
        A 发送了确认信息之后依旧想赖账,于是就宣称自己没发送过什么确认信息;B 自然不干,于是就把 A 告上法庭。
        法官:”B,你凭什么说这确认信息是 A 发送,而不是你或者其他什么人伪造的?“
        B:” 首先,如果说是我自己伪造了信息,那么老大哥就绝对不会接收到这条确认信息并进行重新处理的。“
        法官:” 老大哥,你接收到了 A 发给 B 的确认信息了吗?
        老大哥:” 查询记录中......... 我接收到了!“
        B:” 我们都信任老大哥,没错吧?时间戳和随机数可以证明这条信息不是复制而来的。还有一点,如果法官大人你还不相信我,那么可以请老大哥解密这条我无法解密的信息 (也就是 KBB 加密的部分)“
        法官:” 老大哥,请解密这条信息。“
        老大哥:”OK...... 解密成功!内容是 A 的身份证明和时间戳以及确认信息的内容!“
        法官:” 这样就可以确定了,这条信息不可能是其他人伪造的 (因为其他人不知道老大哥的密钥,无法伪造出 KBB 部分),A,这条确认信息就是你发送的!不要想赖账。“
        案件关闭。
        听起来很完美,问题在于...... 上哪找这样一个老大哥去?政府?哈,千万别开玩笑,最不能相信的就是政府了!
        那么就只能依靠非对称加密算法 (公钥加密算法) 解决问题了:还是请诸位直接看图 [2],A 先将确认信息内容 P 用自己的私钥 DA 加密,然后再用 B 的公钥 EB 加密,然后发送给 B,B 再用自己的私钥 DB 和 A 的公钥 EA 解密得到 P(图中省略了时间戳,当然还是要有时间戳了)
        现在,我们亲爱的 A 还是想赖账,于是 B 又把 A 告上法庭了。
        法官:”B,你怎么证明这确认信息是 A 发出的?“
        B:” 我手中有用 A 的私钥 DA 加密的信息 DA(P),只有 A 能做到生成这样一条信息,因为只有 A 知道私钥 DA!“
法官:” 我用公开的 EA 解密看看...... 啊,结果是 P,也就是说这的确是 A 生成的信息。A,这确认信息就是你发出的,不要想赖账了!“
案件关闭。
        不过公钥加密算法方案也不完美:A 可以赖账说自己的私钥丢失了,或者 A 更改了私钥而 B 用的是原先的公钥进行解密,结果 B 又没办法了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注