系列文章目录
- 【proverif】proverif的下载安装和初使用
- 【proverif】proverif的语法(本文)
文章目录
前言:proverif-密码学领域中的客观第三方评价工具
在密码学领域,"客观、第三方"评价指标通常指的是对密码学方案、协议或算法进行评估和验证时所采用的一种方法或标准。这种评价方法侧重于通过独立、客观的标准和工具对密码学系统进行评估,以确保其安全性、可靠性和功能性。一般包括:数学证明和分析、安全模型的定义和评估、标准化和认证机构的测试等。
数学证明和分析: 对密码学方案的安全性进行数学证明是一种常见的方法。这确保了方案的安全性不依赖于假设,而是基于严格的数学原理。
安全模型的定义和评估: 通过定义具体的安全模型,并在此基础上评估密码学方案,可以提供一种客观的方式来衡量其安全性。
公开评审和审查: 将密码学方案、协议或算法提交给公开的审查或评审,让来自领域内外的专家进行独立的审查,以确保系统的可靠性和安全性。
标准化和认证机构的测试: 一些密码学方案可能会通过国际标准化组织或认证机构的测试来验证其符合特定的安全标准和规范。
这些方法旨在确保密码学系统经过了全面的审查和评估,不仅仅依赖于设计者的声称或内部测试。这样的方法有助于增强密码学系统的安全性和可信度,从而提供更可靠的安全保障。
ProVerif是一种用于验证协议安全性的工具,它可以被视为密码学领域中的第三方评价工具。ProVerif 主要用于形式化方法,特别是验证协议的形式化安全性。使用 ProVerif,你可以创建协议的形式模型,然后通过自动分析来检查该协议是否满足一些安全性属性。
proverif之所以能成为第三方评价工具,主要考虑一下几点:
独立性: ProVerif 是一个独立的工具,它不是由协议设计者开发的,因此具有独立性。
客观性: ProVerif 提供了一种基于数学原理的形式化方法,这使得评价相对客观,因为它依赖于严格的数学推理。
自动化: ProVerif 是自动化的,这意味着可以通过计算机程序进行协议的验证,而不仅仅是依赖于人工审查。
一、从官网学正规语法
学一门语言最好的方法是查看官方文档。访问 ProVerif 的官方网站,查看官方文档和用户手册。官方文档通常提供了详细的语法说明、示例和使用指南。
首先进入proverif官网:https://bblanche.gitlabpages.inria.fr/proverif/
在Downloads章节中找到用户手册:User manual,点击下载(用户手册共160页)
从用户手册第三章开始,认真学习语法内容。
二、细看用户手册
语法分为四部分:声明形式的加密原语;声明握手协议的加密原语;声明宏定义;将协议编程为主进程。接下来我尽量通过注释形式展示代码和解释之间的关联性。
1. 声明形式的加密原语
使用(* *)对内容进行注释。
语言是强类型的,用户定义的类型声明如下(示例):
(*输入文件中出现的所有自由名称都必须使用该语法声明*)
type t.
(*其中n是名称,t是类型。可以声明相同类型t的多个自由名*)
type n:t.
(**同时声明多个相同类型的自由名)
type n1,...,nk:t
例如:
(*bitstring类型的变量RSA*)
free RSA:bitstring.
free Cocks,RSA:bitstring.
2. 握手协议-中间人攻击的解决方案
原始协议中,A通过非对称加密将自己公钥告知B(公钥生成算法是pk(),通过输入A私钥生成A公钥)。B用同样方式生成自己的公私钥对,并用B私钥进行签名sign,签名内容包括(B公钥、只有A和B知道的秘密值k),并用A公钥加密信息发送给A。A收到信息后用A私钥解密得到签名sign,然后用B公钥验证签名。接着使用秘密值k加密内容s发送给B。
但该协议容易遭到中间人攻击:
解决办法是:签名中加入A的公钥,便于收到此消息的客户端确认确实是发给自己的。
相关知识点的代码如下:
(*语法channel c是free c: channel的同义词。默认情况下,攻击者知道自由名称。*)
(*攻击者不知道的自由名称必须声明为private*)
free n : t [ private ] .
例如:c是一个通道channel类型,free代表全局类型,所有人都知道,包括敌手。
free c:channel.
(*构造函数(函数符号)用于构建加密协议使用的术语建模原语;例如:单向哈希函数、加密、数字签名等。*)
fun f(t1, . . . , tn) : t.
例如:对称加密中senc函数输入的参数是两个,一个bitstring类型,一个key类型,输出的参数是bitstring类型。
fun senc(bitstring, key): bitstring.
(*除非将构造函数声明为私有,否则攻击者可以使用它们:*)
fun f(t1, . . . , tn) : t [ private ] .
析构函数使用:密码原语之间的关系由析构函数捕获,析构函数用于操作由构造函数形成的术语。
可以在每个重写规则的声明中使用let绑定。例如,在一些投票协议中使用的抽象零知识证明可以声明如下:
(*析构函数使用*)
例如:对称加密-生成密文函数:输入m,ssk,函数名getmess(签名),签名函数sign()
reduc forall m: bitstring, ssk: sskey; getmess(sign(m,ssk)) = m.
非对称加密-proverif代码分析:
(*非对称加密*)
type skey.
type pkey.
(*密钥生成*)
fun pk(skey):pkey.
(*加密*)
fun aenc(bitstring,pkey):bitstring.
(*解密.注意:析构函数是完全由构造函数组成的*)
不对:reduc forall m: bitstring, sk: skey,pk:pkey; adec(aenc(m,pk),sk) = m.因为pk是由构造函数pk(sk)生成的
reduc forall m