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

2024-03-28 09:59

本文主要是介绍【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:

这篇关于【proverif】proverif的语法-解决中间人攻击-代码详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855294

相关文章

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