【proverif】proverif的语法3-认证协议的验证代码-案例分析

proverif-系列文章目录

  1. 【proverif】proverif的下载安装和初使用
  2. 【proverif】proverif的语法1-解决中间人攻击-代码详解
  3. 【proverif】proverif的语法2-各种密码原语的编码
  4. 【proverif】proverif的语法3-认证协议的验证代码-案例分析 (本文)

文章目录

  • proverif-系列文章目录
  • 前言
  • 一、proverif和CryptoVerif的区别
  • 二、事件
    • 2. 安全性分析
      • proverif长什么样?
      • 强安全
    • 2. 案例分析-认证协议的proverif编码


前言

本文介绍proverif和CryptoVerif的区别,进而对协议设计proverif验证的实战分析。


一、proverif和CryptoVerif的区别

1.适用领域:

  • ProVerif: 主要用于验证各种协议的安全性,包括身份验证协议、密钥交换协议等。它强调对协议中的逻辑安全性属性的验证。
  • CryptoVerif: 专注于协议中的密码学安全性,特别是对于一些基本的密码学概念(如加密、签名、密钥协商等)的形式化证明。

2.安全性属性:

  • ProVerif: 主要关注协议的逻辑安全性,例如认证、保密性、一致性等。
  • CryptoVerif: 更侧重于密码学的安全属性,例如对抗模型下的保密性、不可伪造性、前向保密性等。

3.形式化方法:

  • ProVerif: 使用可判定性的符号模型来表示协议和攻击模型,利用逻辑推理和自动搜索来检查协议的安全性。
  • CryptoVerif: 强调对密码学协议的形式化证明,使用可考察性的密码模型进行分析,证明密码学协议满足一些关键的安全属性。

4.支持的密码学理论:

  • ProVerif: 对于密码学方面提供了一些基本的支持,但它的主要焦点是在更一般的协议安全性上。
  • CryptoVerif: 针对密码学属性提供了更丰富的支持,可以处理一些复杂的密码学构造和协议。

5.使用语言:

  • ProVerif: 使用自己的专有语言,该语言对于描述协议和攻击模型非常适用。
  • CryptoVerif:也有自己的语言,但它更强调对密码学定义和性质的直接建模。

6.工具的发展状态:

  • ProVerif: 是一个相对成熟和稳定的工具,一直在不断发展和改进。
  • CryptoVerif: 在我知识截止日期(2022年)时仍在发展,并可能有了新的功能和改进。

如果你的主要兴趣是协议的逻辑安全性,那么 ProVerif 可能更适合;如果你更关注密码学的安全性属性,那么 CryptoVerif 可能更适合。

二、事件

代码如下:

(* 1. 在事件执行之前,有e1和e2均被执行。连词:&& *)
query event(e0)==>event(e1) && event(e2).

(* 2. 在事件执行之前,有e1或e2均被执行。析词:|| *)
query event(e0)==>event(e1) || event(e2).

(* 3. 连词、析词同时出现 *)
query event(e0)==>event(e1) || (event(e2) && event(e3)).

(*4. 连接比析取具有更高的优先级,但是应该使用括号来消除表达式的歧义。事件当然可以有参数,也可以是内射事件。*)
(*解释:e0执行前e1已执行一次;e0不执行对应e2和e3都没执行*)
query inj-event(e0)==>event(e1) || (inj-event(e2) && event(e3)).

(* 5.当攻击者知道M时,事件e1已经被执行。 *)
query attacker(M)==>event(e1).

(* 6.事件e(x)只能在x=a时执行。 *)
query x:t;event(e(x)) ==> x=a.

内射事件相关事项:

  1. ==>后面是inj-event,自动将==>前面变成是inj-event
  2. 要求如果事件e1执行了n1次,事件e2执行了n2次,那么事件e3至少执行了n1 × n2次。
inj-event(e1) && inj-event(e2)==>inj-event(e3).

noninterf 的使用:

  • bool型可以表示为noninterf b among (true,false).

2. 安全性分析

proverif长什么样?

组成部分:加密操作、描述参与者行为过程、安全查询、场景。
在这里插入图片描述

强安全

强保密性查询可用于显示在会话密钥下加密发送的有效负载的保密性。强保密性意味着攻击者无法分辨秘密何时发生变化。

free c:channel.

type key.
fun senc(bitstring, key): bitstring.
reduc forall m: bitstring, k: key; sdec(senc(m,k),k) = m.

free k:key [private].

free secret_msg:bitstring [private].
noninterf secret_msg.

process (!out(c,senc(secret_msg, k))) | (!in(c,x:bitstring); let s=sdec(x,k)in 0)

