zoukankan      html  css  js  c++  java
  • 从数学到密码学(二)

    对称密码体制是如何满足上述要求的

    一、通信内容保密--对要传输的数据进行保护,让其他人无法看到/知道

        思路                  类比                 初级示例(高级示例请参见DES、AES算法)
        A要向B发送一个机密的消息                 A要给B寄一份秘密的信件                 A向B发送的消息是字符串:Love(ASCII表示为 0x4C 0x6F 0x76 0x65)
        A、B事先共享一个密钥                      A、B各有一把相同的钥匙                  A、B共享密钥也是字符串:Love(这里取最简单的例子,即消息与密钥相等)
        A发送消息前先用密钥处理一下             A写好信后用钥匙锁上箱子                 A发送前将密钥与原始消息逐位进行异或,得到的结果为 0x00 0x00 0x00 0x00
        A发送处理后的消息(不同于原始消息)  A再把箱子寄给对方                          A将4字节0x00发给B
        接收方用共享的密钥处理收到的消息       B收到后用另一把相同的钥匙打开箱子   B收到后,将结果与共享密钥进行位异或
        B得到原始消息                                 B得到原始的信件                            B得到恢复后的字符串Love

        说明:

        1、异或的概念请参见C语言教程
        2、基本术语:发送前的原始消息称为明文,A用密钥处理明文的过程称为加密,加密明文得到的结果称为密文,B用密钥从密文中还原出明文的过程称为解密

           换句话说,明文经过加密得到密文,密文经过解密得到明文
           从数学角度上讲,明文与密文之间必须具有一一对应的关系(想想为什么?)

    二、数据的完整性--能够验证接收到的数据在传输过程中是否被修改(包括有人恶意修改、通信信道产生的自然干扰)

        在上例中,如果B收到的内容变成 0x00,0x00,0x00,0x01,则B无法判断(密文)是否被修改。

        要想检测收到数据的完整性,通常需要通过其它手段加以保证(后面会涉及)。
        PS:IEEE 802.11协议(又称为WiFi)中的无线加密协议WEP就是采用异或操作来保护明文,但是加上了密文的完整性校验机制。

    三、事前身份认证--正式传输(机密)数据前,能够确认当前正在与我通信的对方确实就是我期望与之通信的人,即对方不是假冒的

        能够明确的是:如果需求二(即数据的完整性)能够得到保证,则身份认证也可以得到保证。

        假设A和B共享了密钥K(没有第三人知道),A为了验证远方正在与之通信的人确实就是B,用K加密一个问题“浙江的省会是哪个城市”,发给B
        B收到后解密得到问题(即明文),再用K加密答案“杭州”并发回给A,A解密B的答案得到明文“杭州”。至此,A可以验证对方就是B。

        分析:对方的答案解密后正确,说明他(她)知道原始问题,这需要知道正确的密钥(随便用一个密钥解密A发出的密文,得不到正确的问题)
              而除了A外只有B知道密钥,所以对方只能是B。

        基本术语:A与B之间为了达到某个特定的目标,共同执行的明确的规定或规则,称为协议。
                  上述例子中,规则就是:A加密提问,B加密回答,其目标是:A确定B的真实身份,因而称为身份认证协议,简称认证协议

        说明:为了保证安全,每次A认证B的时候,提的问题都不能与前面重复,否则会面临重放攻击。
              设想一下,有个坏人E想冒充B,如果A每次认证B时都问相同的问题,则E只要偷偷截获B的答案(注意是密文哦)
              然后在下次A认证B的时候,E把B的答案提交给A,使A误信E为B,达到欺骗A的目的。

        PS:密码协议需要经过精心设计,才能保证充分的安全。

    四、事后对方不可抵赖--当前通信结束后,可以给出明确的证据证明对方参与了本次通信,使对方无法否认或抵赖

        不能做到。因为双方共享相同的密钥,都可以伪造通信记录(密文),第三方无法分辨。

    对称密码体制引出的问题:

    1、密钥如何在通信双方间共享

       如果A,B相互认识,则A事先选择好一个密钥,然后通过可信途径(比如给B打电话、发手机短信等)通知对方。
       确切地说,这称为密钥的分配(或分发)

       如果通信双方是陌生人呢?如何通过不安全的信道在陌生人之间共享密钥?(双方事先不认识,所以没有对方的可信的联系方式)

       数学家已经给我们找到了办法,后面会作介绍。

       PS:陌生人之间需要安全通信的典型例子:在京东商城上购买电子产品。

    2、密钥维护:A与n个人通信需要n个密钥,n越大,维护越困难(要区分、保存多个不同的密钥)

    3、密钥的安全需要双方同时保证,密钥安全性不完全可控

       一方泄露密钥,另一方只能放弃此密钥,且无法判断密钥是被对方故意泄露还是被黑客盗取?(从某种角度讲,不信任是密码学产生的土壤)

       从这个角度,我们得到结论:尽量不要使用静态共享密钥(多次使用可能有风险)
       共享密钥最好临时生成(称为临时共享密钥),随用随扔。
       临时共享密钥的一个好处是:如果密钥万一泄露,则仅有被该密钥加密的密文能被解密,其他密钥产生的密文安全性不受影响

  • 相关阅读:
    Java map双括号初始化方式的问题
    Koa 中间件的执行
    JavaScript 实现页面中录音功能
    Koa 中实现 chunked 数据传输
    WebAssembly 上手
    TypeScript `infer` 关键字
    Vim 插件的安装
    MySQL EXPLAIN 语句
    面向切面编程(AOP)
    CSS 类名的问题
  • 原文地址:https://www.cnblogs.com/efzju/p/2115704.html
Copyright © 2011-2022 走看看