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

news2025/1/11 2:17:27

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. 总结
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机应用从零开始(六)·逻辑运算

51单片机应用从零开始(一)-CSDN博客 51单片机应用从零开始(二)-CSDN博客 51单片机应用从零开始(三)-CSDN博客 51单片机应用从零开始(四)-CSDN博客 51单片机应用从零开始(…

【入门篇】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概…

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…

【SpringMvc】SpringMvc +MyBatis整理

🎄欢迎来到边境矢梦的csdn博文🎄 🎄本文主要梳理 Java 框架 中 SpringMVC的知识点和值得注意的地方 🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关…

python_主动调用其他类的成员

# 主动调用其他类的成员 # 方式一: class Base(object):def f1(self):print("5个功能") class Foo(object):def f1(self):print("3个功能")# Base.实例方法(自己传self),与继承无关Base.f1(self)obj Foo() obj.f1()print("#"*20)# 方式二:按照类…

Rockdb简介

背景 最近在使用flink的过程中,由于要存储的状态很大,所以使用到了rockdb作为flink的后端存储,本文就来简单看下rockdb的架构设计 Rockdb设计 Rockdb采用了LSM的结构,它和hbase很像,不过严格的说,基于LS…

希亦ACE和小吉内衣洗衣机选哪个?两款洗衣机对比

内衣洗衣机可以称得上是实现幸福的小家电,它不仅懒人的福音还是我们打工人的福音,在每天下班之后可以有时间休息了,洗完澡还有要手洗内衣裤,真的很痛苦,拥有了内衣洗衣机简直是一件非常幸福的事情,但现在市…

wpf devexpress Property Grid创建属性定义

WPF Property Grid控件使用属性定义定义如何做和显示 本教程示范如何绑定WP Property Grid控件到数据和创建属性定义。 执行如下步骤 第一步-创建属性定义 添加PropertyGridControl组件到项目。 打开工具箱在vs,定位到DX.23.1: Data 面板,选择Prope…

HarmonyOS 实现底部导航栏

该功能实现需要Tabs、TabsController、TabContent、Column等组件 Tabs相当于Android中的BottomNavigationView TabContent相当于Android中的fragment TabBuilder内相当于每个Item Entry Component struct Main {public tabsController : object new TabsController()State c…

后端接口性能优化分析-多线程优化

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码🔥如果感觉博主的文章还不错的话,请👍三连支持&…

微软 Gradle 强强联手,Gradle 构建服务器正式开源!

作者:Nick Zhu - Senior Program Manager, Developer Division At Microsoft 排版:Alan Wang Gradle 构建服务器 (Build Server for Gradle) 在九月份,我们宣布 Microsoft 和 Gradle 联手探索了一种基于 Build Server Protocol(B…

用户运营:如何搭建用户分析体系

在运营的工作范畴中,用户运营是很重要的一个环节,甚至有公司会设置专门的“用户运营”岗位。 用户运营的价值体现在多个方面,不仅可以帮助引流、吸引更多用户使用产品,在用户正式使用产品之后的运营则更为重要。通过日常用户运营&…

思源笔记的优缺点 vs Obsidian vs Logseq vs Trilium

新用户对思源笔记的印象。(PS:两年前我试用过思源笔记,被卡顿劝退了) 优点 相比obsidian, 可在文档树拖拽 拖拽调整笔记顺序 拖拽使一个笔记成为另一个笔记的子笔记,树状结构 设置-文档树,默认…

儿童玩具上架亚马逊和国际站及TEMU平台CPC认证

儿童玩具上架亚马逊和国际站及TEMU平台CPC认证办理 最近相当火爆的玩具重力萝卜刀也在全网做屏霸,听上去像是一种能让你在虚拟世界中模拟挖矿的神奇工具。但实际上,它是一种新型玩具,不仅具备重力感应功能,还可以进行切割和挖掘。…

合璧之光,共创辉煌|明道云伙伴大会2023圆满结束

2023年11月3日至11月4日,“合璧之光明道云伙伴大会2023”在上海星河湾酒店顺利举行,报名参会人数超过1800人。大会邀请到明道云标杆客户及合作伙伴分享组织落地零代码的经验及各行业领域解决方案,包括越秀集团、豫园股份、远大医药&#xff0…

CTF-虚拟机——【前置知识三】

文章目录 内存虚拟化常见缩写虚拟机内存访问原理影子页表扩展页表VPID(Virtual Processor Identifier):TLB(Translation Lookaside Buffer)资源优化 内存虚拟化 能够提供在Guest机制中识别为从零开始的连续的物理地址…

redis运维(九)字符串(二)字符串过期时间

一 字符串过期时间 细节点: 注意命令的入参和返回值 ① 再谈过期时间 说明: 设置key的同时并且设置过期时间,是一个原子操作 ② ttl 检查过期时间 ③ persist 删除过期时间 ④ redis 删除过期key的机制 ⑤ 惰性删除 惰性理解:让过期…

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

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

浅谈基于云计算的环境智能监控系统

随着经济的飞速发展,环境污染也越来越严重,环境监控成为了政府与社会关注的焦点。本文提出了一种基于云计算的环境智能监控系统——EasyCVR,该系统综合应用了传感器、云计算、大数据、人工智能等技术,具有实时、准确、高效的监控能…

Docker安装MinIO遇到的问题汇总——持续更新中

文章目录 Docker安装MinIO遇到的坑前言问题1:执行docker run报错Error response from daemon问题2:启动MinIO容器浏览器无法访问问题3:上传文件报错InvalidResponseException问题4:上传文件报错Connection refused最终的启动指令问…