zoukankan      html  css  js  c++  java
  • Scyther-manual ------BNF

    1、Scyther 协议安全模型的验证实例

           第一部分:  打开协议模型 ,设置攻击变量的参数执行分析

    Scyther  is a tool for the formal analysis o the security protocol under the perfect Cryptography , the result Window shows a summary of ths clamis in the proctol ,and the verfication results .here one can find whether the protocol is  correct , or false, and explanation of the possible outcomes of the verfication process ,most important ,if a protocol claim is incorrect , then  there  exists at  least one attack on the protocol ,  A button is show next to the claim .press this buttom to view  the attacks on the claim .as show in the figure (it's not EtherNet/IP  )  it's  Needham-Schroeder   encryption protocol  。

        

       第二部分: Scyther 的描述性语言语法

        Scyther 使用的描述性语言基于C/Java 语法,可以使用java语法的注释形式,空白的编译的时候会被忽略(提高程序的可读性)标识符说那个字符串+数字+^ 或者 - 

         1、Scyther 核心元素是在文件中的描述的协议定义,最小的一个协议定义如下,定义了连那个协议的角色,括号中可以定义角色的行为。

              protocol ExampleProtocol(I,R) {
                                  role I { };
                                role R { }

                        };

                很多安全协议依赖随机生成的值,我么可以在一个角色中使用 fresh 关键字声明一个类型为Nonce的随机变量 Na

              role X (...){

                 fresh Na : Nonce;

              send_1(X, Y, Na);

             }

            代理可以使用变量来存储接收到的术语 ,列如我们收到一个临时变量 Na ,定义如下(变量一定要初始化,在发送事件中)

        role  Y (......){

            var Na  : Nonce;

             recv_1(X ,Y , Na);

            }

    2、任意两个可以构造成一个属于对,可以将属于  x  ,y  写成 (x, y),亦可以使用元祖的便是方式 (x, y ,z) ,在Scyther 中可以解释成((x ,  y), z)。

    对称秘钥:

           任意一个术语可以作为对称加密的秘钥,使用术语 kir 加密  ni 写成  { ni } kir  这样表示对称加密  ,除非kir 被明确的定义成非对称加密术语

       一个对称秘钥的基础是之前定义的 k ( x , y) , 表示 长期在  X 和 Y 之间 同步秘钥

    非对称秘钥:

        公钥基础 PKI 是预先定义的,  sk( X ) 指定一个长期的私钥 X ,同时 pk (X) 指定 表示对应的公钥

         比方说: 考虑到    {ni }pk (I)  术语, 表示使用随机变量 ni 被公钥加密 ,只有拥有 私钥 sk (I) 的代理才能解密

    哈希函数:

        哈希函数式最基本的加密函数,通常使用标识符 hashfunction 定义 一个哈希函数 : hashfunction H1 ;   哈希函数声明是全局的,定义在所有函数的外部。声明之后可以在协议中使用 加密消息   : H1(ni)

    3、预先定义类型

        agent : 表示用来代理的类型

         function : 表示特殊函数,类型与哈希函数 h(x) ,h 代表一种类型的函数体

       Nonce:   一种标准类型, 在 Scyther 中被定义

      Ticket :   类型变量,可以被任何术语替换

    4、用户类型

         可以定义一个新的用户类型 ,使用关键字 usertype

        usertype  MyatomicMessage;

         protocol   X (X, R){

           role I {

                    var y :MyAtomicMessage;

                    recv_1(I, R , y);

            }

      }

      新声明的类型只能使用该类型的消息变量进行实例化。通过定义一个用户类型,建模这可以通知工具变量只能使用该类型的术语进行实例化,而不能使用Nonce 的类型,

      5、事件

        接受和发送事件

           关键字  recv  和   send  分别标记接受和发送消息  (在一些协议中存在 read 关键字,这是过时的语法,可以用recv安全的替代,通常情况,每一个send 事件都会有一个recv 事件匹配,指定每个事件相同的标签

          在某些协议中,我们可能希望直接模拟发送或者接受对手,在这种情况之下没有相对应的事件,如果send或者recv事件 没有响应的事件,Scyther会输出警告,为了抑制警告使用标签进行预处理:如下:

                send_! 1( I ,I , LeakToAdversary) ;

    6、声明事件和安全属性

       声明事件在角色规范中用于建模的预期安全属性。 下面的 Ni 表示被加密 :claim  ( I , Secret ,Ni)   

        一下是预定义的几个关键字:

          Secret  :   此种声明需要参数术语,可以在文档1 中找到资料

           SKR:  

           Alive :    所有角色的活动 在文件4 中定义

           weakagree :    协议的(所有的角色)在文件 4中定义

    7、事假

         Empty :   此声明不会被验证,会被忽略,只有当Scyther 用作其他验证的后端的后端是才会被弃用。

    8、内部计算/模式匹配事件

            在文档1 中定义了两个基本事件,可以模拟 内部计算

            新事件匹配事件,指定模型 : match (pt ,m) 

           在操作的时候,如果存在很好的类型的替换 ,该事假可以执行,后续的执行过程中将会替换

           

          此事件可以模拟各种模型构造,如等量测试,延迟解密、会话检测、除此之外还能用在内部模型计算指定:

            Var X: NOnce;

            Var Y;

            recv(R,I, X);

            match(Y, hash(X,I,R));

            send(I,R,Y {Y}sk(I));

    在上面的列子中,我们使用   hash (X,I,R)替换了 Y ,

    9、不匹配事件

          第二种事件是不匹配事件   ,表达方式: not match(pt,m),不匹配事件和前面的匹配事件正好相反,如果么有可以替代的 如下替换的变量,则事件可以执行。

    这种事件可以用来建模,例如,不平等约束、执行模型通过代理执行会话,在一些情况下,我们希望执行这种行为,但是协议不允许。列如:

        role  A {

          not match(A  B);

          send (A,B, m1);

         }

    模拟一个角色,其实例向其他代理发送消息,最高级的用法就是 匹配和不匹配同时在两个角色中一起使用,常见的实例是模拟 if  ....then......else 构造中。

    10、角色定义

          角色定义事件序列:声明、发送、接受、或者生声明事件

           role Server {

                 var   x ,y z :Nonce;

                  fresh n,m:    Nonce;

                  send_1(Server, Init,  m  , n);

                  recv_2(Init, Server, x, y { z}pk(Server)  );

            }

     11、协议定义

        协议定义将一系列的角色作为参数,在协议体中定义

         Protocol MyPrrot(Init, Resp, Server){

         role Init  {

                  ........

              }

         role Resp {

              ............

        }

          role Server {

              ..........

                }

           }

    12、帮助协议

        在相应的协议前面加上@符号表示  渲染输出图的时候使用,目的是将协议标注为 “helper protocol ”, 此类协议通常用于描述对手能力,在渲染输出的时候,Scyther 收拢实例角色帮助协议折叠成单个节点,这样能够使得图像更加具有可读性。

     13、对称---角色 协议

            协议注释成对称协议角色,这样指导Scyther工具使用适当的伙伴关系

            symmetric-role protocol MyProt( Init ,Resp)

    {

    role Init  {

                  ........

              }

         role Resp {

              ............

        }

          role Server {

              ..........

                }

    }

    13、全局声明

            在很多应中使用全局常量, 包括 字符串常量、标签、协议标识符,他们的建模和使用方式如下:

           usertype  String ;

           const  HelloWorld : String;

           Protocol hello (I, R){

          role I {

             send_1(I,R, Helloworld);

         }

          role R{

              recv_1(I,R,HelloWorld);

    }

    }

    14、宏定义

          使用缩略对特定的术语,语法如下:

             macro  MyShortcut=LargeTerm;

    比方说一个协议中存在复杂的消息或者大量重复的元素,宏定义可以简化协议规范

          hashfunction h;

         protocol  macro-exmaple-one (I, R){

         role I{

         fresh nI: Nonce;

         macro m1=h(I,ni);

         send_1(I,R {m1}pk(R));

         claim(I,Select, m1);

         }

         role R{

         var X: Ticket;

         recv_1(I,R,{X}pk(R));

       }

       }

    宏具有全局范围, 并在语法级处理,这也允许协议消息的全局缩写:

        hashfunction  h;

      macro m1={I,R,nI,h(nI,R)} pk(R);

      protocol marco-example-two(I,R){

        role I {

         fresh nI:Nonce;

         send_1(I,R,m1);

         }

         Role R{

         var nI: Noce;

          recv_1(I,R,m1);

    }

    }

     在上面的代码中 nI 是角色  I 中一个新生成的nonce ,角色R  中的一个变量,因为宏定义在语法上展开,相同的宏可以涉及两个术语。

    14、include 导入外部文件

            include "filename"

    15、one-role-per-agent

             操作语义允许代理执行任何角色,甚至可以并行执行多个不同的角色。 此建模选择对应于最糟糕的情况,其中攻击者可以利用最多的选项。 但是,在许多具体设置中,代理只执行一个角色。 例如,该组服务器可以与该组客户端不相交,或者该组RFID标签可以与该组读取器不相交。 在这种情况下,我们不需要考虑利用代理可以执行多个角色的攻击。 这可以通过以下方式建模:

        option "--one-role-per-agent";// disallow agent in mutiple roles

     这将会引起Scyther 工具忽略代理执行多个角色的攻击,换句话说,这对一个每个角色由一组专用的代理执行情况。

    16、语言 BNF

        -------  输入文件:

                一个输入文件时一系列spdl 结构, 是一种全局定义护着协议描述

           <spdlcomplete>::==<>spdl{';' <spdl>}

        <spdl>::=<globaldeclaration>

          | <protocol>

       -------- 协议定义:使用基于角色的方法描述一个角色, 比方说 一个协议 n3  现在在协议中定义一个角色  I 。我们可以使用 n3.I  调用该角色

     <protocol>::='protocol' <id>'(<termlist>') '{'<roles>'}' ['; ']

       ...............角色

         <roles>::=<role>[<roles>]

           | <declaration>[<roles>]

         <role>::=['singular']'role'<id>'{' <roledef>'}' [';']

          <roledef>::=<event>[<roledef>]

           | <declaration> [<roledef>] 

    ---------------事件

          <event>::'recv'<alble>'('<front>','<termlist>')' ';'

          |' send' <lable> '(' <front> ',' <termlist> ')' ';'

          | 'claim' [<lable>] '(' <from> ',' <claim> [ ',' <>trmlist] ')' ';'

          <lable>::='_' <term>

         <form>::=<id>

          <to>:==<id>

           <claim>:==<id>

    ------------------------------声明

           <globaldeclatration>::=<declaration>

          | 'untrusted'  <termlist> ';'

           | 'usertype'< termlist> ';'

          <declaration>::=['secret'] 'const' <termlist>[':'<type>]';'

            | [secret'] 'fresh' <termlist> [';'<'termlist>]';'

            | 'secret' 'var' <termlist> [';' <termlist>]';'

            |'inversekeys' '(' <termlist>';' <termlist>')' ';'

            |' compromised' <termlist>';'

             <type>::=<id>

             <tupelist>::=<type>{'.' <type>}

    ...........................条款(Trerms)

               <term>::=<id>

                |'{' <termlist> '}' <key>

                | '(' <termlist> ')'

                 | <id> '(' <termlist> ')'

              <key>::=<term>

               <termlist>::=<term>{',' <term>}

    17、安全协议建模

          介绍:在Scyther工具直接破那个分析正确的安全协议要掌握基本的模型符号:在文档1中有详细的说明, 符号分析主要集中在下面的几个方面:

                *  : 协议中的逻辑消息组件以及预期功能 (公共对抗秘钥,每次运行的新生成的,或者常亮)

                *: 消息结构   (配对 加密  签名   哈希)

                 *:  消息流   (顺序、 参与代理)

    18、 Needham-Schroeder public Key    协议形式化安全分析

                 首先添加描述这个协议   采用注释的方式 描述这个协议:

         /*******

         *  Needham -Schroeder  protocol

            ******  *****/

       这个协议用两个角色,触发角色I  和响应角色  R  , 使用单独的一行进行简单的备注

            // the  Protocol  description  

              protocol   ns3(I,R){

               //// Scyther 的工作是基于角色的描述,首先建立发出(触发)角色,这个角色有两个值, 临时创建两个 

           role  I {

               fresh  ni:Nonce ;

               var    nr: Nonce; 

            ////此处为协议通信建模   该协议存在三个消息,发起者发送第一条和最后一条消息,send 和recv 关键字末尾的标签,这些仅用于消息序列图中;链接箭头的信息。

              send_1(I,R,{I, ni}pk(R) );

              send_2(R,I{ni,nr}pk(I) );

              send_3(I,R,{nr}pk(R) );

              ///    这里检查生成和接受到的 nonce ,着这里我们检查协议的保密性而非同步性

              claim_i1(I,Secret,ni);

              claim_i2( I,Secret ,nr);

              claim_i3(I,Niagree);

              claim_i4(I,Nisynch)

             } /////综上完成冷发起角色的规范

       /// 下面是消息接受者的角色,不同于发起者角色的是:

    ////  第一 : 关键子  var和 fresh 交换位置 ,  ni 是由 I 创建的,并创建值,但是对R来说 接受到的是一个变量,

    /////第二:   关键 send 和 recv 交换了位置 

    //////第三  :  声明必须有唯一的标签,因为想现在已经改变,所以执行声明的角色是R不是 I

    //////响应者完整角色描述如下:

                  role R{

                   var ni : Nonce ;

                   fresh nr: Nonce ;

                      recv_1( I,R {I ,ni}pk(R) ) ;

                      send_2(R,I,{ni,nr}pk(I) );

                       recv_3(I ,R.{nr}pk(R) );

                       claim_ri(R,Secret,ni );

                        claim_r2(R,Secret,nr );

                          claim_r3(R,Niagaree);

                          claim_r4(R,Nisynch);

                          

      }

             } ///Needham-Schroeder 全部的协议会在  附录1 中给出

             

     第八章、使用Scyther 工具的 GUI界面

                 Scyther工具有两种主要的方式,图形界面和命令的形式,下面说明使用Scyther 的GUI 如何输出,验证 Needham-Schroeder 公钥协议结果如下图所示,  发起角色 n3 ,I  对 无限次的运行时正确的。这个响应的声明都是错误的, Scyther 报告在思想声明中,至少存在一个错误,在下面的结果图分成几列,

    第一例表示声明的协议,

    第二列显示的角色,

    第三例显示唯一的声称表示,

    第四列显示声称的类型和声明的参数,

    第五列显示给出了验证过程的实际结果,当声称是错误的他显示Fail ,声称是正确的显示 OK。

    第六列完善了前面的陈述,如果显示verified 这个声明是正确的,如果显示Falsified ,则声明是错误的,如果这个列显示是空 的,这时声明 fail/OK 取决于指定的边界设定

    第七列 用于进一步解释结果的状态,每个包含一个句子:详细解释如下:

             *** at least X attacks  -------状态空间中找到攻击,因为不可判定性原因,或者搜索的分支或者结构,不能够确定时候还存在其他攻击

                                                

                                                                    Finger                Scyther results for the Needham-Schroeder protocol

          ***在默认的设置下 Scyther找到攻击后会 停止验证进程,

          ****** Exactly X attacks : 在状态空间内,存在确定的几个攻击变量 ,没有其他攻击

        ******* At least X pattern

         ******* Exactly X pattern :状态抵达,发生在不可达声称中,发现的状态不是真正的攻击 ,而是抵达状态

        ******* NO attacks within bounds :在绑定的状态空间没有发现攻击,但是约束空间外可能存在攻击

          ****** NO attacks :在绑定的状态空间没有发现攻击,并且可以构造证明即使在状态空间外,这样就证明的协议的安全属性。

    注意的是:由于算法的性质,即使在有界的状态也能得到这样的结果

    第   8.2 限制状态空间

              验证时间通常会随着最大运行的数量呈现指数的增长形式。

         8.3 攻击图

              每个垂直轴表示一个运行(一个协议实例角色)  ,如此图,我们看到涉及到两个运行,每一个运行的开始都是从一个菱形的方框开始,这代表了一个确定的运行,用于提供相关的运行信息,在运行的左手边是攻击信息,

            每次运行都分配一个标识符 (此处是1),这个编号随意的,为了区分不同的运行,此处协议中的R角色,,通过Agent1代理执行,认为在和Agent2 进行通信,但是要注意的是,运行 2 由 Agent2 代理,但是  这个代理并不认为他和Agent1进行通信。  

          在右边的运行中可以看到这个运行的实例角色是 I ,从第二行可以看出哪个代理正在运行,以及正在和哪个通信,在这例子中,运行执行代理是 Agent2  ,认为响应角色被执行被不信任的代理  Agent3

          除此之外,运行头包含新生成的值(run 1  生成了值  nr#1)和信息在实例上局部变量(run  1 实例 的变量  ni  和 Nonce  ni#2 或者 run2 )

         

       8.2.3  事件信息通信

        Sned 事件表示发送消息,第一个send  发生在攻击中是第一次发送事件想 run2 ,  send_1(Eve ,{Agent#0 ,ni#2}pk(Eve) )

        每次当消息发送的时候,攻击者都可以有效的获得,在这种情况之下,因为攻击者一已经知道了代理 Eve 的私钥 sk(Eve)   ,能解码消息同时学习 nonce   ni#2的值,

        接受事件对应着成功接受消息。第一个接受事件能够发生在攻击中是第一个接受到的事件。recv_1(Agent#0,{Agent#9,ni#2)pk{Agent#1))

        传入箭头不表示发送消息,相反表示一个排序的约束,只有在发生其他事情的时候才会接受到消息,在种情况之下,我们看到当  run 2 发送初始化消息的时候信息才会被接受。原因是 这个nonce ni#2   ,攻击者不能预测这个nonce  ,这样只能等到  run 2 产生 它.

           在图中,链接箭头是红色的,并且有一个标签匹配,这是由于发送的消息和接受的消息不匹配的缘故造成。

    第九章: 使用Scyther 的命令形式

             所用 Scyther GUI 能够提供的功能  Scyther 的命令行形式也可以实现,除此之外,命令行形式提供额一些功能当前不能使用GUI 来实现,    取决于你是用的操作系统,  Scyther的工具的米目录包含下面的执行文件

              Scyther/scyther-linux

              Scyther/ scyther-win32

              Scyther/scyther-mac

    在上面的列举中,我们假设linux版本的使用,如果你想使用不同的版本,

    第十章   高级主题

           *******   非对称秘钥典型的模型有两种在哪个函数,一个函数映射代理到公钥,另一个函数映射代理到私钥,一般来说,每一个代理都有一个密钥对   public / private  pair(排课(x),sk(x)),建立非对称秘钥,首先定义两个函数,pk2 加密公钥,sk2加密私钥。

           const pk2:Function ;

           sercet sk2: function;

    也可以声称这个函数代表非对称密钥对   inversekeys(pk2,sk2) ,如果按照这种方式定义,使用pk2(X)加密的术语只能使用sk(x)解密

       ********近似等式理论

               Scyther

    建模时间戳和全局计数器

        Scyther的底层协议模型目前不支持在代理运行之间共享的变量。

    Scyther 界面汉化

       

        Scyther 工具的有事之一是可以有针对性的对目标属性进行形式化藐视,无论是某一个变量的机密性,还是某主题对另一个主体的认证性,用户可以灵活的对目标属性进行描述,Scyther工具还可以针对用户感兴趣的安全属性进行分析和验证, 目标属性的藐视吧通过该claim事件完成,利用claim事件可以对角色的认证性、变量的机密性进行描述


         

         

              

     

            

           

        

         

        

           

  • 相关阅读:
    在C语言中实现面向对象(2)
    OpenGL编程轻松入门之一个简单的例子
    用C结构体来实现面向对象编程,ti xDAIS标准算法就这么搞的(1)
    用C语言显示汉字的演示程序
    VC内存溢出一例 –- 调用约定不一致
    图像的熵、灰度平均值、灰度中值、方差
    Wellner 自适应阈值二值化算法
    对比度保留之彩色图像去色算法---基础算法上档次。
    dm8127-内存分配
    真要救经济,就应该放掉房地产,减税
  • 原文地址:https://www.cnblogs.com/xinxianquan/p/10506950.html
Copyright © 2011-2022 走看看