【proverif】proverif的语法-解决中间人攻击-代码详解

系列文章目录

  1. 【proverif】proverif的下载安装和初使用
  2. 【proverif】proverif的语法(本文)

文章目录

  • 系列文章目录
  • 前言:proverif-密码学领域中的客观第三方评价工具
  • 一、从官网学正规语法
  • 二、细看用户手册
    • 1. 声明形式的加密原语
    • 2. 握手协议-中间人攻击的解决方案
    • 3. 相关表达
    • 4. 详细分析握手定理的编码
    • 5. 看懂proverif的输出
  • 总结


前言:proverif-密码学领域中的客观第三方评价工具

在密码学领域,"客观、第三方"评价指标通常指的是对密码学方案、协议或算法进行评估和验证时所采用的一种方法或标准。这种评价方法侧重于通过独立、客观的标准和工具对密码学系统进行评估,以确保其安全性、可靠性和功能性。一般包括:数学证明和分析、安全模型的定义和评估、标准化和认证机构的测试等。

  1. 数学证明和分析: 对密码学方案的安全性进行数学证明是一种常见的方法。这确保了方案的安全性不依赖于假设,而是基于严格的数学原理。

  2. 安全模型的定义和评估: 通过定义具体的安全模型,并在此基础上评估密码学方案,可以提供一种客观的方式来衡量其安全性。

  3. 公开评审和审查: 将密码学方案、协议或算法提交给公开的审查或评审,让来自领域内外的专家进行独立的审查,以确保系统的可靠性和安全性。

  4. 标准化和认证机构的测试: 一些密码学方案可能会通过国际标准化组织或认证机构的测试来验证其符合特定的安全标准和规范。

这些方法旨在确保密码学系统经过了全面的审查和评估,不仅仅依赖于设计者的声称或内部测试。这样的方法有助于增强密码学系统的安全性和可信度,从而提供更可靠的安全保障。

ProVerif是一种用于验证协议安全性的工具,它可以被视为密码学领域中的第三方评价工具。ProVerif 主要用于形式化方法,特别是验证协议的形式化安全性。使用 ProVerif,你可以创建协议的形式模型,然后通过自动分析来检查该协议是否满足一些安全性属性。
proverif之所以能成为第三方评价工具,主要考虑一下几点:

  1. 独立性: ProVerif 是一个独立的工具,它不是由协议设计者开发的,因此具有独立性。

  2. 客观性: ProVerif 提供了一种基于数学原理的形式化方法,这使得评价相对客观,因为它依赖于严格的数学推理。

  3. 自动化: 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:bitstring,sk:skey;denc(aenc(m,pk(sk)),sk)=m.

握手协议(抗中间人攻击)完整代码如下:包括对称加密、非对称加密、数字签名、事件设置、进程设置。

(* Symmetric key encryption *)

type key.
fun senc(bitstring, key): bitstring.
reduc forall 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 forall m: bitstring, sk: skey; adec(aenc(m,pk(sk)),sk) = m.


(* Digital signatures *)
(*
析构函数允许消息恢复和签名验证。
析构函数getmess允许攻击者从签名中获取消息m,即使没有密钥。
析构函数checksign检查签名,只有当签名正确时才返回m。诚实进程通常只使用checksign。这个签名模型假设签名总是伴随着消息m。也可以为不显示消息m的签名建模。
*)
type sskey.
type spkey.

fun spk(sskey): spkey.
fun sign(bitstring, sskey): bitstring.

reduc forall m: bitstring, ssk: sskey; getmess(sign(m,ssk)) = m.
reduc forall 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(acceptsClient(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
	(*=pkA,对自己的公钥进行确认,证明确实是发给自己的*)
	event acceptsClient(k);
	out(c,senc(s,k));
	event termClient(k,pkA).

let serverB(pkB:spkey,skB:sskey,pkA:pkey) = 
	in(c,pkX:pkey);
	new k:key; 
	event acceptsServer(k,pkX);
	out(c,aenc(sign((pkX,pkB,k),skB),pkX));
	(*签名里添加了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)) | (!serverB(pkB,skB,pkA)) )

该段代码运行结果为:
在这里插入图片描述
上述代码可以和非抗中间人攻击的代码对比学习,下面代码只列举不同处:

