精华内容
下载资源
问答
  • proverif用户文档

    2018-11-02 08:28:32
    proverif用户文档,ProVerif is an automatic cryptographic protocol verifier, in the formal model (so called Dolev-Yao model). This protocol verifier is based on a representation of the protocol by Horn...
  • Proverif_scripts-源码

    2021-03-07 14:23:42
    Proverif_scripts
  • 1. proverif简介 Proverif用来验证密码协议,密码协议是利用互联网等公共通信渠道进行交互以实现一些与安全相关的目标的并发程序。Proverif是在Dolev-Yao模型下进行密码协议验证的。在Dolev-Yao模型下,攻击者可以...

    1. proverif简介

    Proverif用来验证密码协议,密码协议是利用互联网等公共通信渠道进行交互以实现一些与安全相关的目标的并发程序。Proverif是在Dolev-Yao模型下进行密码协议验证的。在Dolev-Yao模型下,攻击者可以完全控制通信信道,可以读取、修改、删除以及注入消息,攻击者还可以操纵数据,例如:计算元组的莫个参数,使用密钥解密信息。Proverif还将检测不诚实的参与者行为,只有诚实的参与者会被建模。
    Proverif允许密码术语和相关安全性目标以形式化的方式输入,允许自动验证声明的安全性目标。假设密码是完美的,只有攻击者拥有所需的密钥才能执行密码操作。运用对等原理或者重写规则来获取密码术语之间的关系。
    使用Proverif语言,需要分三步,第一步声明;第二步进程宏;第三步主进程。

    2. 握手(handshake)协议描述

    假设client A和server B都有一对公私钥,client A知道server B的公钥(skB)。握手协议的目标就是,client A和server B分享密钥s。client A向server B发送请求,即【A→B:pk(skA)】;server B产生新的对称密钥k作为会话密钥,B把会话密钥和它的身份(pk(skB))相配对,用私钥skB进行签名,即【sign((pk(skB),k),skB)】;再用A的公钥进行加密,即【B→A: aenc(sign((pk(skB),k),skB),pk(skA))】。当client A收到消息后,A用自己的私钥进行解密,验证B的签名使用B的公钥,并提取会话密钥k。

    A→B:pk(skA)
    B→A: aenc(sign((pk(skB),k),skB),pk(skA))
    A→B:senc(s,k)
    

    我们希望这个协议提供三个属性:
    - 安全性:会话密钥只有client A和server B知道;
    - A对B的认证:如果B达到协议的末尾时,它相信已经和A分享了密钥k,那么A确实是它的对话者,也分享了k。
    - B对A的认证:如果A用共享密钥k到达了协议的末尾,那么B提出k供A使用。
    这个协议是不能抵抗中间人攻击的。如果一个不诚实的参与者D和B开始一场会话,那么D随后就可以假冒B和A进行会话。在会话结束后,A认为自己已经和B分享了私钥s,而实际上是和D分享了私钥s。

    3. proverif模拟握手协议

     (*Symmetric key encryption*)
     type key.
     fun senc(bitstring, key):bitstring.
     reduc formall m:bitstring, k: key; sdec(senc(m,k),k)=m.
     
      
     (*Asymmetric key encryption*) 
     
     type skey.
     type pkey.
       
     fun pk(skey):pkey.
     fun aenc(bitstring, pkey):bitstring.
      
     reduc formall m:bitstring, sk: skey; adec(aenc(m, pk(sk)), sk) = m. 
      
      
     (*Digital signatures*)
      
     type sskey.
     type spkey.
     
     fun spk(sskey): spkey.
     fun sign(bitstring, sskey): bitstring.
      
     reduc foamall m: bitstring, skk:sskey; getmess(sign(m,ssk)) = m.
     reduc foramll m: bitstring, ssk: sskey; checksign(sign(m, ssk),spk(ssk)) = m.
       
      
     free c: channel.
      
     free s:bitstring [private].
     query attacker(s).
       
     event acceptsClient(key).
     event acceptsServer(key,pkey).
     event termClient(key,pkey).
     event termServer(key).
       
     query x:key,y:pkey;event(termClient(x,y))==>event(acceptsServer(x,y)).
     query x:key; inj-event(termServer(x))==>inj-event(acceptClient(x)).
      
     let clientA(pkA:pkey, skA:skey, pkB:spkey)=
     	out(c,pkA);
      	in(c,x:bitstring);
      	let y=adec(x,skA) in
      	let (=pkA,=pkB,k:key)=checksign(y,pkB) in
      	event acceptsClient(k);
      	out(c,senc(s,k)).
       	event termClient(k,pkA).
       
     let serverB(pkB:spkey, skB:sskey) =
       	in(c,pkX:pkey);
      	new k:key;
      	event acceptsServer(k,pkX).
      	out(c,aenc(sign((pkB,k),skB),pkX));
      	in(c,x:bitstring);
      	let z=sdec(x,k) in
      	if pkX=pkA then event termServer(k).
      
     process
      	new skA:skey;
      	new skB:sskey;
      	let pkA=pk(skA) in out(c,pkA);
      	let pkB=spk(skB) in out(c,pkB);
      	((!clientA(pkA,skA,pkB))|(!server(pkB,skB)))
    

    4. proverif代码分析

    4.1 声明
    type----类型、free----自由名称、fun----构造函数;自由名称和构造函数可以声明公开或者私有,如果声明为私有,则攻击者无法获取。
    在握手协议中,定义了三种type,分别是key,skey,pkey,sskey,spkey。key是密钥;skey是私钥;pkey是公钥,由skey生成;sskey是签名使用的私钥,spkey是签名使用的公钥,由sskey生成。
    定义了9种函数,分别是senc()【加密函数,使用密钥对明文进行加密】,adec()【解密函数,使用密钥对密文进行解密,与senc()函数的关系使用析构函数进行说明(第5行)】,pk()【公钥生成函数,由私钥产生公钥的过程】,aenc() 【加密函数,使用密钥对明文加密】,denc()【解密函数,使用密钥对密文进行解密,与aenc()函数的关系使用析构函数进行说明(第16行)】,spk()【由签名私钥生成签名公钥】, sign()【使用私钥进行签名】, getmess()【得到签名的明文,与签名函数sign()的关系由析构函数决定(第27行)】, checksign()【使用签名者的公钥,验证签名,与签名函数sign()的关系由析构函数决定(第28行)】。
    第31行定义了公共通信信道c。
    第33行定义了s为私有的,不公开的。
    第34行定义了攻击者想要获取的参数s。
    第36—39行,是为了认证clientA和serverB的合法性,定义了4个事件的发生。分别是acceptsClient(key)【被client记录它已经接受与serveB运行协议并接收对称密钥key】、acceptsServer(key,pkey)【server接受与client运行协议,接收密钥key和client的公钥pkey】、termClient(key,pkey)【client相信它已经终止了一个协议,第一个参数是对称密钥key,第二个参数是client的公钥pkey】、termServer(key)【server相信它已经终止了与client的协议,参数是对称密钥key】。
    client只能和server进行密钥协商,而server可以和多个client进行密钥协商。如果在协议的最后,如果server确认clientA是他的对话者,server只希望A→B的认证保持,所以当pkX=pkA时,执行termServer(x)。
    第41、42行用来实现认证属性的。第41行不是inj-even是因为握手协议不允许client验证收到的信息是否是新鲜的。

    5. ProVerif模拟结果握手协议模拟

    展开全文
  • ProVerif manual

    2018-10-29 20:57:26
    形式化分析工具,可以帮助我们在构建了认证协议后给出我们方案的安全性证明。
  • 一.Proverif的安装与使用 1.首先从 http://prosecco.gforge.inria.fr/personal/bblanche/proverif/ 下载源代码 2.然后解压进入该目录下,使用 ./build命令 注意事项:在执行第二步的时候,需要OCaml环境,具体...

    一.Proverif的安装与使用

    1.首先从 http://prosecco.gforge.inria.fr/personal/bblanche/proverif/ 下载源代码

    2.然后解压进入该目录下,使用 ./build命令

    注意事项:在执行第二步的时候,需要OCaml环境,具体参考 http://blog.csdn.net/aviat0r/article/details/39557295

    3.简单使用

    从命令行进入proverif源代码文件夹,输入

    ./proverif 文件名 

     

     

    二.Proverif Editor的安装(ubuntu条件下)与使用

    以上安装完成后可以使用Proverif,但是这个界面是命令行界面,不是很友好,所以我们可以安装Proverif Editor

    1.Proverif Editor运行条件

      1.1 ProVerif

      1.2 Python (>= 2.6)

      1.3 PyGTK2

      1.4 PyGTKSourceView2 

    2.安装 PyGTK2

    sudo apt-get install -y python-gtk2

    3.安装 PyGTKSourceView2

    sudo apt-get install -y python-gtksourceview2

    4.简单使用

    从命令行进入proverif editor源代码文件夹,输入

    python editor.py

     

    转载于:https://www.cnblogs.com/xiangbin1207/p/7799833.html

    展开全文
  • Windows系统如何安装ProVerif Editor工具下载工具运行需求PythonPyGTK2GTK安装PyGTK安装PyGTKSourceView2 ProVerif是一个强大的协议形式化分析工具,它可以根据输入的pv文件自动分析协议。为了方便研究者编辑应用PI...

    ProVerif是一个强大的协议形式化分析工具,它可以根据输入的pv文件自动分析协议。为了方便研究者编辑应用PI演算,Joeri de Ruiter利用Python语言开发了一款ProVerif编辑器–ProVerif editor。但是,这款工具最近一次的更新已经是2013年4月了,它是用Python2开发的,并且使用的相关库都是比较老版本的,在安装过程中,出了很多错误,所以在这里记录一下如何让这个工具能正常地跑起来。本文参考了为Python添加GTK+库:pygtk(windows下安装pygtk)Making pygtksourceview work in windows两篇文章。

    工具下载

    ProVerif工具下载链接: https://prosecco.gforge.inria.fr/personal/bblanche/proverif/.
    ProVerif editor工具下载链接:https://sourceforge.net/projects/proverifeditor/.

    工具运行需求

    解压proverif_editor,找到README文件,可以看到ProVerif Editor的需求。

    1. ProVerif
    2. Python(>=2.6)
    3. PyGTK2
    4. PyGTKSourceView2 (README中这里写错了)

    Python

    在Python的官网中下载大于2.6版本小于3版本的Python。我最后选择了Python2.7.8,下载地址:https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi. 注意一定要下载32位的Python,因为后面的PyGtk只有32位版本的,与64位的Python不兼容。

    PyGTK2

    GTK安装

    在下载PyGTK前,确保先下载GTK,我下载的是GTK2.24.10_win32,下载地址:http://gemmei.ftp.acc.umu.se/pub/gnome/binaries/win32/gtk+/2.24/gtk±bundle_2.24.10-20120208_win32.zip.

    还需要下载PyCairo,和PyGObject。
    PyCairo下载地址:http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.10.win32-py2.7.msi.
    PyGObject下载地址:http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/pygobject-2.26.0-1.win32-py2.7.msi.
    下载后直接打开安装,会自动找到Python2.7的目录。

    将GTK安装包解压,并将文件的bin目录添加到系统的环境变量中。之后进行测试,在cmd下执行pkg-config --cflags gtk±2.0 ,看是否有报错信息,如果没有,通过命令gtk-demo来验证是否安装正确,安装正确会跳出一个窗口。

    Windows下正常运行PyGTK还需要GTK+ for Windows Runtime Environment,下载地址:http://sourceforge.net/projects/gtk-win/.

    PyGTK安装

    我下载的是PyGTK2.24.0.win32-py2.7,下载地址:http://ftp.gnome.org/pub/gnome/binaries/win32/pygtk/2.24/pygtk-2.24.0.win32-py2.7.msi.下载后直接点击安装,它会自己寻找到你的Python2.7目录。

    PyGTKSourceView2

    我下载的是PyGTKSourceView2.10.1.win32-py2.7,下载地址:http://ftp.gnome.org/pub/gnome/binaries/win32/gtksourceview/2.10/gtksourceview-2.10.0.zip.
    下载后将压缩包解(为方便可以加压到Python目录下),然后将文件的bin目录添加到环境变量中。

    正当我觉得一切任务完成后,在打开ProVerif editor时报错:DLL load failed: 找不到指定的模块,但是报错又不告诉我找不到什么模块,于是我只好一步一步研究。

    最后我找到了PyGTKSourceView2.10的源代码,发现想要运行PyGTKSourceView2,需要glib-2.14.x, GTK±2.12.x and libxml2 2.5.x. 于是我又去找到了这glib和libxml这两个dll进行安装。
    glib下载地址:http://ftp.acc.umu.se/pub/gnome/binaries/win32/glib/2.14/glib-2.14.6.zip.
    libxml下载地址:http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/libxml2_2.7.7-1_win32.zip.
    下载后把这两个压缩包解压,然后将它们的bin目录(其中的dll目录)添加到环境变量中。

    这样python就能正常使用gtk了,最后在使用的过程中,ProVerif editor种的editor.py无法正确导入parser.py,可能是因为和Python本身的包重名了,如果遇到这个问题,改一下parser.py的文件名称和对应的editor.py的导入名称就可以了。

    展开全文
  • ProVerif可以用来自动分析密码协议的Security性质,功能涵盖对称和非对称加密、数字签名、哈希函数、比特承诺、非交互式零知识证明。ProVerif可以证明可达性(reachability),对应断言(correspondence assertion),...

    1 简介

    ProVerif可以用来自动分析密码协议的Security性质,功能涵盖对称和非对称加密、数字签名、哈希函数、比特承诺、非交互式零知识证明。ProVerif可以证明可达性(reachability),对应断言(correspondence assertion),和可观察的等价性(observational equivalence)。这个能力使得它能对计算机安全领域中的机密性和认证性质进行分析,也可以考虑一些新兴的性质,如隐私性(privacy)、可追溯性(traceability)、可验证性(verifiability)。它还具有攻击重构的功能,如果某个性质不能被证明,ProVerif就会尝试构造一个反例trace。

    2 安装

    Windows上可以直接下载一个绿色版的二进制包,解压就能用了。然后为了显示ProVerif给出的攻击,还要安装GraphViz,并且把它的bin目录加到PATH里。

    如果要用交互式的模拟程序,要下载GTK+2.24(里面第一个),然后解压放到C:\GTK,再把里面的bin目录加到PATH里。

    3 命令行操作

    ProVerif的命令行操作总是以这样的格式出现:
    ./proverif   [options]   filename ./proverif \ \ \ [options] \ \ \ \langle filename \rangle

    实际上它能处理多种语言的输入文件(原手册里将这种把协议用这些语言描述成文件的过程叫protocol encode),最常见的一种是.pv文件,这是类型π\pi演算(typed pi calculus)的文件。π\pi演算是为了表达并发过程用通信信道通信而设计的。

    4 有关Reachability的例子

    书写文件simple-reach.pv,如下:

    (* simple-reach.pv: 学习最简单的可达性质 *)
    
    free c:channel.
    
    free Cocks:bitstring [private].
    free RSA:bitstring[private].
    
    query attacker (RSA).
    query attacker (Cocks).
    
    process
      out(c, RSA);
      0
    

    第1行用(**)括起来的是注释。

    第3行定义了一个通信通道,通道的名字是c,这里的free类似于编程语言中的全局变量,在ProVerif里这表示这是一个全局都知道的知识,即攻击者也可以获取,具体到这一行说明通道c是公共的。

    第5行和第6行定义了bitstring类型的变量CocksRSA,它们都是free的,但是用[private]限制了它们无法被攻击者获取到。

    第11行定义了一个进程,第12行是这个进程内的一条语句,表示通过通道cRSA发送出去,第13行的0是进程结束标志(也可以不写这个0和最后一个;)。

    第8行和第9行定义了对性质的查询,需要注意,如query attacker (RSA)在底层实际查询的是【not attacker (RSA)】,即要判断命题【RSA不会被攻击者窃取】是否是成立的。

    运行命令proverif simple-reach.pv,结果如下:

    Process 0 (that is, the initial process):
    {1}out(c, RSA)
    
    -- Query not attacker(RSA[]) in process 0.
    Translating the process into Horn clauses...
    Completing...
    Starting query not attacker(RSA[])
    goal reachable: attacker(RSA[])
    
    Derivation:
    
    1. The message RSA[] may be sent to the attacker at output {1}.
    attacker(RSA[]).
    
    2. By 1, attacker(RSA[]).
    The goal is reached, represented in the following fact:
    attacker(RSA[]).
    
    
    A more detailed output of the traces is available with
      set traceDisplay = long.
    
    out(c, ~M) with ~M = RSA at {1}
    
    The attacker has the message ~M = RSA.
    A trace has been found.
    RESULT not attacker(RSA[]) is false.
    -- Query not attacker(Cocks[]) in process 0.
    Translating the process into Horn clauses...
    Completing...
    Starting query not attacker(Cocks[])
    RESULT not attacker(Cocks[]) is true.
    
    --------------------------------------------------------------
    Verification summary:
    
    Query not attacker(RSA[]) is false.
    
    Query not attacker(Cocks[]) is true.
    
    --------------------------------------------------------------
    

    最开始的{1}只是添加的一个语句标号,没有什么特殊意义,仅仅是因为后面会提到这个位置。每个--后面跟的是一个查询的结果,对于RSA因为没能通过验证,Derivation下会去说明导致攻击的原因(攻击者是如何实施攻击来破坏这个性质的),还给了一个简短的反例trace,即:

    out(c, ~M) with ~M = RSA at {1}
    
    The attacker has the message ~M = RSA.
    

    从最下面的Verification summary中也可以看到,RSA的验证结果是false,也就是会被攻击(因为它被通过公有通道发送出去了),而Cocks不会被攻击。

    5 有关Correspondence Assertion的例子

    这个性质的含义在谷歌上搜的结果如下,大意就是如果通信协议的某个点执行过,那么另一个点一定也在某个时间执行过。

    Correspondence assertions: To a first approximation, a correspondence assertion about a communication protocol is an intention that follows the pattern: If one principal ever reaches a certain point in a protocol, then some other principal has previously reached some other matching point in the protocol.

    例子文件hello_ext.pv如下:

    (* hello_ext.pv: Hello Extended World Script *)
    
    free c:channel.
    
    free Cocks:bitstring [private].
    free RSA:bitstring [private].
    
    event evCocks.
    event evRSA.
    
    query event(evCocks) ==> event(evRSA).
    
    process
    	out(c,RSA);
    	in(c,x:bitstring);
    	if x = Cocks then
    		event evCocks;
    		event evRSA
    	else
    		event evRSA
    

    第8第9行用event关键字定义了两个事件。

    第13行定义了一个进程,第14行是通过通道cRSA发送出去,第15行是通过通道c接受一个数据,放在bitstring类型的变量x中,第16行判断x是否是Cocks,如果是就依次执行刚刚定义的两个event,否则只执行后一个。

    第11行定义了一个查询,意思是如果事件evCocks发生了,那么事件evRSA一定发生。

    运行命令proverif hello_ext.pv,结果如下:

    Process 0 (that is, the initial process):
    {1}out(c, RSA);
    {2}in(c, x: bitstring);
    {3}if (x = Cocks) then
        {4}event evCocks;
        {5}event evRSA
    else
        {6}event evRSA
    
    -- Query event(evCocks) ==> event(evRSA) in process 0.
    Translating the process into Horn clauses...
    Completing...
    Starting query event(evCocks) ==> event(evRSA)
    RESULT event(evCocks) ==> event(evRSA) is true.
    
    --------------------------------------------------------------
    Verification summary:
    
    Query event(evCocks) ==> event(evRSA) is true.
    
    --------------------------------------------------------------
    

    从结果中可以看到这个验证是通过了的,即执行了事件evCocks就一定执行了事件evRSA。实际上在这个例子里evCocks肯定没有执行,可以尝试验证query event(evCocks).,结果(是反过来证not):

    Query not event(evCocks) is true.
    

    参考阅读

    ProVerif的manual第1~2章节

    展开全文
  • Ubuntu18.04 安装Proverif 和Syther_toolProverif安装安装Caml4.05+安装graphviz安装GTK+2.24安装LabelGTK2安装ProVerifProVerif Editor安装Scyther_Tool安装运行 Proverif安装 Proverif官网:链接 以下安装基于官网...
  • 针对可信虚拟平台(trusted virtual platform,TVP)迁移协议缺乏有效的安全性验证问题,引入应用π演算对协议流程及安全属性进行形式化建模,并基于其自动化工具ProVerif对协议的弱机密性、强机密性及实体可认证性...
  • ProVerif的输出比较长,格式如下: 其中[Equations][Equations][Equations]给出了涉及的等式的内部表示。[Process][Process][Process]给出了将所有的进程宏展开之后的进程,在进程里面会看到一些标号为{n}\{n\}{n}...
  • ProVerif验证的加密协议并发程序通过公共通道来进行信息较交互,最终实现一些目标。认为攻击者对这样的通道有完全的控制能力,包括阅读、修改、删除和注入消息,也可以解密自己持有密钥的消息(视解密为获取密文的...
  • ProVerif 1.90.pdf

    2020-06-08 12:34:50
    这是一款用与协议分析的形式化安全分析软件,可以分析协议的安全性,是否抵御多种攻击!欢迎大家交流学习~
  • 软件名称:ProVerif 2.0 系统环境:window 步骤: 1.打开proverif.exe文件所在路径,在该路径(相同文件夹)下,做如下操作: 1.1.新建文本test.txt,并输入一下代码: free c : channel . free Cocks : bit...
  • added ProVerif version 2.01

    2020-12-26 07:42:25
    <div><p>该提问来源于开源项目:ocaml/opam-repository</p></div>
  • added ProVerif version 2.02

    2020-12-25 18:32:18
    <div><p>该提问来源于开源项目:ocaml/opam-repository</p></div>
  • 进程宏(Process Macros)用来定义子进程,因为在用ProVerif对协议进行建模时,直接一个大的主进程比较混乱,进程宏的形式为: let  R(x1:t1,...,xn:tn)=P. \bold{let} \ \ R(x_1:t_1,...,x_n:t_n)=P. let&...
  • proverif_nspk.zip

    2020-12-13 20:24:30
    安全逻辑证明课后大作业作业证明nspk协议,是word版本的。不用再转,直接改就行 唉,怎么摘要要这么多,好累,就想给大家分享一下,好难,怎么还不够
  • Added proverif.1.96pl1

    2020-12-26 07:37:01
    <div><p>该提问来源于开源项目:ocaml/opam-repository</p></div>
  • 一、proverif 的下载与安装 先哭诉下,这个软件的安装可是太不容易了,官网都成这个熊样子了,我以为这里没有安装包了呢,于是全网寻安装包未得又回来看了一眼,妈呀,这杂乱的几乎不知道东西南北的网页里竟然有下载...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

proverif