输出结果:
在这里插入图片描述
首先,process给出proverif运行代码的顺序,然后给出总结,总结表示,密文 secret_msg不被干涉是true,证明敌手无法获取密文。

2. 案例分析-认证协议的proverif编码

前三节已经把proverif的语法介绍得差不多了,这个时候拿一个真正的协议的验证代码过来实战一下,通过分析协议的proverif的验证代码,进一步加深学习。

案例代码来自github良心学者:GitHub地址链接
还有许多官方文档给出的案例代码在proverif的examples文件下,地址:proverif2.04\examples\pitype\choice,将所有.pv文件复制到exe文件下(地址是:\proverif2.04)才能运行。

先上代码:智能手机和服务器之间的认证协议验证

(*Ebuka Philip Oguchi: Mutual authentication between the smartphone user and the server*)


(* Define types and cryptographic operations------------------------- *)
(* Define communication channel *)
free c:channel.

(* Define types for cryptographic keys and hosts *)
type key.
type PRkey.
type PUkey.
type host.
type nonce.
(* Define hosts A and S for the smartphone user and server *)
free A,S:host.

(* Define cryptographic functions *)
fun senc(bitstring,key):bitstring.
reduc forall m:bitstring,k:key; sdec(senc(m,k),k) = m.

(* Public key extraction *)
fun pk(PRkey):PUkey.

(* Asymmetric encryption *)
fun aenc(bitstring,PUkey):bitstring.
reduc forall m:bitstring,k:PRkey; adec(aenc(m,pk(k)),k) = m.

(* Data Type Converters *)
(* Convert a nonce to a bitstring *)
fun nonce_to_bitstring(nonce):bitstring [data,typeConverter].
(* Convert a nonce to a key *)
fun nonce_to_key(nonce):key [data,typeConverter].

(* 事件---------------------------------------------------------------*)
(* Define authentication and communication events *)
event smartPhoneAccepts(nonce,nonce,PUkey).
event smartPhoneTerms(nonce,nonce,PUkey).
event serverAccepts(nonce,nonce,PUkey).
event serverTerms(nonce,nonce,PUkey).

(* 安全性查询---------------------------------------------------------------*)
free s:bitstring [private].
(* Attacker queries *)
query attacker(s).
query N1,N2:nonce,puX:PUkey; inj-event(smartPhoneTerms(N1,N2,puX)) ==> inj-event(serverAccepts(N1,N2,puX)).
query N1,N2:nonce,puX:PUkey; inj-event(serverTerms(N1,N2,puX)) ==> inj-event(smartPhoneAccepts(N1,N2,puX)).


(* Define secret bitstrings *)
free secretAN1,secretAN2:bitstring [private].
free secretBN1,secretBN2:bitstring [private].
query attacker(secretAN1); attacker(secretAN2);
	  attacker(secretBN1);attacker(secretBN2).

