Page 238 - 《软件学报》2021年第9期
P. 238

2862                                 Journal of Software  软件学报 Vol.32, No.9,  September 2021

                 密钥导出函数是安全的.
                                                         *
                                                                   *
                 ¾   对 eadk 的 session-key query 查询不影响 eadk ,因为 chello ≠chello;
                                 *
                                                     *
                 ¾   atk,sfk 甚至 atk 的泄露,都不会影响 eadk .
                 因此,攻击者无法赢得 Game 3.
             (5)  Game 4:Earlydata 的真实性和可靠性.该游戏规则与 Game 0 相同,攻击者在该游戏中用随机值代替
                 Sig sk(c) (Hash(Earlydata)).因为用于签名 Earlydata 的密钥 sk(c)和算法是安全的,所以攻击者无法赢得
                 Game 4.也就是说,攻击者可以通过 party corruption 使 s 泄露,并计算出 eadk,进一步得到 Earlydata 的
                 内容,但是伪造 Sig sk(c) (Hash(Earlydata))是困难的,因此保证了 Early Data 消息来源的真实性和可靠性.
             综上所述,优化协议能够防止攻击者伪装成任意客户端伪造 Early Data 消息,从而有效抵抗 KCI 攻击.
         3.3   优化协议的形式化分析

             利用 Scyther 工具对优化后的协议进行分析,这里在编写形式化语言时需要特别注意对签名密钥的描述.
             签名的公私钥对必须具备两条基本属性.
             (1)  在 CK 模型下用于签名的私钥仍然是保密的;
             (2)  签名的公钥是公开的.
             因为 Scyther 对于角色 C 来说只有一个私钥就是 sk(c),为了区分临时私钥和长期私钥,之前在第 2.3.1 节中
         提到了在 sk(c)后加一个随机数的解决方案,也就是用(sk(c),sigx)的形式来表示签名密钥(sigx 为随机数).但是这
         里因为公钥是公开的,那么也就是说敌手必须要知道(pk(c),sigx),而 pk(c)是已知的,所以这种表达方式会让敌手
         得到 sigx,再加上设置了 CK 模型的前提下,C 的私钥 sk(c)也是已知的,那么(sk(c),sigx)同样能够被敌手得知.因
         此,本文使用 sk(c,sigx)来表示签名私钥.经过实验证明:在敌手已知 pk(c,sigx)和 pk(c),并且设置 CK 模型使得
         sk(c)也是不安全的前提下,sk(c,sigx)仍然是安全的.
             根据之前的实验发现:使用“Verify automatic claims”会分析出很多不影响实验结果的攻击路径,不仅降低
         了工具的分析效率,而且很多攻击路径对实验也没有帮助,因此,针对性地在 SPDL 语言中加入 claim 语句.
             •   claim(c,Secret,Earlydata);
             •   claim(s,Secret,Earlydata);
             •   claim(s,Niagree);
             •   claim(s,Nisynch);
             在搜索攻击的设置选项里,选择“Find all attacks”而不是“Find best attack”,以防漏报.观察运行结果,发现所
         有的攻击路径描述的都是同一种攻击,如图 13 所示.
             在一次运行过程中,攻击者截获客户端 Bob(C)的公钥并腐化服务器 Alice(S)得到其长期私钥,计算出这一
         次通信的 eadk,从而得到 Early Data 和对应的签名;在另一次运行过程时,攻击者可以将这两条消息作为 0-RTT
         里面的数据,用这一次通信的 eadk 加密发送给客户端 Bob,完成对 Early Data 的重放攻击.
             具体攻击如下.
             (1)  客户端 C 与服务器 S 正常通信,C 使用此次通信 C 的私钥和 S 的长期公钥计算出密钥 eadk,用 eadk
                 加密在第 1 条消息中发送的 Early Data 以及 Early Data 摘要的签名;此外,C 还需要向 S 发送此次通信
                 C 的公钥;
             (2)  攻击者 A 截获 C 向 S 发送的此次通信 C 的公钥以及加密后的 Early Data 和 Early Data 摘要的签名;
             (3)  A 使用 C 此次通信的公钥和通过腐化参与者获取的 S 的长期私钥计算出加密此次通信的 eadk;
             (4)  A 使用 eadk 解密获得 Early Data 和 Early Data 摘要的签名;
             (5)  在 C 和 S 的另一次通信中,A 可以用步骤(4)中获得的 Early Data 和 Early Data 摘要的签名替换本次通
                 信中的 Early Data 和 Early Data 摘要的签名,完成消息的重放.
   233   234   235   236   237   238   239   240   241   242   243