目录
案例背景:
(1)构建一个交互式的通讯方案;
(2)攻击者控制了所有的通讯信道,可以修改、拦截、转发信息;
(3)诚实主体为了保护个人隐私,所有信息加密;
(4)信息项可以增加、删除、查询、修改。
1数据类型
(1)基于非对称密码保护方案;
(2)包含了各种错误信息和消息项操作信息;
[Messages]
定义一个消息类型。
Agents ::= Alice | Bob | Evil
三个主体, Evil是攻击者
Keys ::= Alice_PK| Bob_PK| Evil_PK | Alice_SK | Bob_SK | Evil_SK | NULL
Alice_PK表示Alice有个公钥,Alice_SK表示Alice有个私钥,NULL表示消息可以明文传送。
Result ::= OK | NoSuchltem
传输结果,操作成功OK,某个消息不存在NoSuchltem
Command := Add | Del | Query | Modi
额外的选项,交易项的操作信息:增删改查
Check _M: Agents × Agents × Command × Messages × Keys
→Command × Messages × Keys
额外定义了一个函数,函数的输入是一个五元组(Agents × Agents X Command × Messages × Keys),函数的输出是一个命令,消息,和对应的一个密钥(Command × Messages × Keys
)。
Check_M=O
初始化:是初始化函数,因为所有的都是集合,所以要有初始值。
2初始状态
Evil_Agent攻击者的状态
Adversary_Knowledge:P(Agents × Agents × Command × Messages × Keys)
攻击者的知识集,给他刻画了某一种数据类型,P表示由集合(Agents × Agents × Command × Messages × Keys)产生的密集。
Adversary_Init: Keys→ Agents
输入的Keys,对应的是一个实体,因为函数是多对一的,一个实体可以拥有多个密钥,
Acversary_Init = {(Alice_PK,Alice),(Bob_PK,Bob).(Evil_PK,Evil).(Evil_SK,Evil)}
对于攻击者而言,有3个公钥PK,1个私钥SK。
Alice_Agent
Alice_Knowledge: P Messages
Alice_Init: Keys →Agents
Alice_Init = {(Alice_PK,Alice),(Bob_PK, Bob), (Evil_PK,Evil), (Alice_SK,Alice) }
Alice_Knowledge = ∅
Bob_Agent(与Alice类似)
Bob_Knowledge: P Messages
Bob_Init: Keys → Agents
Bob_Init = {(Alice_PK,Alice).(Bob_PK. Bob),(Evil_PK.Evil),(Bob_SK,Bob)}
Bob_Knowledge = ∅
Init
Alice_Agent'
Bob_Agent'
Evil_Agent'
Adversary_Knowledge'=∅
得到初始状态,初始状态Alice与Bob之间没有任何消息的传递(Alice_Knowledge = ∅
,Bob_Knowledge = ∅),所以攻击者得不到任何信息,因此攻击者的知识集目前也是空的(Adversary_Knowledge'=∅)。
注意:Z规格中每一个schema本质上是由多个集合组成,每个集合上必须严格定义数据类型,因此Z规格是一种类型化系统;另外,对数据的操作则构成了多个命题。命题用于说明系统状态,后续将说明前件和后件的使用。
3 Alice的消息发送
Alice_send_Ml
Na: Messages
Na是一个随机数,定义为一个消息
M1!: Agents × Agents × Command × Messages × Keys
输出是M1
△Alice_Agent
△Evil_Agent
这里△表示如果Alice发送消息M1的话(Alice_send_Ml),会引起Alice_Agent和Evil_Agent的状态变化。
Na ∉ Alice_Knowledge
做一个判断,要发送的随机数Na不能属于Alice已有的知识集
Alice_Knowledge'= Alice_Knowledge ∪ {Na}
更新Alice知识集,增加Na
M1! = (Alice, Bob,Add,Na,Bob_PK)
输出M1用固定的表示(Alice, Bob,Add,Na,Bob_PK)
Adversary_Knowledge'= Adversary_Knowledge ∪ {M1!}
输出以后,攻击者会在知识集中增加M1的信息
4 Bob接收与发送消息
Bob receive Ml _send_M2
Bob收到M1同时发送M2
M1?: Agents × Agents × Command × Messages × Keys
?表示输入
M2!: Agents ×Agents × Command × Messages × Keys
!表示输出
Na,Nb: Messages
△Bob_Agent
△Evil_Agent
M1? ∈ dom Check_M
要检查一下M1是否属于Check_M函数的一个定义,属于证明才能通过。
(Bob_SK,Bob) ∈ Bob_Init
Bob要解密M1,所以需要一个私钥Bob_SK。
Check_M M1? =(Add,Na,Bob_PK)
利用函数Check_M判断M1,输入?是M1,输出是产出的结果判断,增加Add一个消息Na.
Bob_Knowledge'= Bob_Knowledge ∪ {Na,Nb}
接受方Bob知识集增加两个,Na 是Bob从密文中提取的,Nb是Bob自己产生的。
M2!=(Bob,Alice,Add,Nb,Alice_PK)
Adversary_Knowledge'= Adversary_Knowledge ∪ {M24}
5 Alice接收消息
大同小异了
6消息的增删改查
6.1 删除消息
Alice_And_Bob_Del
M?: Agents×Agents × Conmcd × Messcges ×Keys
reply!: Result
状态的反馈
X: Messcges
△Alice_Agent
△Bob_Agent
要求同时更新Alice和Bob两个实体状态。
M? ∈ dom Check_M
⋀ Check_M M?=(Del,X,NULL)
逻辑与符号⋀:可以省略,因为在Z规格中,每一行后面都会隐含一个and。这里只是为了增加可读性。
⋀ X∈ Bob_Knowledge
⋀ X∈Alice_Knowleclge
增加了额外的操作条件,此时前提条件有四个:判断M?属于Check_M定义域、M?中是否包含Del指令、消息X是否属于Alice知识集、消息X是否属于Bob知识集。
⋀Alice_Knowledge'= Alice_Knowledge \ {X}
⋀Bob_Knowledge'= Bob_Knowlecge \ {X}
上面的\就表示删除X
⋀reply! = OK
⋁ reply! = NoSuchItem
逻辑或符号⋁:⋁
要写,表示产生了一个错误,当M不属于Check_M函数的定义,就返回没有信息项NoSuchItem
注意:Z规格中,系统的模型通常体现为一个LTS,即标签化的可变迁状态机。每一个状态的变迁有前提条件和后续条件。但是,Z规格的schema中并没有显示地说明哪些是前提条件,哪些是后续条件,需要用户自己甄别。
6.2查询消息
Alice_Or_Bob_Query
M?: Agents × Agents × Commcmnd × Messages × Keys
X: Messcges
resp!: Messcges
reply!: Result
ΞAlice_Agent
ΞBob_Agent
希腊字符Ξ:表示Alice和Bob的状态不会有任何的更改。仅仅是对消息的查询。
M?∈ dom Check_M ⋀
Check_M M?=(Query,X,NULL)
判断M?是否属于Check_M定义域、M?中是否包含Query指令
X∈Alice_Knowledge ⋀X∈ Bob_Knowledge
reply! = OK
resp!=X ⋁reply!= NoSuchItem
输出X,或如果输入不在Check_M函数中,输出没有的消息NoSuchItem
6.3修改/增加消息
Alice_Or_Bob_Modify
M_New? : Messciges
M_Old? : Agents × Agents ×Conmand × Messcges × Keys
对于修改消息,输入有两个,新旧消息项
X: Messages
reply!: Result
△Alice_Agent
△Bob_Agent
M_Old? ∈ dom Check_M ⋀Check_M M_Old? =(Modi,X,NULLL)
判断旧消息项是否属于函数定义域,同时输出密文能把X找到。
X∈ Alice_Knowledge
⋀X∈ Bob_Knowlecge
⋀Alice_Knowledge'= Alice_Knowledge \ {X}∪{M_New?}
⋀Bob_Knowleclge'= Bob_Knowledge \ {X}∪{M_New?}
reply! = OK ⋁reply! = NoStuchItem
7定理证明——重要目的
第一列Y表示没有语法错误,第二列Y表示没有逻辑错误。
重要目的:证明系统的安全性,或某些功能是否达到要求。
(1)初始状态中是否能够蕴含这三种实体
(2)Alice收到消息M2,是否从上面的系统中蕴含着Alice一定发送了消息M1
(3)Alice是否正确的得到了随机数Na和Nb,如果Alice收到M2,能否推出:
1)Na和Nb属于Alice知识集,2)Alice发送M1,3)Bob收到M1并发送M2
————————后面会学习软件Z-EVES:
Z-EVES 是专门为 Z 规范设计的,这使得它在处理 Z 语言时比一般的定理证明器更高效和精确。例如,支持 Z 规范的语法和语义检查。与其他形式化验证工具相比,Z-EVES 在处理 Z 语言时具有独特的优势和高效性。