【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

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志