let clientA(pkA:pkey,skA:skey,pkB:spkey) = 
	out(c,pkA);
	in(c,x:bitstring); 
	let y = adec(x,skA) in
	let (=pkB,k:key) = checksign(y,pkB) in
	(*缺少=pkA*)
	event acceptsClient(k);
	out(c,senc(s,k));
	event termClient(k,pkA).

let serverB(pkB:spkey,skB:sskey,pkA:pkey) = 
	in(c,pkX:pkey);
	new k:key; 
	event acceptsServer(k,pkX);
	out(c,aenc(sign((pkB,k),skB),pkX));
	(*签名里缺少了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)) | (!serverB(pkB,skB,pkA)) )

3. 相关表达

在这里插入图片描述
在这里插入图片描述
关键字列表:不用用作标识符
在这里插入图片描述
内置类型:any_type, bitstring , bool, nat, sid, time

4. 详细分析握手定理的编码

代码如下:

(*声明公开通道c*)
free c:channel.

free s:bitstring [private].
query attacker(s).
(* Reachability and secrecy可达性和保密性:为了测试模型中术语M的保密性,在主进程之前的输入文件*)

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(acceptsClient(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
	(*=pkA,对自己的公钥进行确认,证明确实是发给自己的*)
	event acceptsClient(k);
	out(c,senc(s,k));
	event termClient(k,pkA).

(*服务器进程*)
let serverB(pkB:spkey,skB:sskey,pkA:pkey) = 
	in(c,pkX:pkey);
	new k:key; 
	event acceptsServer(k,pkX);
	out(c,aenc(sign((pkX,pkB,k),skB),pkX));
	(*签名里添加了pkX,便于收到此消息的客户端确认确实是发给自己的*)
	in(c,x:bitstring); 
	let z = sdec(x,k) in
	if pkX = pkA then event termServer(k).

process 
	new skA:skey; (*创建A和B的私钥*)
	new skB:sskey;
	let pkA = pk(skA) in out(c,pkA);(*通过宏定义生成A和B的公钥,并在公开通道c中传输*)
	let pkB = spk(skB) in out(c,pkB);
	( (!clientA(pkA,skA,pkB)) | (!serverB(pkB,skB,pkA)) 

相关知识点:

  1. 可达性和保密性: proverif基本功能。为了测试模型中术语M的保密性,在主进程之前的输入文件中包含以下查询:
query attacker(M).
(*其中M是一个基本项,没有析构函数,包含自由名(可能是私有的,因此攻击者最初不知道)*)
  1. 通信断言、事件和身份验证: “如果事件e已经执行,那么事件e’在e之前已经执行。”查询基本通信断言的语法是:
query x:t1,y:t2,z:t3; event(e(x,y))==>event(e'(y,z)).
(*对于所有的x, y,对于每一个e(x, y)的出现,对于某个z有一个e'(y, z)的先前出现.*)
  1. 内射Injuective: 在需要每个参与者执行的协议运行数量之间的一对一关系的情况下考虑使用Injective,内射对应断言捕获一对一关系。此语法中,箭头后面的事件运行次数≥箭头前事件运行次数(例如服务器和客户端之间通信,客户端只愿意和一个服务器进行一次密钥协商,而服务器愿意和多个客户端进行密钥协商,故inj-event(客户端事件)==>inj-event(服务器事件))。语法:注意,在箭头==>之前使用inj−event或event并不会改变查询的含义,而箭头后是inj−event则查询通讯次数,event则查询通信顺序。
query x1:t1,x2:t2,...,xn:tn; inj-event(e(M1,...,Mj))==>inj_event(e'(N1,...,Nk)).
  1. 四个事件声明的含义:
event acceptsClient(key). :客户端使用它来记录自己已接受使用服务器B和提供的对称密钥运行协议。
event acceptsServer(key,pkey). :服务器认为他已接受与客户端一起运行协议的事实,将提议的密钥作为第一个参数提供,并将客户端的公钥作为第二个参数提供。
event termClient(key,pkey). :客户端认为自己已经终止了使用作为第一个参数提供的对称密钥和作为第二个参数的客户端公钥运行的协议。
event termServer(key). :服务器相信他已经终止了与客户端a运行的协议,并将对称密钥作为第一个参数提供。
  1. 理解通信断言和内射的语法逻辑:
    在这里插入图片描述
query x:key,y:pkey; event(termClient(x,y))==>event(acceptsServer(x,y)).
query x:key; inj-event(termServer(x))==>inj-event(acceptsClient(x)).

注意: 在箭头==>之前发生的事件可以放在协议的末尾,但是在箭头 ==>之后发生的事件必须至少有一个消息输出。否则,整个协议可以在不执行后一个事件的情况下执行,因此通信肯定不成立。

还可以注意到,将箭头==>之前发生的事件移动到协议的开始处可以增强对应属性,将箭头==>之后发生的事件移动到协议的结束处也可以增强对应属性。向事件添加参数也增强了对应属性。

5. 看懂proverif的输出

在这里插入图片描述
一般结构如上图。
[Equations]总结了输入文件中给出的方程的内部表示(如果有的话);
[Process]表示输入过程,其中扩展了所有宏,并将不同的标识符分配给唯一的名称/变量;此外,部分过程用标识符{n}进行注释。
[Query] ProVerif试图证明违反属性的状态是不可达的,如果违反了一个属性,那么ProVerif将尝试用英语重建一个[攻击派生],并在应用的pi演算中重建一个[攻击跟踪]
Verification summary: 验证结果摘要。result有三种结果,如下图所示。
在这里插入图片描述
从下面这段结果可看见,Query not attacker(RSA[]) is false.这个结论从Derivation中推到了整个攻击过程。
在这里插入图片描述


总结

输入:in(M,x:t).
输出:out(M,N).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/153635.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【10套模拟】【5】

关键字: 数据的最小单位、归并排序(两两归并)、单链表顺序存取、邻接表表头顶点顺序存储随机访问、三角矩阵元素个数、堆的性质、冒泡排序、二叉树是否相同

MATLAB与Excel的数据交互

准备阶段 clear all % 添加Excel函数 try Excel=actxGetRunningServer(Excel.Application); catch Excel=actxserver(Excel.application); end % 设置Excel可见 Excel.visible=1; 插入数据 % % 激活eSheet1 % eSheet1.Activate; % 或者 % Activate(eSheet1); % % 打开…

疑似openAI的BUG

Chat gpt 4.0 『最新数据2023年』 Chat gpt 3.5 智商不在线『最近数据2021年9月左右』 发现了疑似openAI的一个bug 通过固定连接访问就可以用chatgpt4.0 4.0版本的费用为20美金一个月 https://chat.openai.com/?modelgpt-4-gizmo

Angular 由一个bug说起之二:trackBy的一点注意事项

trackBy是angualr优化项目性能的一种方法, 通过返回一个具有绑定性的唯一值, 比如id,手机号,身份证号之类的,来让angular能够跟踪数组的项目,根据数据的变化来重新生成DOM, 这样就节约了性能。 但是如果是使用ngFor循环组件&…

制造企业MES管理系统解决方案的深化应用

随着制造业的发展,生产车间管理一直是企业面临的难题。生产过程繁忙而混乱,信息不流通,生产效率低下等问题频发。为了解决这些问题,企业管理者急需寻找有效的解决方案。这时,MES管理系统解决方案应运而生,成…

Linux网络之传输层协议tcp/udp

文章目录 目录 一、再谈端口号 1.端口号划分 2.知名端口号 3.netstat,pidof 二、UDP协议 1.udp协议格式 2.udp特点 3.基于udp的应用层协议 三、TCP协议 1.tcp报头 确认应答机制(ACK) 超时重传机制 连接管理机制(三次握手四次挥…

div中的两个元素怎么实现上下排列

案例: 这里面的分享活动页和获取抽奖机会两个文字上下排列怎么实现? 答案: 父元素加上两个属性: display: flex; flex-direction: column; 就实现了

正则表达式,你不会用太可惜

文章目录 说明创建正则表达式的三种方式方式一方式二方式三 正则表达式修饰符i (IgnoreCase)g (global)m (multiple lines) 正则表达式[ ]() 元字符.w 是word的缩写d 是digit的缩写s 是 space的缩写其它间隙元字符 不占位修饰符b是…

C++泛型编程——模板(初识)

C泛型编程——模板(初识) 文章目录 C泛型编程——模板(初识)1. 泛型编程的概念2. 模板2.1 模板格式2.2 函数模板2.3 函数模板的实例化2.3.1 隐式(推演)实例化2.3.2 显式实例化 2.3 类模板3. 模板的本质 本章…

ES7升级、jar包升级、工具类封装,代码改造

一、spring-data-elasticsearch 引入es版本适配 二、jar升级 在项目工程根pom.xml文件中增加maven依赖管理在这里插入图片描述<properties><elasticsearch.spring.version>4.2.0</elasticsearch.spring.version>

Genio 500_MT8385安卓核心板:功能强大且高效

Genio 500(MT8385)安卓核心板是一款功能强大且高效的AIoT平台&#xff0c;内置的AI处理器(APU)工作频率可达500MHz&#xff0c;支持深度学习、神经网络加速和计算机视觉应用。配合高达2500万像素的摄像头&#xff0c;可以为AI相机应用提供清晰、精确的图像&#xff0c;如人脸识…

怎么防止U盘复制电脑文件

随着信息化的快速发展&#xff0c;数据安全问题越来越受到人们的关注。U盘作为一种常用的数据传输工具&#xff0c;有时会被用于非法复制电脑文件&#xff0c;从而给企业或个人带来损失。因此&#xff0c;防止U盘复制电脑文件成为保护数据安全的重要措施之一。 一、我们应该提高…

为什么原生IP可以降低Google play账号关联风险?企业号解决8.3/10.3账号关联问题?

在Google paly应用上架的过程中&#xff0c;相信大多数开发者都遇到过开发者账号因为关联问题&#xff0c;导致应用包被拒审和封号的情况。 而众所周知&#xff0c;开发者账号注册或登录的IP地址及设备是造成账号关联的重要因素之一。酷鸟云最新上线的原生IP能有效降低账号因I…

TensorRT基础知识及应用【学习笔记(十)】

这篇博客为修改过后的转载&#xff0c;因为没有转载链接&#xff0c;所以选了原创 文章目录 一、准备知识1.1 环境配置A. CUDA DriverB. CUDAC. cuDNND. TensorRT 1.2 编程模型 二、构建阶段2.1 创建网络定义2.2 配置参数2.3 生成Engine2.4 保存为模型文件2.5 释放资源 三、运…

一键整合,万用万灵,Python3.10项目嵌入式一键整合包的制作(Embed)

我们知道Python是一门解释型语言&#xff0c;项目运行时需要依赖Python解释器&#xff0c;并且有时候需要安装项目中对应的三方依赖库。对于专业的Python开发者来说&#xff0c;可以直接通过pip命令进行安装即可。但是如果是分发给其他的Windows用户&#xff0c;特别是不熟悉Py…

【网络奇幻之旅】那年我与互联网的邂逅

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;网络奇幻之旅 ⭐每日一句&#xff1a;不想留在过去&#xff0c;就要变得更好 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 &a…

SaaS与PaaS平台的区别

目录 一、前言 二、SaaS化与PaaS化平台的区别 三、PaaS化的低代码平台更胜一筹 PaaS优势&#xff1a; 支持PaaS服务的低代码平台 1.私有化部署&#xff0c;为数据安全保驾护航 2.业内领先技术&#xff0c;为开发强势赋能 3.超强集成能力&#xff0c;系统对接无忧 4.源代码交付&…

企业微信获取第三方应用凭证

上一篇介绍了如何配置通用开发参数及通过url回调验证&#xff0c; 本篇将通过服务商后台配置关联小程序应用配置和获取第三方凭证及如何配置企业可信IP。 当然上篇配置的回调设置也不会白费&#xff0c;在下方的指令和数据回调会用到。 第三方应用开发流程 官方企业微信第三方…

v-for 循环数组的某一部分

方法一&#xff1a;使用slice()方法 代码&#xff1a; <template><div><!--循环前三个元素--><span v-for"(item, index) in arr.slice(0, 3)" :key"index a">{{ item }}</span> <br><!--循环前第六个到第九个元…

语义检索系统【全】:基于milvus语义检索系统指令全流程-快速部署版

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…