(* 参与者之间行为过程---------------------------------------------------------------*)
(* Define behavior of the smartphone *)
let smartPhone(puS:PUkey,prA:PRkey) =
(* Smartphone receives public key of the server *)
in(c,puX:PUkey);
(* Check if received public key matches server's public key *)
if puX = puS then
(* Generate a new nonce for the smartphone *)
new N1:nonce;
(* Encrypt the nonce and smartphone's private key with server's public key *)
let m = aenc((N1,pk(prA)),puX) in
out(c,m);
(* Receive the encrypted message from the server *)
in(c,m2:bitstring);
(* Decrypt the message to extract nonces and keys *)
let (=N1,N2:nonce,puX2:PUkey) = adec(m2,prA) in
if puX2 = puS then
(* Smartphone accepts terms *)
event smartPhoneAccepts(N1,N2,puX2);
(* Encrypt the second nonce with smartphone's public key *)
let m3 = aenc(nonce_to_bitstring(N2),puX2) in
out(c,m3);
(* Present terms to server *)
event smartPhoneTerms(N1,N2,pk(prA));
(* Encrypt and send secret bitstrings with nonces as keys *)
out(c,senc(secretAN1,nonce_to_key(N1)));
out(c,senc(secretAN2,nonce_to_key(N2))).



(* Define behavior of the server *)
let server(puA:PUkey,prS:PRkey) =
(* Receive the encrypted message from the smartphone *)
in(c,m:bitstring);
(* Decrypt the message to extract nonce and smartphone's public key *)
let (N1:nonce,puX:PUkey) = adec(m,prS) in
(* Generate a new nonce for the server *)
new N2:nonce;
  (* Server accepts terms *)
event serverAccepts(N1,N2,puX);
(* Encrypt the nonces and server's public key with smartphone's public key *)
let m2 = aenc((N1,N2,pk(prS)),puX) in
out(c,m2);

(* Receive the encrypted nonce from the smartphone *)
in(c,m3:bitstring);

(* Compare the decrypted nonce with the second generated nonce *)
if nonce_to_bitstring(N2) = adec(m3,prS) then 
(* Check if received public key matches smartphone's public key *)
if puX = puA then
(* Server presents terms to the smartphone *)
event serverTerms(N1,N2,pk(prS));

(* Encrypt and send secret bitstrings with nonces as keys *)
out(c,senc(secretBN1,nonce_to_key(N1)));
out(c,senc(secretBN2,nonce_to_key(N2))).

(* Define the main process--------------------------------------------- *)
process
new prA:PRkey; new prS:PRkey;

(* Generate public keys from private keys *)
let puA = pk(prA) in out(c,puA);
let puS = pk(prS) in out(c,puS);

(* Execute the smartphone and server processes concurrently *)
( (! smartPhone(puS,prA)) | (! server(puA,prS)))

编译结果:

  1. 编译过程process:
    在这里插入图片描述
  • 创建一个公共通道c,两个host类型A,S分别代表智能手机和服务器;
  • 加密操作:对称加密、将随机数变成字符串、将随机数变成密钥;
  • 四个事件:
event smartPhoneAccepts(nonce,nonce,PUkey). //客户端接受服务器
event smartPhoneTerms(nonce,nonce,PUkey). //客户端终止与服务器之间的协议
event serverAccepts(nonce,nonce,PUkey). //服务器接受客户端
event serverTerms(nonce,nonce,PUkey).//服务器终止与客户端的协议
  • 查询:
    1. 密文s是否会被泄露;
    2. 内射:
      在客户端终止协议前,已执行服务器接受客户端的协议,且事件
      serverAccepts(N1,N2,puX)执行的次数 ≥ smartPhoneTerms(N1,N2,puX)执行的次数;
      在服务器终止协议前,已执行客户端接受的协议,且事件
      smartPhoneAccepts(N1,N2,puX)执行的次数 ≥ serverTerms(N1,N2,puX)执行的次数;
  • 参与者行为过程:智能手机和服务器两个进程是同时进行的。
  1. 安全性查询:
    在这里插入图片描述
  2. 总结
    在这里插入图片描述

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

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

相关文章

【JVM】内存区域划分、类加载机制(双亲委派模型图解)、垃圾回收(可达性分析、分代回收)

一、JVM简介 JVM (Java虚拟机) 是执行Java字节码的虚拟机。它是Java平台的核心,并且为Java代码提供了跨平台的能力。JVM 是一种虚拟的计算机,在其上运行的程序是Java字节码,它提供了Java代码在不同操作系统和硬件平台上执行的能力。JVM 将Ja…

Selenium操作已经打开的Chrome浏览器窗口

Selenium操作已经打开的Chrome浏览器窗口 0. 背景 在使用之前的代码通过selenium操作Chrome浏览器时,每次都要新打开一个窗口,觉得麻烦,所以尝试使用 Selenium 获取已经打开的浏览器窗口,在此记录下过程 本文使用 chrome浏览器来…

云端力量:探索亚马逊云服务器,提升您的业务无限可能

文章目录 前言亚马逊云服务器简介亚马逊云服务器的优势使用步骤Amazon EC2 实例类型常见问题 总结 前言 随着大数据、人工智能和物联网等技术的飞速发展,企业对于高效、灵活和可扩展的计算需求日益增强。在这样的背景下,亚马逊云服务器 以其卓越的性能、…

ubuntu提高 github下载速度

Github一般用于Git的远程仓库,由于服务器位于国外,国内访问速度比较慢,为了提高访问速度,决定绕过DNS域名解析。 获取Github的IP地址 按下ctrl+alt+T打开命令终端,输入: nslookup gi…

电路综合-基于简化实频的集总参数电路匹配2-得出解析解并综合

电路综合-基于简化实频的集总参数电路匹配2-得出解析解并综合 电路综合-基于简化实频的集总参数电路匹配1中介绍了从要匹配的电路结构得到所对应的均衡器的阻抗数值解的过程。我们下一步需要将数值解拟合成正实函数的形式,从而进行电路综合。此处接着这个教程继续。…

redis运维(八)数据类型(一)字符串

一 字符串 说明: 不需要精通,但是得有一个粗略的认识,然后利用help command查看具体使用仅做记录查询 ① 基础概念 说明: ex是用来收敛内存使用率备注: 早期set是不带ex的默认: 不设置ex,是常驻内存 key和value的命名规范 …

<C++> 反向迭代器

我们知道正向迭代器的设计:begin迭代器指向第一个数据,end迭代器指向最后一个数据的下一个位置 。移向下一个数据,解引用得到数据的值,并根据容器储存方式的不同,容器有不同类型的迭代器。 注意:rbegin迭代…

SSH-远程连接服务器

一、理论知识 目前远程连接服务器的主要类型: 文字接口明文传输:Telnet、RSH 等为主,目前非常少用。文字接口加密:SSH 为主,已经取代上述的 Telnet、RSH 等明文传输方式。图形接口:XDMCP(X Di…

数据结构树与二叉树的实现

目录 一、普通树的存储结构 1、双亲表示法 2.孩子表示法 二、二叉树 1.二叉树的顺序存储(必须是完全二叉树,否则很浪费空间) 1)结构体 2.二叉树的链式存储 1)结构体 2)操作 1.创建一颗二叉树 2.创…

window 搭建 MQTT 服务器并使用

1. 下载 安装 mosquitto 下载地址: http://mosquitto.org/files/binary/ win 使用 win32 看自己电脑下载相应版本: 一直安装: 记住安装路径:C:\Program Files\mosquitto 修改配置文件: allow_anonymous false 设置…

Express.js 与 Nest.js对比

Express.js 与 Nest.js对比 自从 Node.js 发布以来,Javascript 在后端领域的使用有所增加。由于 Node.js 的使用越来越多,每天都会有新的框架和工具发布。Express 和 Nest 是使用 Node.js 创建后端应用程序的最著名的框架之一,在本文中&…

【入门篇】1.1 redis 基础数据类型详解和示例

文章目录 1. 简介2. Redis基础数据类型2.1 String类型场景示例常用命令示例 2.2 List类型场景示例 2.3 Set类型场景示例 2.4 Hash类型场景示例 2.5 Sorted Set类型 3. 使用Redis存储数据的注意事项1. 内存管理2. 数据持久化3. 高并发下的性能考量 4. 参考资料 1. 简介 Redis概…

app在线客服系统怎么对接

随着移动互联网的快速发展,越来越多的企业开始意识到在线客服系统的重要性。而对于一个App来说,一个高效的在线客服系统更是必不可少的。本文将介绍如何对接App在线客服系统,提高用户体验和客户满意度。 一、在线客服系统的作用和优势 1. 提供…

【Linux】:进程间通信

进程间通信 一.基本概念二.简单的通信-管道1.建立通信信道2.通信接口 一.基本概念 是什么 两个或多个进程实现数据层面的交互。 因为进程独立性的存在,导致进程间的通信成本比较高。 为什么 因为我们有多进程协同的需求。 怎么办 a.进程间通信的本质:必须让不…

TMS320F28335使用多个串口时,SCIRXST Register出现错误

TMS320F28335使用多个串口时,SCIRXST Register出现错误 void ClearErrorState(void) {if((SciaRegs.SCIRXST.bit.FE 1)||(SciaRegs.SCIRXST.bit.BRKDT 1)){SciaRegs.SCICTL1.bit.SWRESET 0;SciaRegs.SCICTL1.bit.SWRESET 1;}if((ScibRegs.SCIRXST.bit.FE 1)||(S…

反转链表(图解)

LCR 024. 反转链表 - 力扣(LeetCode) 题目描述 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 样例输入 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2&…

【漏洞复现】NUUO摄像头存在远程命令执行漏洞

漏洞描述 NUUO摄像头是中国台湾NUUO公司旗下的一款网络视频记录器,该设备存在远程命令执行漏洞,攻击者可利用该漏洞执行任意命令,进而获取服务器的权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律&…

leetcode栈和队列三剑客

用队列实现栈 队列是先进先出的,而栈是只能在栈顶进行出栈和入栈,那我们这道题要用队列来实现栈的话,这里给的思路是两个队列,因为两个队列的话就可以相互导数据,比如我们来实现这个题目的push函数,我们的栈…

根据店铺ID/店铺链接/店铺昵称获取京东店铺所有商品数据接口|京东店铺所有商品数据接口|京东API接口

要获取京东店铺的所有商品数据,您需要使用京东开放平台提供的API接口。以下是一些可能有用的API接口: 商品SKU列表接口:该接口可以获取指定店铺下的所有商品SKU列表,包括商品ID、名称、价格等信息。您可以使用该接口来获取店铺中…

springMvc中的拦截器【巩固】

先实现下想要的拦截器功能 package com.hmdp.utils;import com.hmdp.entity.User; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Ht…