基于串空间的KryptoKnight协议分析及与逻辑化方法的比较
基于串空间模型的Andrew安全RPC协议分析
()若 n N 且为 t m(2 ,则存在 唯一的结 点 n, 2 2 e n)负 r 。 使
得 H n。 i 2
( 包含身份标识 和随机数等) 和密钥项 ( 参与者的密钥集合 ) ,
分别属 于文本项集 合 T和密钥项 集合 K 0项可有 南原子项 经
()若 n∈ 且 n二 , n ÷n。 3 2N , I> 则 l 2 = - 因为 B nl 是一个 图 ,所以在边一 和 下 ,结 点的关系 u de 形成偏序关系 ,表示为
具有上面的性质 ,那么该协议是正确的。下文就 A de n rw安 全
R C协 议 的 机 密 性进 行 了证 明 。 P
2 串空 间模 型简 介 [ 1 1
21 项 ( r . t m)和 子项 ( bem e s tr ) u
项 表示协议 参与者可 能交换 的消息 ,一个协议 的所有 参 与者可 能交换 的消息集 合称 为项 集合 。原子项 分为文本 项
An l ss o d e S c r a y i fAn r w e u e RPC o o o s d o t a d S a e M o e Pr t c lBa e n S r n p c dl
L1 Huian U f g
( e a d c t n l no ma o e t Z e g h u4 0 0 ) H n n E u a o a Ifr t nC ne i i r, h n z o 5 0 8
个 串空间 。迹映射 可以不是单射。 定义 4c N E)是有 向图 (,)的子图 ,其中E E =( c NE 是
边 的集合 ,E E 是与 E 中的边相关 联 的结点 的集合 。如果 下列条件满足 ,那 么 C是 B n l: u de
基于串空间模型的Athena方法的改进
I p o e e to h n p o c s d 0 m r v m n f At e aAp r a h Ba e n S r n p c sM o l t a d S a e de
DONG n s e g W U a g i GUO n h a , Ro g h n , Gu n we , Yu c u n GU Ti n o g a ln
[ ywod Srn pcsAtea DHk ya re n;K 2pooo Ke rs t dsae ; h n ; e geme tIEv rtcl I a
串空问模型(s 一经提 出…,便受 到学术界 的广泛 关 s M) 注 。J 0 1 ,S n 。2 0 年 o g等人扩展 了串空 间模型,并结合定理
t o yo h n p r a ha c r ig t KEv r tc . ntesrcu eo sa etr ,s he r fAte a a p o c c od n O I 2p oo o1I t tr fme sg e ms omec po rp i rmiie r d e oh n l h u r tg a hcp y i t saea d d t a deDH v
k y a r e n , n e i — r r l to sm o i e o d a t o lx me s g tu t r .I d i o t e s c e y a t e t a i n a d s me o e e g e me t a d t n t m ea i n i d f d t e lwi c mp e s a e sr c u e n a d t n, e r c , u n i t n o t r h e i h i h h c o h p o e t so KEv r t o r a y e t e p o o e pp o c r p r e fI i 2 p o o la ea l z d wi t r p s d a r a h. c n hh
kryptoknight原理
kryptoknight原理
Kryptoknight是一种加密货币挖矿算法,它的原理是基于CryptoNight算法。
CryptoNight算法是一种内存硬算法,旨在抵制ASIC挖矿设备的影响,使得普通的个人电脑和智能手机也能够进行有效的挖矿。
Kryptoknight通过利用内存依赖性和并行性来实现这一目标。
该算法使用AES加密和SHA-3哈希函数,同时还包括内存访问模式和随机操作,以增加难度。
这种算法的设计旨在使得挖矿更加公平,并且不会让少数人占据绝对优势。
因此,Kryptoknight 的原理可以总结为通过内存依赖性和并行性来抵制ASIC挖矿设备,从而实现分散化和公平性。
用串空间分析路由协议SGSR
令, 为无符号项集合. 节点 / - N是 , t E 的进入点, 当且仅当 t ( ) e / =+n其 中 n m t r - , ∈L且对所有 的 / t -
+/ t (t 簪L t r - - e /) ,m
定义 1 起 源 . 3
无 符号项 t 源 于 n N 当且 仅 当 tr ) 起 ∈ , em( 的符号 为正 , 对 /的任何 一 个前 驱 节点 /, t e 且 - t - 有 甓t t m r (t)无符号 项 t / . - , 是唯 一起源 的, 当且 仅 当 z 唯~起 源于 n . 定义 1 h为 g的一 个子项 , h , . 4 即 g 该关 系用 理想 的概 念可 以定 义 为 g∈I 】 c kh . l
串空 间 是近 几 年来 出现 的 一种 分 析 安 全协 议 的新 方法 , 9 8年 由 T ae F be a H r g和 G t a 19 h yr 6 rg, ez o ut n m
等人 提出 的。 串空 间模 型是 一种 结 合迹 和定 理 证明 的混合 方法 , 它最 大 的优 点是简 洁, 串空 间模 型既 可 以证
作 者 简 介: 字 燕 (9 4一 ) 女, 徽 淮 北 人 , 士 生 , 究 方 向: 息安 全 .f 民 16
)男, , 安徽巢湖人, 博士, 教授, 研究方 向: 网络与信 息安 全
维普资讯
摘
要: 用形式化方法分析安全协议是 协议分析的有效手段, 近年来, 出现 了众多 的研究 方法 . 串空问模型是一种新
兴的形式化分析工具 , 中, 理想 ” 诚实” 其 “ 和“ 两个概念 简化了分析协议 的步骤. 首次利用 串空间理论对 由徐兰芳提 出
的 一种 安全 的 A o d H c网络 路 由协 议 S S G R进 行 分析 , 分 析 了它 的 认 证 性 和机 密 性 , 果 证 明 此协 议 能 够 达 到协 议 并 结 的 目标 . 关 键 词 :G R协 议 ; SS 串空 间 ; 证 性 ; 密性 认 机 中图 分 类号 : N9 8 1 T 1 . 文 献 标识 码 : A 文 章 编 号 :6 2—7 7 (07 0 04 0 17 17 2 0 )4— 0 9— 3
可证明安全的抗量子高效口令认证密钥交换协议
可证明安全的抗量子高效口令认证密钥交换协议尹安琪;汪定;郭渊博;陈琳;唐迪【期刊名称】《计算机学报》【年(卷),期】2022(45)11【摘要】基于格的口令认证密钥交换(Password-Authenticated Key Exchange,PAKE)协议在后量子时代具有广泛的应用前景.降低通信轮次可以有效提高执行效率,也是格上PAKE协议的重要优化方向.现有基于格的低轮次PAKE协议的构建方法主要有两种:一种是基于非交互式零知识(Non-Interactive Zero-Knowledge,NIZK)证明,但在标准模型下如何在格上实现NIZK证明仍然是公开问题;另一种虽然宣称基于不可区分适应性选择密文攻击(Indistinguishability under Adaptive Chosen-Ciphertext Attack,IND-CCA2)的安全模型,但实际上只采用了不可区分性选择密文攻击(Indistinguishability under Chosen-Ciphertext Attack,IND-CCA1)安全的公钥加密(Public Key Encryption,PKE)方案,该类PAKE 协议在现实应用时需要利用签名/验签等技术才能保证安全性.这两种方法都会增加计算和通信开销.为此,本文利用带误差学习(Learning with Errors,LWE)问题的加法同态属性,提出了一种格上IND-CCA2安全的非适应性平滑投影哈希函数(Smooth Projective Hash Function,SPHF),该函数支持一轮PAKE协议的构造;并确定了所基于的PKE方案中相关参数的大小,从而消除了LWE问题的不完全加法同态属性对SPHF正确性的影响.尽所知,这是格上第一个直接基于IND-CCA2安全模型的非适应性SPHF,且该SPHF具有相对独立的研究价值,可应用于证据加密、零知识证明和不经意传输等领域.基于此,本文构建了一种格上可证明安全的高效PAKE协议.该协议可以抵御量子攻击;只需要一轮通信,因而具有最优的通信轮次;是基于标准模型,所以避免了使用随机预言机的潜在安全威胁,特别是使用随机预言机可能导致格上PAKE协议遭受离线口令猜测攻击和量子攻击;在实际应用时,该协议也不需要利用NIZK证明和签名/验签等技术来保证安全性,这有效提高了执行效率.本文还利用人人网474万口令数据验证了基于CDF-Zipf定律的PAKE协议安全模型可以更加准确地评估PAKE协议所提供的安全强度;最后基于该安全性模型,本文在标准模型下对所提出的PAKE协议进行了严格的安全性证明.实验结果表明,与其它相关协议相比,本文协议具有最优的整体执行效率和最低的通信开销.【总页数】16页(P2321-2336)【作者】尹安琪;汪定;郭渊博;陈琳;唐迪【作者单位】信息工程大学电子技术学院;南开大学网络空间安全学院;天津市网络与数据安全技术重点实验室(南开大学)【正文语种】中文【中图分类】TP393【相关文献】1.一种高效的匿名口令认证密钥交换协议2.基于RLWE问题的后量子口令认证密钥交换协议3.后量子基于验证元的三方口令认证密钥交换协议4.可证明安全的抗量子两服务器口令认证密钥交换协议5.格上基于密文标准语言的可证明安全两轮口令认证密钥交换协议因版权原因,仅展示原文概要,查看原文内容请购买。
基于辫群的密钥交换协议的实现及分析
B2, ( 的值 来求 解x的 困难 程 度是 不一 样 的, 然 () …BM) 显 后 一个 问题 比前 面 的 问题 要 容 易 的多 .后一 个 问题 所
为辨 群 B 中 的元 素, 中X X Y ‘ 以看 成 是Y的共 轭 X的 问题 和 已 知XB 1 。B 2X 其 Y 可 () X () … ,B M) ‘ () X X ( X 和B 1,
元素 和Y 相乘 得 到.或 者看 成是 X 和X 的共 轭元 素 相
乘得 到 的, 具体 的密钥 交换 过程 如下 : 面临 的 困难 问题 是不 同于标 准 形式 的共轭 问题 。我 们 两 方 A ie B b 别 公 布 字 a1, 2, ,( ; ( , l o分 c () () an b 1 a … ) ) 可 以把它 称 之为 新 的共 轭 问题 .应 该说 这个 也 是从 算 b2, bm) () …,( 。这些 字 均从 群G II} 到, 中S =SD  ̄ 其 是生 成 法上来 说 不可解 的 另一 点 是密 钥 交换协 议所 利 用 的 元. 是 定义 关 系 。 l e o 之间 的密钥 由它 的共 同 的 D A i 和B b c H X () X () I X 行 为 产生 。l e B b Ai 和 o 同时 执行 以下 的步 骤 ,一 起产 生 辫 群 中密 钥 的共 轭 运 算 的 同态 性 质 :I A 1 ‘ A 2 c 秘 密密 钥 : 31 i 首 先进 行 如下运算 . Al e c
21 0 2年第 1 期
福
建 电
脑
3
基 于辫 群 的 密钥 交换 协 议 的 实 现及 分 析
层簇式空间网络组密钥管理方案研究
层簇式空间网络组密钥管理方案研究作者:尤启迪赵叶来源:《软件导刊》2020年第04期摘要:为了改善未来空间网络多播应用面临的群组成员管理难度更大、通信时延更长、安全性要求更高的问题,通过对已有空间网络组密钥管理方案AGKM的性能分析和对比,提出了一种基于层簇式网络架构的多播组密钥管理方案,方案将中国剩余定理(CRT)及椭圆曲线定理(ECC)融入管理算法。
实验结果表明,基于层簇式的方案降低了组密钥在更新过程中的通信开销、计算开销及密钥存储开销,分别达到了0(n+1)、0(n+2)以及3个多播包的结果,较对比方案性能提升了2 0%。
基于层簇式的网络组密钥管理方案能够有效降低密钥更新中的消息、计算及存储开销,提升管理性能,适用于未来空间网络管理需求。
关键词:安全组播;密钥管理;卫星网络DOI: 10. 11907/rjdk.192706开放科学(资源服务)标识码(OSID):中图分类号:TP309.7文献标识码:A文章编号:1672-7800(2020)004-0252-050 引言空间网络包含卫星及地面通信系统,它能够将不同轨道上的卫星进行连接,与地面相互通信执行各种类型的任务。
空间网络有许多特征,例如覆盖范围广、组网灵活。
多播是空间网络的一大重要应用,为保证多播安全,群组密钥管理必不可少。
迄今为止,关于空间网络中组密钥管理的方向,国内外学者均进行了相关研究。
Oltjon等[1]分析了将IPSec和SSL应用于未来卫星网络时密钥分发过多、加密延迟过长的问题;张江等[2]提出了一种基于空间信息网络分布的密钥管理机制,该方案为了解决低轨卫星网络密钥更新严重依赖地面基站的问题,提出了一种聚合性的密钥更新算法;钟焰涛等[3]基于空间信息网络的拓扑特征,设计了一种基于身份的适用于低轨、中轨双层空间信息网络的群密钥管理方案。
在当前和未来卫星对地面空间网络的多播应用中,对5G场景的需求可能会产生组密钥管理问题,例如管理组成员的难度、长时间的通信以及异构网络的可扩展性[4]。
基于串空间模型的电子商务协议的形式化分析
关 键 词 串空 间 认 证 测 试
形 式 化分 析 交 换 协议
文 章编 号 10 — 3 1 (0 6 0 — 1 3 0 文献 标 识 码 A 0 2 8 3 一 2 0 )3 0 2 — 4 中 圈分 类号 T 3 3 P 9
Fo ma a y i o E- o m e c o o o s d o t a d S a e r l An l ss t c m r e Pr t c lBa e n S r n p c
l 引言
随 着互 联 网 和 信 息 技 术 的发 展 ,电 子 商 务 得 到 了 快 速 发
前 已 有 一 些 分 析 安 全 协 议 的形 式 化 方 法 被 用 于分 析 公 平 交 换 协议 ,S C P工 具 【 归 纳 推 导 法 [ 被 用 于 分 析 协 议 的 可 追 究 - 1 和 2 1 已 性 、 平 性 和 时 效 性 , 献 【 用 A s模 型 检 测 工 具 M c a 验 公 文 3 】 T oh 检 协议 。 空 间模 型 一 种 新 兴 的 密码 协 议 形 式 化 分 析 工 具 。 串 是 文 献【】 绍 了用 认 证 测 试 的方 法 分 析 认 证 协 议 。 文 基 于 串 空 间 5介 本 模 型 , 义 了 主动 测 试 、 送 边 等 概念 , 之 能 够 描 述 和分 析 交 定 发 使 换协 议 。 对 交换 协 议 的公 平 性 进 行 了形 式 化 的描 述 。通 过 对 并
Ab t a t Us g o ma meh d t a ay e e u t p oo o i a i me h d o h a ay i f s c r y p oo osI sr c : i fr l n t o o n z s c r y r tc l s l i a v l d t o t t e n l ss o e u t r tc l. i n r c n y as a o o o ma meh d a p a e .ta d p c mo e i n w o ma a a y i to t t e n lss f e e t e r , lt f f r l t o s p e r d Sr n s a e dl s a e f r l n ss o l o h a ay i o l c y t ga r p o r m p tc 1 a e o sr n s a e, e xe d h a t e t a in e t o r o o . s d n t d p c w e tn t e u h n i t t s meh d Usn t i B a c o s to . ig hs me h d, c mme t o E— o  ̄e p t c l c n b d s rb d a d n ay e . e a p y i t h n l ss o W rt c l n n l at c s a p a e n o r o o a e e c e n a l z dW p l t o t e a a y i f AS i p o o o a d f d a t k p e r d i i l a
基于串空间模型的UMTS AKA协议安全分析与改进
d i1 .9 9 i n 1 0 — 5 5 2 1 . 6 0 7 o :0 3 6  ̄.s .0 1 0 0 . 0 0 0 .0 s
基 于 串 空 间模 型 的 U SA MT KA协 议 安 全 分 析 与 改进
邢 媛 蒋 睿
( 南 大学信息科学与工程学 院 , 京 209 ) 东 南 10 6
m e ha im si tod c d a h e v c t r n c n s i nr u e tt e s r ie newo k e d。a e i p o e n v r a o ie t lc nd a n w m r v d u i e s lm b l ee om .
Xi g Yua n n Ja g Ru in i
( co l fnomao cec n nier g o tesUnvri ,N nig2 0 9 , ia Sh o fr t nS i eadE gnei ,S uhat iesy aj 10 6 Chn ) oI i n n t “
S c r t n l ss a d i p o e e t o e u iy a a y i n m r v m n f UM TS A KA r t c l p o o o b s d o t a d s a e m o e a e n sr n p c dl
T e ,b sdo ese ict no eti eeainp r esi poet( P ) tep b ck y hn ae nt p c ai f h r g n rt at rhp r c 3 P , h u l e h i f o t hd o n j G i
Ab t c:T etk t ae uhnia o n e geme t( — A)pooo rp sdb he s a t h c e b sda te t t na dk ya re n T AK r i ci rtcl o oe yO t p
多服务器架构下基于混沌映射的认证密钥协商协议
计算机 工程与设计
CC I M PUTER ENGI NEERI NG AND DES I GN
S e p .2 0 1 5 V0 1 . 3 6 NO . 9
多服务 器架构下基于 混沌映射 的认证密钥协商协议
潘 恒 ,郑秋 生 。
d 0 i :1 0 . 1 6 2 0 8 / j . i s s n l 0 0 0 — 7 0 2 4 . 2 0 1 5 . 0 9 . O l 1
Au t h e n t i c a t e d k e y a g r e e me n t p r o t o c o l b a s e d o n c h a o t i c ma p s f o r mu l t i — s e r v e r a r c h i t e c t u r e
P AN He n g ,Z HENG Qi u — s h e n g
( 1 . He n a n En g i n e e r i n g L a b o f Co mp u t e r I n f o r ma t i o n S y s t e m S e c u r i t y As s e s s me n t ,Z h e n g z h o u 4 5 0 0 0 7 ,Ch i n a ; 2 .S c h o o l o f Co mp u t e r S c i e n c e ,Z h o n g y u a n Un i v e r s i t y o f Te c h n o l o g y,Zh e n g z h o u 4 5 0 0 0 7 ,Ch i n a )
安 全 基 础 设 施 维 护 成 本 高 昂的 问题 ,基 于 扩展 的 切 比雪 夫混 沌 映 射 机 制 ,设 计 一 种 使 用 智 能 卡 的远 程 来自 户认 证 密 钥 协 商 协
基于串空间理论的Kerberos协议分析
W EI Ha o, XI E Zh e n g-l o n g, YI Ga i —z h e n
( C o l l e g e o f I n f o r ma t i o n E n g i n e e r i n g , X i a n g y a n g N o ma r l U n i v e r s i t y , Xi a n y a n g 7 1 2 0 0 0 , C h i n a )
魏 浩, 解争龙 , 弋改珍
( 咸 阳师 范学 院 信 息 工程 学院 , 陕西 成 阳 7 1 2 0 0 0 )
摘 要: 在 介绍 串空 间理论 基本 概念 、 攻击 者模 型 以及 K e r b e r o s 协议 的基 础上 , 利 用 串空 间 理论 得 出 K e r b e r o s 各 协 议参 与
kryptoknight原理 -回复
kryptoknight原理-回复Kryptoknight是一种加密算法,主要用于保护计算机网络中的通信和数据传输安全。
该算法采用了一系列的加密和解密操作,以确保数据的保密性和完整性。
本文将逐步解释Kryptoknight算法的基本原理和工作流程,包括加密和解密过程以及相关的安全性。
第一部分:Kryptoknight算法介绍Kryptoknight算法是一种对称密钥加密算法,也就是说,加密和解密过程使用相同的密钥。
该算法采用了分组密码的方式,将明文数据分割成固定长度的分组,并在每个分组上执行一系列的加密操作。
第二部分:Kryptoknight加密过程1. 密钥生成:Kryptoknight算法需要一个密钥来执行加密操作。
该密钥是由用户指定的,并且需要足够强大以确保数据的安全性。
2. 数据分组:明文数据被分割成固定长度的分组,每个分组通常由64个比特(bits)组成。
如果数据长度不是64的倍数,则会进行填充操作以达到指定长度。
3. 迭代轮数:Kryptoknight算法采用了多轮迭代的方式来增强加密的安全性。
每一轮迭代都包含了一些固定的加密操作,如置换、替代等。
4. 轮函数:在每一轮迭代中,Kryptoknight算法会使用一个轮函数对分组数据进行加密。
该轮函数由一系列的置换操作和替代操作组成,以确保密文数据的随机性和保密性。
5. 伪随机数生成器:Kryptoknight算法使用了一个伪随机数生成器来生成密文数据。
这个生成器的输入是轮函数的输出和密钥,输出是密文数据。
6. 密文生成:在每一轮迭代后,Kryptoknight算法会生成一个固定长度的密文数据。
所有轮的密文数据将被合并为最终的密文输出。
第三部分:Kryptoknight解密过程1. 密钥输入:解密过程需要与加密过程相同的密钥。
用户需要输入正确的密钥以执行解密操作。
2. 密文分组:密文数据将被分割成与加密过程相同的固定长度分组,以便进行解密操作。
一种新的安全协议验证逻辑及其串空间语义
一种新的安全协议验证逻辑及其串空间语义陈莉【摘要】Aiming at the problems of typical verification logic of security protocols, such as the limitations in verifying security properties, the lack of analysis ability of hybrid cryptography-based primitives. This paper proposes a new verification logic, which can verify almost all of the known security properties of the e-commerce protocols, such as authentication.secrecy of key. non-repudiation, accountability, fairness and atomicity. Because most of the verification logics are lack of formal semantics, and formal semantics can prove the correctness of the logic systems, the paper describes strand space semantics of the logic sentences in the new logic and proves the correctness of the main inference rules using strand space model.%针对典型的安全协议验证逻辑存在的问题,如安全属性验证存在局限性、对混合密码原语的处理能力不强等,提出一种新的验证逻辑,新逻辑能够验证安全协议的认证性、密钥保密性、非否认性、可追究性、公平性及原子性.现有多数验证逻辑缺乏形式化语义,而逻辑语义能够证明逻辑系统的正确性,因此给出新逻辑所含逻辑构件的串空间语义,并应用串空间模型证明了新逻辑主要推理规则的正确性.【期刊名称】《计算机工程》【年(卷),期】2011(037)001【总页数】4页(P145-148)【关键词】安全属性;串空间;逻辑语义;混合密码原语【作者】陈莉【作者单位】河南财经学院计算中心,郑州450002【正文语种】中文【中图分类】TP181 概述目前,典型的安全协议验证逻辑被广泛应用于协议的安全属性验证,而且也发现了一些典型安全协议的缺陷或存在的安全漏洞。
基于纠缠的量子密钥分配协议仿真
基于纠缠的量子密钥分配协议仿真孔小琴;李琴;李远科;刘武【摘要】由于受物理资源和实验条件的限制,在经典计算机上对量子密钥分配(QKD)仿真,为研究者提供一种手段以便更好地掌握这类抽象协议。
对以纠缠态为基础的E91协议的量子密钥分配过程进行仿真,重点对比分析了理想环境、有噪环境以及窃听环境下的仿真结果,并验证该量子密钥分配协议的安全性。
%Due to the limitation of expensive physical devices and experiment conditions, the simulation of Quantum Key Distribution(QKD)with classical computers has been an alternative method to understand abstract quantum cryptographic protocols. This paper designs the simulation processes of QKD on a classical computer,taking E91 protocol as an example, and analyzes the simulation results in three cases:the channel is ideal,the channel is noisy, and the eavesdropper exists. The security of protocol is also shown.【期刊名称】《计算机工程与应用》【年(卷),期】2017(053)001【总页数】5页(P113-117)【关键词】量子密码;量子密钥分配;计算机仿真【作者】孔小琴;李琴;李远科;刘武【作者单位】湘潭大学信息工程学院,湖南湘潭 411105;湘潭大学信息工程学院,湖南湘潭 411105;湘潭大学信息工程学院,湖南湘潭 411105;湘潭大学信息工程学院,湖南湘潭 411105【正文语种】中文【中图分类】TP309KONG Xiaoqin,LIQin,LIYuanke,et al.Computer Engineering and Applications,2017,53(1):113-117.信息安全问题随着计算机技术的不断发展而变得越来越复杂。
基于进程代数安全协议验证的研究综述_李梦君
第41卷第7期2004年7月计算机研究与发展JOURNAL OF COM PUTER RESEARCH AND DEVELOPM ENTVol 41,No 7July 2004收稿日期:2003-05-09;修回日期:2003-10-13基金项目:国家自然科学基金项目(90104026,60073001);国家 八六三 高技术研究发展计划基金项目(2002AA144040)基于进程代数安全协议验证的研究综述李梦君 李舟军 陈火旺(国防科学技术大学计算机学院 长沙 410073)(mengjun li@163 com)摘 要 安全协议用于实现开放互联网络的通信安全,进程代数是一类使用代数方法研究通信并发系统理论的泛称,基于进程代数的安全协议验证是以进程代数作为安全协议描述语言的安全协议形式化验证方法 描述了基于进程代数的安全协议验证研究的4种主要方法:基于踪迹语义的方法;基于互模拟验证的方法;基于类型理论的方法;基于逻辑程序的方法 并给出了基于进程代数的安全协议验证进一步的研究方向 关键词 进程代数;安全协议;形式化验证;保密性;认证性中图法分类号 T P309A Survey of Security Protocol Verification Based on Process AlgebraLI Meng -Jun,LI Zhou -Jun,and CHEN H uo -Wang(School of Comp uter Science,N ational University of Def ense T echnology ,Changsha 410073)Abstract Security protocols are used to provide secure communication over open network Process algebra refers to those algebraic approaches to the study of communication and concurrency systems T he verifica -tion methods based on process algebra are the important verification methods of security protocols The main verification methods based on process algebra of security protocols are presented in this paper Finally the possible new directions of security protocols verification are also statedKey words process algebra;security protocol;formal verification;secrecy;authentication1 引 言1 1 安全协议与进程代数安全协议使用加密技术在开放的互联网络上实现传送秘密、分发会话密钥、认证身份等功能,它是实现安全的电子商务的基本保证 开放的互联网络是一个复杂的运行环境,表现为: 网络攻击者可以窃听、篡改、转发、截留安全协议参与者在互联网络上发送的消息; 开放的互联网络允许一个安全协议无穷多个会话的交叠并发运行,并发导致不确定性 网络攻击者的肆意破坏和安全协议的并发运行使得安全协议难以保证其设计目标的实现 因此,安全协议的形式化验证是一项有意义而重要的研究工作采用形式化方法对安全协议进行研究源于20世纪80年代初 安全协议的形式化研究方法主要分为3种:模型检验方法、定理证明方法、信念逻辑(belief logic)方法 模型检验方法能够自动完成安全协议的验证,有效地发现安全协议的攻击,并自动给出安全协议的攻击序列 由于模型检验方法是对有穷状态系统的一种自动验证方法,因此它无法完成安全协议无穷会话并发合成的验证 基于模型检验方法的典型研究工作有文献[1,2],模型检验工具有FDR,STA,SPIN,SMV 等 定理证明方法能够解决安全协议无穷会话并发合成的验证,它是手工证明或半自动证明的方法,需要领域专家的交互 基于定理证明方法的典型研究工作有文献[3,4];信念逻辑方法是一种简单而有效的安全协议验证方法,但是它具有一定的局限性[5],基于信念逻辑方法的典型研究工作有文献[6,7]进程代数是一类使用代数方法研究通信并发系统的理论的泛称,它包括CSP,CCS, 演算等,这些代数理论的共同特征为: 均使用通信,而不是共享存储,作为进程之间相互作用的基本手段; 在语法上,用一组算子作为进程构件,算子的语义用结构化操作语义定义,进程可看做标号转移系统; 把并发性归结为非确定性,将并发执行的进程的行为看做各单个进程的行为所有可能的交错合成,即并发的交叠语义 进程代数具有强大的描述能力和严格的语义,它能够精确地描述安全协议中一个角色同时参与安全协议无穷多个会话,能够精确地描述安全协议中不同角色之间的交互过程 基于进程代数的安全协议验证就是以进程代数作为安全协议描述语言的安全协议形式化验证方法在安全协议中,除了使用加密算法外,还使用了新鲜值(nonce)、时间戳(tim estamp)、散列函数(H ash)、数字签名(signature)来保证安全协议的安全性 安全协议中的新鲜值实质上就是一个随机数,用于防止消息重放(replay);时间戳是消息中的一个时间标记,用于防止消息的延迟;散列函数用于保证网络上传送消息的完整性,它是一个不可求逆的单向函数;数字签名是指在非对称密钥体系的安全协议中,使用私钥对发送的消息进行加密,由于私钥可以作为安全协议中角色的身份标识,接收到加密消息的角色使用对应的公钥进行解密,成功解密后它就能够判断出该加密消息的来源基于进程代数的安全协议验证基于以下的假设前提:(1)安全协议使用的密码体系是安全的,安全协议攻击者无法攻破安全协议使用的加密算法,只有当安全协议攻击者拥有密文对应的解密密钥时,他才能获得正确的明文;(2)若{M}u={N}v,则M=N并且u=v,即如果两个密文相同,则密文对应的明文和加密密钥都相同因此基于进程代数的安全协议验证独立于安全协议中使用的具体加密算法1 2 安全协议攻击者的Dolev-Yao模型Dolev-Yao模型[8,9]是用于安全协议验证研究并且使用最为广泛的一个安全协议攻击者模型,它界定了安全协议攻击者的行为能力Dolev-Yao模型中的N(m)表示在开放互联网络上传输消息m,D Y(m)表示安全协议攻击者获取了消息m, (m)表示消息m是公开的,它的获取不受任何限制Dolev-Yao模型:N(m) D Y(m)Intercepti onD Y(m) N(m)InjectionD Y(m1),D Y(m2) D Y(m1,m2)Composi tionD Y(m1,m2) D Y(m1),D Y(m2)Decompositi onD Y(m),D Y(k) D Y({m}k)EncryptionD Y({m}k),D Y(k-1) D Y(m)Decrypti onnD Y(n)Nonce Generati on(m) (m),D Y(m)Public KnowledgeD Y(m) D Y(m),D Y(m)DuplicationD Y(m) Deletion1 3 演算在安全协议形式化验证采用的安全协议描述语言中,进程代数能够为安全协议建立直观、精确的模型,其中 演算以其简明的语法、严格的形式语义和强大的描述能力,成为主要的安全协议描述语言 下面给出 演算的语法和结构化操作(SOS)语义[10],作为公用的语法记号演算的语法:= x y|x(z)| |[x=y]P =M|P|P |v zP|!PM =0| P|M+M演算的结构化操作语义:OU T x y Px yPT AU PPSU M-LPPP+QPPAR-LPPP|QP |Q,bn( ) f n(Q)= CLOSE-LPx(z)P ,Qx zQP|Qv z(P |Q ),z f n(Q) REP-ACTPP!PP |!PREP-CLOSEPx(z)P ,PxzP!P(v z(P |P ))|!P,z f n(Q)I NP x(z) PxyP{y/z}M ATPP[x=x] PP1098计算机研究与发展2004年7期李梦君等:基于进程代数安全协议验证的研究综述10991100计算机研究与发展2004年2 3 基于类型理论的方法基于类型理论的方法为安全协议保密性和认证性分别建立类型推理系统,对安全协议角色进程的并发合成中的消息(message)、通道(channel)、事件(event)赋予类型,证明了能够在类型推理系统中良类型化(w el-l typed)的角色进程的并发合成对应的安全协议是安全(safe)的 验证安全协议保密性和认证性都是通过证明安全协议角色进程的并发合成在对应的类型推理系统中是良类型的来完成 基于类型理论方法的研究工作主要有文献[17~20] 对称密钥体系安全协议使用的对称密钥是保密的,非对称密钥体系安全协议使用公钥/私钥对,其中公钥是公开的,私钥是保密的,密钥的类型不同,对称密钥体系安全协议和非对称密钥体系安全协议需要分别建立类型系统 文献[18,19]采用类型理论方法分别对对称密钥体系安全协议和非对称密钥体系安全协议的保密性进行了研究 文献[18]引入了3种数据类型: Public , Secret , A ny ,Public 数据类型表示具有这种类型的消息是公开的,Se-cr et数据类型表示具有这种类型的消息需要保密, A ny数据类型表示具有这种类型的消息可以公开,也可以处于保密状态 引入了3种断言 E , E M:T , E P:ok ,其中E表示环境(environ-m ent),它是不同的(名:数据类型)、(变量:数据类型)列表,断言 E表示环境是良构(well formed)的,断言E M:T表示环境E中消息M具有数据类型T,断言E P:ok表示进程P在环境E中是良类型化的 建立了一个类型推理系统(typing sys-tem),类型推理系统给出了判定 E,E M:T,E P:ok的3组推导规则 类型推理系统的基本思想是:为确保安全协议的保密性,Public类型的通道只能传输Public数据类型的消息,Secret数据类型、A ny数据类型的消息必须在类型为Secret的通道传输 文献[18]证明了当环境E中的名数据类型为Public、变量数据类型为A ny时,若进程P满足f n(P) f v(P) dom(E),且对所建立的保密性类型推理系统满足E P:ok,则进程P满足基于互模拟验证方法中用测试等价描述的保密性 文献[19]将安全协议攻击者建模为具有约束(R W,W)的任意进程Q,Q具有形式Q {M1/x1, ,M l/x l},f n (Q ) RW,f v(Q ) {x1, ,x l},W={M1, , M l},约束(RW,W)反映了安全协议攻击者的初始知识集 引入了6种数据类型: Public , Secret , C Public[T1, ,T n] , C Private[T1, ,T n] , K Public[T1, ,T n] , K Private[T1, ,T n] ,其中C Publ ic[T1, ,T n]和K Publi c[T1, ,T n]分别表示能被安全协议攻击者用于输入输出消息的通道,用于加密消息的密钥 建立了一个类型推理系统,证明了若P 对建立的类型推理系统满足E P:ok并且E s: Secret,则对具有约束(R W,W)的任意进程Q, P|Q不会泄露秘密s,其中R W是环境E中数据类型为Public的名集合,W是环境E中数据类型为C Public[T1, ,T n]或K Public[T1, ,T n]的名集合文献[17,20]采用类型理论的方法分别对对称密钥体系安全协议和非对称密钥体系安全协议的认证性进行了研究 验证认证性时,在安全协议的进程描述中加入了begin(M)事件和end(M)事件,能够公开的消息被赋予数据类型Un,安全协议攻击者(opponent)被建模为不出现begin(M)和end (M)断言,惟一出现的数据类型为Un的任意进程 在文献[17]中引入了两种原子效应(atom ic effect) end(L) 和 Check N ,end(L)用来追踪进程中与begin(M)事件不匹配的end(M)事件;新鲜值(nonce) 握手 (handshake)过程用于保证并发进程中事件的先后时序关系,Check N用于追踪新鲜值握手过程中新鲜值生成和新鲜值检查(check)的一一对应性 在文献[20]中引入了3种原子效应 end(L) , Check Public N 和 Check Private N , trust M:T ,其中原子效应trust M:T用于保证消息M一定具有数据类型T 效应(effect)是原子效应组成的多元集合 文献[17,20]分别建立了验证对称密钥体系安全协议和非对称密钥体系安全协议认证性的类型效应推理系统(ty pe and effect sys-tem),类型效应推理系统给出了判定 E,E M: T,E P:[es]的推理规则,其中[es]为效应 并且证明了若进程P在建立的类型效应推理系统中满足E P:[],其中环境E中所有名的数据类型都为Un,则对任意的安全协议攻击者Q,P|Q中出现了end(L),则在end(L)之前一定有惟一的begin(L)与之对应,即,如果进程P对于建立的认证性类型效应推理系统能够良类型化,则P一定满足认证性基于类型理论的方法是一种可靠但不完备的方法,能够在类型推理系统(或类型效应推理系统)中良类型化的角色进程的并发合成对应的安全协议满足安全性质,不能在类型推理系统中良类型化的角色进程的并发合成对应的安全协议需要进一步研究 基于类型理论的方法能够验证安全协议无穷角11017期李梦君等:基于进程代数安全协议验证的研究综述色进程(角色同时参与无穷多个协议会话)的并发合成,并且验证过程总是终止(terminate)的2 4 基于逻辑程序的方法基于逻辑程序的方法将安全协议角色进程的并发合成转换为一组逻辑规则,将安全协议安全性质的验证转换为对安全协议逻辑程序和一个与待验证安全性质对应的目标(goal)的消解 基于逻辑程序方法的研究工作主要有文献[12,21~23]Blanchet在文献[12,21]中分别给出了基于逻辑程序的安全协议保密性和认证性的验证方法 安全协议攻击者的Dolev-Yao模型被描述为一组逻辑规则 安全协议角色进程的并发合成转换的逻辑规则与安全协议攻击者Dolev-Yao模型对应的逻辑规则组成安全协议逻辑程序 保密性描述为安全协议保密数据secret不能从安全协议逻辑程序中通过逻辑程序消解得到;为验证安全协议的认证性,在安全协议角色进程的并发合成中加入了begin(M)和end(M)事件,描述消息M在不同角色进程中的对应性关系 认证性描述为若H end(M),则begin (M) H,其中H为原子公式begin(M1, ,M n)和attacker(x)(x为任意变量)由逻辑 与 联结构成的公式,即对于每一个end(M)的逻辑推导,它的逻辑前件中一定出现begin(M)基于逻辑程序的方法将安全协议角色进程中出现的约束名用新的n元函词代替,函词的n元参数为角色进程中位于约束名之前的输入动作接受的消息、析构(destructor)应用得到的消息,复制(repl-i cation)算子 ! 引入的会话标识符(session identif-i er)变量 用新的n元函词代替安全协议角色进程中的约束名,安全协议角色进程就可以转换为一组逻辑规则 逻辑规则中逻辑前件对应角色接收的输入消息,逻辑后件对应角色接收到输入消息后发送的作为应答的输出消息 安全协议角色进程的并发合成就转换为多个角色进程转换的逻辑规则的并集,文献[12,22]给出了具体的转换规则基于逻辑程序的方法将安全协议是否满足安全性质的验证问题转换为安全协议逻辑程序和一个与待验证安全性质对应的目标的消解 文献[21]中消解过程分为两个阶段,第1阶段计算安全协议逻辑程序的不动点;第2阶段计算与待验证安全性质对应的目标能否从安全协议逻辑程序的不动点推导出 对于许多安全协议,逻辑程序消解过程的第1阶段是终止的,因此基于逻辑程序的安全协议验证方法能够解决许多安全协议的验证问题[12,21] 如果计算安全协议逻辑程序的不动点时,逻辑规则的消解过程中出现了环(loop),安全协议逻辑程序不动点的计算过程将不终止,消解过程的第2阶段无法根据安全协议逻辑程序的不动点判断安全协议是否满足安全性质,基于逻辑程序的方法无法完成安全协议的验证 Woo-Lam单向认证协议逻辑程序不动点的计算过程不终止,因而基于逻辑程序的方法无法验证Woo-Lam单向认证协议基于逻辑程序的方法将安全协议角色进程中的约束名用新的n元函词代替,将安全协议角色进程的并发合成转换为一组安全协议逻辑规则,使得它能够验证无穷角色进程(角色同时参与安全协议无穷多个会话)的并发合成 基于逻辑程序的安全协议验证方法是可靠的,如果基于逻辑程序的安全协议验证方法验证了安全协议满足安全性质,则安全协议不存在实际的攻击序列 文献[21]指出:基于逻辑程序的方法存在 false attack ,在这种意义上,它是一种可靠但不完备的方法3 结 语基于进程代数的安全协议验证是安全协议形式化验证的重要方法 本文描述了基于进程代数的安全协议验证研究的4种主要方法:基于踪迹语义的方法;基于互模拟验证的方法;基于类型理论的方法;基于逻辑程序的方法 并描述了每一种方法的优点和不足基于进程代数的安全协议验证进一步的研究方向包括:(1)对其他安全性质的验证,如匿名性(anonymity)、非否认性(denial of serv ice)、原子性(atomity)等;(2)验证复杂的电子商务协议参考文献1M Boreale Symbolic trace analysis of cryptographic protocols In: Proc of the28th Int l Conf on Automata,Language and Program-ming(ICALP 01),LNCS2076 Geneva,Sw itzerland:Springer-Verlag,2001 667~6812G Low e Breaking and fixing th e Needham-S chroeder public-key protocol using FDR In:Proc of T ools and Algorithms for theConstructi on and Analysis of S ystems(T ACAS),LNCS1055Passau,Germany:Springer-Verlag,1996 147~1663L C Paulson Proving properties of security protocols by i nduction In:Proc of the10th Computer Security Foundation Workshop (CSFW10) M assachusetts:IEEE Computer Society Press,1102计算机研究与发展2004年1997 70~834F Javier,T Fabrega,J C Herzog,et al Strand space:Proving securi ty protocols correct Journal of Computer S ecurity,1999,7 (2/3):191~2305C Boyd,W M ao On a limitation of BAN logic In:Advances in Cryptology-EUROCRYPT 93,LNCS765 Lofthus,Norw ay: S pringer-Verlag,1993 240~2476M Burrow s,M Abadi,R Needham A logic of authenti cati on In:Proc of the Royal Society of London,LNCS426 London: S pringer-Verlag,1989 233~2717L Gong,R Needham,R Yahalom Reasoning about belief in cryp-tographic protocols In:IEEE S ym p on Research in Securi ty and Privacy Oakland:IEEE Com puter Society Press,1990 234~2488P Syverson,C M eadows,I Cervesato Dolev-Yao i s no better than machiavelli The1st W orkshop on Is sues in the Theory of Security (W ITS 00),Gen eva,S witzerland,20009D Dolev,A C Yao On the s ecurity of public-key protocols IEEE T rans on Informati on Theory,1983,2(29):198~20810D S angiorgi,D Walker T he Calculus:A T heory of M obile Processes England:Cambridge Universi ty Press,2001 20~50 11M Abadi,A D Gordon A calculus for cryptographic protocols: T he spi calculus T he4th ACM Conf on Computer and Commun-i cations Security,Zurich,Sw i terland,199712B Blanchet From secrecy to authenticity in security protocols In: T he9th Int l Static Analysis Symp(SAS 02),LNCS2477 M adri d,Spain:Springer-Verlag,2002 242~25913M Fiore,M Abadi Computing symbolic models for verifying cryptographic protocols In:Proc of th e14th Computer Security Foundation Workshop(CSFW14) Cape Breton,Nova Scotia, Canada:IEEE Computer Society Press,2001 160~17314A Huima Efficient i n finite-state analysi s of security protocols FLOC 99Workshop on Formal M ethods and Securi ty Protocols, T rento,Ital y,199915M Boreale,R D Ni cola,R Pugliese Proof techn i ques for cryp-tographic protocols In:Proc of the14th IEEE Symposium Logic In Com puter Science(LICS 99) T rento,Italy:IEE E Computer Society Press,1999 157~16616V Cortier Observati onal equivalence and trace equivalence in an extention of sp-i calculus Application to cryptographic protocols analysi s Lab Speci fication and Verifi cati on,ENS de Cachan, Cachan,France,Tech Rep:LSV-02-3,200217A D Gordon,A Jeffrey Authenticity by typing for security protocols In:Proc of the14th Computer S ecurity FoundationWorkshop(CS FW14) Cape Breton,Nova Scotia,Canada: IEEE Computer Society Press,2001 145~15918M Abadi Secrecy by typing in security protocol s In:Proc of Theoretical Aspects of Computer Software1997,LNCS1281 Sendai,Japan:Springer-Verlag,1997 611~63819M Abadi,B Blanch et S ecrecy types for asymmetric communica-tion In:Foundations of Softw are Science and Com putation Struc-tures(FoS SaCS2001),LNCS2030 Genova,Italy:Springer-Verlag,2001 25~4120A D Gordon,A Jeffrey Typing corresponden ce assertati ons for commun i cati on protocols M athematical Foundations of Program-ming Semantics(M FPS17),ENTCS45,Aarhus,Denmark, 200121B Blanchet An efficient cryptographic protocol verifier based on prolog rules In:Proc of the14th Computer S ecurity Foundation Workshop(CSFW14) Cape Breton,Nova Scotia,Canada: IEEE Computer Society Press,2001 82~9622M Abadi,B Blanchet Analyzing securi ty protocols w ith secrecy types and logic programs In:The29th ACM S ymp on Principles of Programing Languages(POPL 02) Portl and,Oregon:ACM Press,2002 33~4423C Weidenbach T ow ards an automatic analysis of security protocols in first-order logi c In:the16th Int l Conf on Automated Deduc-tion(CADE-16),LNAI1632 T rento,Ital y:Springer-Verlag, 1999 314~328李梦君 男,1975年生,博士研究生,主要研究方向为进程代数理论、安全协议的形式化验证李舟军 男,1963年生,博士,教授,博士生导师,主要研究方向为进程代数理论、安全协议的形式化验证、数据挖掘陈火旺 男,1936年生,教授,博士生导师,中国工程院院士,主要研究方向为软件工程、软件理论11037期李梦君等:基于进程代数安全协议验证的研究综述。
基于串空间模型安全协议形式化分析方法的研究
基于串空间模型安全协议形式化分析方法的研究
董军;杨秀娟;赵艳芹
【期刊名称】《计算机技术与发展》
【年(卷),期】2008(18)4
【摘要】从串空间模型理论人手,提出了三种典型的串空间形式化方法(基于极小元理论的串空间方法、基于理想与诚实理论的串空间方法、基于认证测试理论的串空间方法),并对每一种方法的证明步骤及优缺点进行了分析.在此基础上,应用提出的串空间方法对Yahalom协议的秘密性和认证性进行了分析.分析结果表明利用不同方法的优点,能更好地保证安全协议形式化分析的准确性.
【总页数】5页(P151-154,157)
【作者】董军;杨秀娟;赵艳芹
【作者单位】黑龙江科技学院,计算机与信息工程学院,黑龙江,哈尔滨,150027;黑龙江科技学院,计算机与信息工程学院,黑龙江,哈尔滨,150027;黑龙江科技学院,计算机与信息工程学院,黑龙江,哈尔滨,150027
【正文语种】中文
【中图分类】TP309
【相关文献】
1.RSA-CEMD协议的分析及基于串空间模型的形式化证明 [J], 卜凡金;邢育红
2.基于串空间模型的电子商务协议的形式化分析 [J], 邢育红;卜凡金;李大兴
3.安全协议验证的归纳方法与串空间形式化比较 [J], 乔海燕
4.基于串空间的安全协议形式化验证模型及算法 [J], 周宏斌;黄连生;桑田
5.基于串空间的安全协议形式化分析研究 [J], 姚萌萌; 唐黎; 凌永兴; 肖卫东
因版权原因,仅展示原文概要,查看原文内容请购买。
用串空间分析ZG乐观不可否认协议
用串空间分析ZG乐观不可否认协议
沈海峰
【期刊名称】《小型微型计算机系统》
【年(卷),期】2009(030)010
【摘要】根据公平交换协议和串空间的特点,定义了丛最大(极大)结点、良序丛的概念.依据公平交换协议的消息驱动特征,给出了两方不可否认协议的循环分析流程.分析了ZG乐观不可否认协议并发现了它的缺陷,这个缺陷同样存在于ZG在线TTP 不可否认协议.分析结论中给出了该协议的安全执行需求和消息自由项成分的修正,并提示任何协议的设计应该避免消息中自由项的出现.本文的分析方法适用于其它两方公平交换协议.
【总页数】6页(P1988-1993)
【作者】沈海峰
【作者单位】上海理工大学计算机与电气学院,上海,200093
【正文语种】中文
【中图分类】TP393
【相关文献】
1.Casper/FDR和串空间在物联网通信协议中的形式化分析 [J], 吴名欢;程小辉
2.基于串空间模型的改进型Otway-Rees协议分析 [J], 解颜铭;石曙东;翁艳琴
3.基于串空间的可信计算协议分析 [J], 冯伟;冯登国
4.基于串空间理论的Kerberos协议分析 [J], 魏浩;解争龙;弋改珍
5.基于串空间的安全协议形式化分析研究 [J], 姚萌萌; 唐黎; 凌永兴; 肖卫东
因版权原因,仅展示原文概要,查看原文内容请购买。
基于单向密钥链树的组播密钥更新协议
基于单向密钥链树的组播密钥更新协议
祝烈煌;曹元大
【期刊名称】《北京理工大学学报》
【年(卷),期】2004(24)7
【摘要】分析基于层次K叉树(HKT)的组播密钥更新协议,提出了组员加入和离开通信组时,基于单向密钥链树(OKCT)的组播密钥更新协议,分析了该协议的性能.结果表明,在不增加组控制者和组员密钥存储空间的基础上,该协议将组员加入和离开通信组的密钥更新消息包数分别减少到logkn和(k-1)logkn-1,并且降低了组控制者加密和组员解密密钥更新消息的计算量.
【总页数】4页(P609-612)
【关键词】组播;密钥更新;单向密钥链
【作者】祝烈煌;曹元大
【作者单位】北京理工大学信息科学技术学院计算机科学工程系;北京理工大学软件学院
【正文语种】中文
【中图分类】TP309
【相关文献】
1.基于LKH混合树模型的新型组播密钥更新方案 [J], 管春雷;王斌;殷玲玲;沈洁
2.基于LKH混合树的组播密钥更新方案 [J], 杨焱林
3.基于LT编码的可靠组播密钥更新协议 [J], 周靖哲;赵安军
4.基于LKH树和二值函数的组播密钥更新方案 [J], 黄冬久;唐宝民
5.基于Huffman单向函数树的组播密钥更新协议 [J], 祝烈煌;曹元大
因版权原因,仅展示原文概要,查看原文内容请购买。
OICQ协议分析类
OICQ协议分析类头⽂件:/*********************************************************************************************** OICQ协议分析类* version: 1.0* author: yuzaobo* description: OICQ分析是通过端⼝+特征码来实现的,⽬前版本限定TCP连接Server端⼝为80或443,UDP连接Server端⼝为8000。
每⼀个OICQ协议包均以0x02开头,以0x03结尾。
由于OICQ协议包采⽤加密⽅式在⽹络上传输,因此对OICQ的分析基于⼆进制码。
当OICQ命令为0x00 0xdd(数据包第四位、第五位),数据⽅向为LAN2WAN时,Client向Server发送帐号信息,帐号由四个字节记录,分别为数据包的8-11位由此可以记录登录帐号。
----------------------------------------------| key value || | | || local_accont session_key || packet_number local_account |----------------------------------------------***********************************************************************************************/#ifndef _OICQ_ANALYSIS_H#define _OICQ_ANALYSIS_H#include <map>#include "activeuser.h"#include "netheaders.h"#include "Crypter.h"#include "decode.h"#include "CDataBase.h"#define OICQ_PASSWD_ERR 0x99 // This should lead to policy performing.//#define MSG_ANSI // message saved as ascii, or comment it to use utf8//define message type#define TYPE_LOGIN 0#define TYPE_FRIEND 1#define TYPE_GROUP 2using namespace std;typedef struct tagSessionKey{BYTE skey[16];}SessionKey, *pSessionKey;typedef struct tagOicqPasswd{BYTE passwd[16];}OicqPasswd, *pOicqPasswd;typedef struct tagOicqInfo{char type; // message type: login: 0, friend: 1 and group: 2ULONG local_account;ULONG remote_account;//char direct;char content[20000];} SOicqInfo, *PSOicqInfo;class COicqAnalysis{public:COicqAnalysis();~COicqAnalysis();int Run(const PIPHeader ip_header, const PTCPHeader tcp_header, const char* data, const int direct, \Single_User_App_Details* suad, PSOicqInfo oicq_info);int Run(const PIPHeader ip_header, const PUDPHeader udp_header, const char* data, const int direct, \Single_User_App_Details* suad, PSOicqInfo oicq_info);protected:int _Run(const PIPHeader ip_header, const char* data, USHORT length, const int direct, Single_User_App_Details* suad, PSOicqInfo oicq_info); map<ULONG, SessionKey> m_mapSessionKey; //STL map structure, store QQ session key infomap<unsigned __int64, ULONG>m_mapLocalAccount; //store local account infomap<ULONG, OicqPasswd>m_mapPassword;map<ULONG, ULONG>m_mapGroupNumber; //group interior number -- group exterior number pairCPP⽂件:#include "OicqAnalysis.h"COicqAnalysis::COicqAnalysis(){CDataBase* pDb = new CDataBase();unsigned int count = 0;while(!pDb->ExecuteSql("select * from nboicqaccount")){if (++count > 5) // If it still failed after 5 times, exit{MessageBoxA(NULL, "ExecuteSql Error while get oicq account info!", "Error", MB_ICONERROR | MB_OK);exit(1);}pDb->ExecuteSql("select * from nboicqaccount");}MYSQL_RES* res = pDb->StoreResult();//int num_rows = (int)mysql_num_rows(res);MYSQL_ROW row;while (row = mysql_fetch_row(res)){OicqPasswd oicq_passwd;char temp[3] = "";for (int i = 0; i < 16; i++){char* endptr;temp[0] = row[1][2*i];temp[1] = row[1][2*i+1];oicq_passwd.passwd[i] = (BYTE)strtol(temp, &endptr, 16);}m_mapPassword.insert(map<ULONG, OicqPasswd>::value_type(atoi(row[0]), oicq_passwd));}pDb->FreeResult(res);delete pDb;}COicqAnalysis::~COicqAnalysis(){}//TCPint COicqAnalysis::Run(const PIPHeader ip_header, const PTCPHeader tcp_header, const char *data, const int direct, Single_User_App_Details *suad, PSOicqInfo oicq_info) {if (suad->app_confirm != 2){suad->analysis_count++;}if (suad->remote_port != 443/* && suad->remote_port != 80*/){return USER_ERROR;}USHORT length = ip_header->length - ip_header->headerLength - tcp_header->headerLength;USHORT real_length = ((UCHAR)data[0]<<8) + (UCHAR)data[1];if (length != real_length){return USER_ERROR;}const char* real_data = data + 2;return _Run(ip_header, real_data, length-2, direct, suad, oicq_info);}//UDPint COicqAnalysis::Run(const PIPHeader ip_header, const PUDPHeader udp_header, const char* data, const int direct, Single_User_App_Details* suad, PSOicqInfo oicq_info) {if (suad->app_confirm != 2){suad->analysis_count++;}if (suad->remote_port != 8000){return USER_ERROR;}suad->direct = APPDIR_EXTERIOR; //UDP, could not determine application direction by SYN and ACKint COicqAnalysis::_Run(const PIPHeader ip_header, const char* data, USHORT length, const int direct, Single_User_App_Details* suad, PSOicqInfo oicq_info) {//////////////////////////////////////////////////////////////////////////////////////////////////////////////// 0x00dd(密码验证), 0x00e5(获取登录信息), 0x30(登录验证,获取⽤于整个会话过程的session key)// 0x00cd(发送消息), 0x0017(接收消息)//////////////////////////////////////////////////////////////////////////////////////////////////////////////if (data[0] == 0x02 && data[length-1] == 0x03) // OICQ packet start with 0x02 and end with 0x03{suad->app_id = APPID_QQ;suad->app_confirm = 2;/************************************************************************************************** Password verify(0x00dd): Client --> Server*************************************************************************************************/if (direct == LAN2WAN && data[3] == 0x00 && (UCHAR)data[4] == 0xdd){//get random keyBYTE random_key[16] = "";memcpy(random_key, &(data[11]), 16);//decryptBYTE pbRet[2000] = "";CCrypter crypter;int out_len = crypter.Decrypt((BYTE*)data, 27, length-28, random_key, pbRet, 2000);if (out_len <= 0){OutputDebugStringA("0xdd(LAN2WAN) decrypt packet error.\n");return USER_CONFIRM;}//get encrypted 0x78 bytes keyBYTE encrypted_key[120] = "";memcpy(encrypted_key, &(pbRet[82]), 120);//get password(2 times md5)BYTE passwd_key[16] = "";ULONG local_account = (((UCHAR)data[7])<<24) + (((UCHAR)data[8])<<16) + (((UCHAR)data[9])<<8) + (UCHAR)data[10];map<ULONG, OicqPasswd>::iterator iter_passwd = m_mapPassword.find(local_account);if (iter_passwd == m_mapPassword.end()){OutputDebugStringA("0xdd(LAN2WAN) Registered QQ password is incorrect!\n");oicq_info->local_account = local_account; //alarm, should know QQ numberreturn OICQ_PASSWD_ERR;}else{memcpy(passwd_key, iter_passwd->second.passwd, 16);}//decrypt 0x78 bytes keyBYTE decrypted_key[104] = "";out_len = crypter.Decrypt(encrypted_key, 0, 120, passwd_key, decrypted_key, 104);if (out_len <= 0){OutputDebugStringA("0xdd(LAN2WAN) decrypt 0x78 bytes key error\n");oicq_info->local_account = local_account; //alarm, should know QQ number, ip can get from ip_header.sourcereturn OICQ_PASSWD_ERR; //used for QQ alarm, thus disconnect user from internet}//and store it in m_mapSessionKeySessionKey session_key;memcpy(session_key.skey, &(decrypted_key[88]), 16);map<ULONG, SessionKey>::iterator iter1 = m_mapSessionKey.find(local_account);if (iter1 == m_mapSessionKey.end()){m_mapSessionKey.insert(map<ULONG, SessionKey>::value_type(local_account, session_key));}else //login, modify session key{iter1->second = session_key;}//store ip+port--local_account pair in m_mapLocalAccountunsigned __int64 ip_port = (((unsigned __int64)(ip_header->source))<<32) + suad->local_port; // key = local_ip<<32 + local_ip; so that it's uniquemap<unsigned __int64, ULONG>::iterator iter = m_mapLocalAccount.find(ip_port);if (iter == m_mapLocalAccount.end()){m_mapLocalAccount.insert(map<unsigned __int64, ULONG>::value_type(ip_port, local_account));}elsereturn USER_CONFIRM;}/************************************************************************************************** Password verify(0x00dd): Server --> Client*************************************************************************************************/if (direct == WAN2LAN && data[3] == 0x00 && (UCHAR)data[4] == 0xdd){//find local_accountULONG local_account = 0;unsigned __int64 ip_port = (((unsigned __int64)(ip_header->destination))<<32) + suad->local_port; map<unsigned __int64, ULONG>::iterator iter1 = m_mapLocalAccount.find(ip_port);if (iter1 == m_mapLocalAccount.end()){OutputDebugStringA("0xdd(WAN2LAN): find local_account error.\n");return USER_CONFIRM;}else{local_account = iter1->second;}//find keySessionKey session_key;map<ULONG, SessionKey>::iterator iter2 = m_mapSessionKey.find(local_account);if (iter2 == m_mapSessionKey.end()){OutputDebugStringA("0xdd(WAN2LAN): Read key by local_account error.\n");return USER_CONFIRM;}else{session_key = iter2->second;}//decrypt packetBYTE pbRet[2000] = "";CCrypter crypter;int out_len = crypter.Decrypt((BYTE*)data, 7, length-8, session_key.skey, pbRet, 2000);if (out_len <= 0){OutputDebugStringA("0xdd(WAN2LAN): decrypt error.\n");return USER_CONFIRM;}//get key for next 0x00e5 and insert into m_mapSessionKeymemcpy(session_key.skey, &(pbRet[out_len-18]), 16);map<ULONG, SessionKey>::iterator iter = m_mapSessionKey.find(local_account);if (iter == m_mapSessionKey.end()){OutputDebugStringA("0xdd(WAN2LAN): Modify key by local_account error.\n");return USER_CONFIRM;}else //login, modify session key{iter->second = session_key;return USER_CONFIRM;}}/************************************************************************************************** Login(0x00e5): Server --> Client*************************************************************************************************/if (direct == WAN2LAN && data[3] == 0x00 && (UCHAR)data[4] == 0xe5){//find local_accountULONG local_account = 0;unsigned __int64 ip_port = (((unsigned __int64)(ip_header->destination))<<32) + suad->local_port; map<unsigned __int64, ULONG>::iterator iter1 = m_mapLocalAccount.find(ip_port);if (iter1 == m_mapLocalAccount.end()){OutputDebugStringA("0xe5(WAN2LAN): find local_account error.\n");return USER_CONFIRM;}else{local_account = iter1->second;}//find keySessionKey session_key;map<ULONG, SessionKey>::iterator iter2 = m_mapSessionKey.find(local_account);if (iter2 == m_mapSessionKey.end()){session_key = iter2->second;}//decrypt packetBYTE pbRet[2000] = "";CCrypter crypter;int out_len = crypter.Decrypt((BYTE*)data, 7, length-8, session_key.skey, pbRet, 2000);if (out_len <= 0){OutputDebugStringA("0xe5(WAN2LAN): decrypt error.\n");return USER_CONFIRM;}//get key for next 0x00e5 and insert into m_mapSessionKeymemcpy(session_key.skey, &(pbRet[4]), 16);map<ULONG, SessionKey>::iterator iter = m_mapSessionKey.find(local_account);if (iter == m_mapSessionKey.end()){OutputDebugStringA("0xe5(WAN2LAN): Modify key by local_account error.\n");return USER_CONFIRM;}else //modify session key{iter->second = session_key;return USER_CONFIRM;}}/************************************************************************************************** Login Verify(0x0030): Server --> Client*************************************************************************************************/if (direct == WAN2LAN && data[3] == 0x00 && (UCHAR)data[4] == 0x30){//find local_accountULONG local_account = 0;unsigned __int64 ip_port = (((unsigned __int64)(ip_header->destination))<<32) + suad->local_port; map<unsigned __int64, ULONG>::iterator iter1 = m_mapLocalAccount.find(ip_port);if (iter1 == m_mapLocalAccount.end()){OutputDebugStringA("0x30(WAN2LAN): find local_account error.\n");return USER_CONFIRM;}else{local_account = iter1->second;}//find keySessionKey session_key;map<ULONG, SessionKey>::iterator iter2 = m_mapSessionKey.find(local_account);if (iter2 == m_mapSessionKey.end()){OutputDebugStringA("0x30(WAN2LAN): Read key by local_account error.\n");return USER_CONFIRM;}else{session_key = iter2->second;}//decrypt packetBYTE pbRet[2000] = "";CCrypter crypter;int out_len = crypter.Decrypt((BYTE*)data, 7, length-8, session_key.skey, pbRet, 2000);if (out_len <= 0){OutputDebugStringA("0x30(WAN2LAN): decrypt error.\n");return USER_CONFIRM;}//get session key and insert into m_mapSessionKeymemcpy(session_key.skey, &(pbRet[1]), 16);map<ULONG, SessionKey>::iterator iter = m_mapSessionKey.find(local_account);if (iter == m_mapSessionKey.end()){OutputDebugStringA("0x30(WAN2LAN): Modify key by local_account error.\n");//return USER_CONFIRM;}else //modify session key{iter->second = session_key;//return USER_CONFIRM;oicq_info->remote_account = 0;strcpy(oicq_info->content, "<Login>");return USER_SUCCEED;}/************************************************************************************************** Send Friend Message(0x00cd): Client --> Server*************************************************************************************************/if (direct == LAN2WAN && data[3] == 0x00 && (UCHAR)data[4] == 0xcd){ULONG local_account = (((UCHAR)data[7])<<24) + (((UCHAR)data[8])<<16) + (((UCHAR)data[9])<<8) + (UCHAR)data[10]; map<ULONG, SessionKey>::iterator iter = m_mapSessionKey.find(local_account);if (iter == m_mapSessionKey.end()){OutputDebugStringA("0xcd(LAN2WAN): Read key by local_account error.\n");return USER_CONFIRM;}else //modify session key{BYTE pbRet[2000] = "";CCrypter crypter;int out_len = crypter.Decrypt((BYTE*)data, 11, length-12, iter->second.skey, pbRet, 2000);if (out_len <= 0){OutputDebugStringA("0xcd(LAN2WAN): decrypt error.\n");return USER_CONFIRM; // should change another code, used for QQ alarm}if (out_len < 96){OutputDebugStringA("0xcd(LAN2WAN):Invalid receive message.\n");return USER_CONFIRM;}if (pbRet[11] == 0x08) //send to QQ2008{USHORT fontname_len = (pbRet[89]<<8) +pbRet[90];if (pbRet[46] == 0x00 && pbRet[47] == 0x0b && pbRet[93+fontname_len] == 0x01){ULONG remote_account = (pbRet[4]<<24) + (pbRet[5]<<16) + (pbRet[6]<<8) + pbRet[7];oicq_info->type = TYPE_FRIEND;oicq_info->local_account = local_account;oicq_info->remote_account = remote_account;USHORT message_len = (pbRet[97+fontname_len]<<8) +pbRet[98+fontname_len];memset(oicq_info->content, 0, 2000);memcpy(oicq_info->content, &(pbRet[99+fontname_len]), message_len);#ifdef MSG_ANSICDeCode decoder;decoder.Utf8ToGB2312(oicq_info->content, 1999);decoder.ReplaceChar("'", "''", oicq_info->content, 1999);decoder.ReplaceChar("\\", "\\\\", oicq_info->content, 1999);#endifreturn USER_SUCCEED;}else{return USER_CONFIRM;}}else //send to QQ2009{USHORT len = (pbRet[20]<<8) +pbRet[21];USHORT fontname_len = (pbRet[91+len]<<8) +pbRet[92+len];if (pbRet[48+len] == 0x00 && pbRet[49+len] == 0x0b && pbRet[95+len+fontname_len] == 0x01){ULONG remote_account = (pbRet[4]<<24) + (pbRet[5]<<16) + (pbRet[6]<<8) + pbRet[7];oicq_info->type = TYPE_FRIEND;oicq_info->local_account = local_account;oicq_info->remote_account = remote_account;USHORT message_len = (pbRet[99+len+fontname_len]<<8) +pbRet[100+len+fontname_len];memset(oicq_info->content, 0, 2000);memcpy(oicq_info->content, &(pbRet[101+len+fontname_len]), message_len);#ifdef MSG_ANSI{return USER_CONFIRM;}}}}/************************************************************************************************** Send Group Message(0x0002): Client --> Server*************************************************************************************************/if (direct == LAN2WAN && data[3] == 0x00 && (UCHAR)data[4] == 0x02){ULONG local_account = (((UCHAR)data[7])<<24) + (((UCHAR)data[8])<<16) + (((UCHAR)data[9])<<8) + (UCHAR)data[10]; map<ULONG, SessionKey>::iterator iter = m_mapSessionKey.find(local_account);if (iter == m_mapSessionKey.end()){OutputDebugStringA("0x02(LAN2WAN): Read key by local_account error.\n");return USER_CONFIRM;}else //modify session key{BYTE pbRet[2000] = "";CCrypter crypter;int out_len = crypter.Decrypt((BYTE*)data, 11, length-12, iter->second.skey, pbRet, 2000);if (out_len <= 0){OutputDebugStringA("0x02(LAN2WAN): Could not decrypted, this may be caused by the error password.\n");return USER_CONFIRM; // should change another code, used for QQ alarm}if (pbRet[0] == 0x72 && pbRet[1] == 0x00) //sub command: group info{ULONG interior_number = (pbRet[2]<<24) + (pbRet[3]<<16) + (pbRet[4]<<8) + pbRet[5]; //interior group numberULONG exterior_number = (pbRet[6]<<24) + (pbRet[7]<<16) + (pbRet[8]<<8) + pbRet[9];map<ULONG, ULONG>::iterator iter = m_mapGroupNumber.find(interior_number);if (iter == m_mapGroupNumber.end()){m_mapGroupNumber.insert(map<ULONG, ULONG>::value_type(interior_number, exterior_number));return USER_CONFIRM;}else{return USER_CONFIRM;}}else if (pbRet[0] == 0x2a) //sub command: send message{if (pbRet[1] == 0x00) //result is 00{return USER_CONFIRM;}ULONG interior_number = (pbRet[1]<<24) + (pbRet[2]<<16) + (pbRet[3]<<8) + pbRet[4]; //interior group numberULONG exterior_number = 0;map<ULONG, ULONG>::iterator iter = m_mapGroupNumber.find(interior_number);if (iter == m_mapGroupNumber.end()){OutputDebugStringA("0x02(LAN2WAN): Find exterior number by interior number error.\n");//return USER_CONFIRM;}else{exterior_number = iter->second;}oicq_info->type = TYPE_GROUP;oicq_info->local_account = local_account;oicq_info->remote_account = exterior_number;USHORT font_len = (pbRet[41]<<8) + pbRet[42];USHORT content_len = (pbRet[49+font_len]<<8) + pbRet[50+font_len];memset(oicq_info->content, 0, 2000);memcpy(oicq_info->content, &(pbRet[51+font_len]), content_len);#ifdef MSG_ANSI{return USER_CONFIRM; //other group command}}}/************************************************************************************************** Receive Message QQ2008 or Receive Group Message QQ2009(0x0017): Server --> Client*************************************************************************************************/if (direct == WAN2LAN && data[3] == 0x00 && (UCHAR)data[4] == 0x17){//find local_accountULONG local_account = 0;unsigned __int64 ip_port = (((unsigned __int64)(ip_header->destination))<<32) + suad->local_port; map<unsigned __int64, ULONG>::iterator iter1 = m_mapLocalAccount.find(ip_port);if (iter1 == m_mapLocalAccount.end()){OutputDebugStringA("0x17(WAN2LAN): find local_account error.\n");return USER_CONFIRM;}else{local_account = iter1->second;}//find keySessionKey session_key;map<ULONG, SessionKey>::iterator iter2 = m_mapSessionKey.find(local_account);if (iter2 == m_mapSessionKey.end()){OutputDebugStringA("0x17(WAN2LAN): Read key by local_account error.\n");return USER_CONFIRM;}else{session_key = iter2->second;}//decrypt packetBYTE pbRet[2000] = "";CCrypter crypter;int out_len = crypter.Decrypt((BYTE*)data, 7, length-8, session_key.skey, pbRet, 2000);if (out_len <= 0){OutputDebugStringA("0x17(WAN2LAN): decrypt error.\n");return USER_CONFIRM;}/*--------------------- Analysis module-------------------------------*///if (pbRet[24] == 0x12 && pbRet[25] == 0x21) //by versionif (pbRet[18] == 0x00 && pbRet[19] == 0x09) //QQ2008: Friend Message, by im type{if (out_len < 52){OutputDebugStringA("0x17(WAN2LAN):Invalid receive message.\n");return USER_CONFIRM;}USHORT len = (pbRet[22]<<8) +pbRet[23];if (pbRet[50+len] == 0x00 && pbRet[51+len] == 0x0b && pbRet[69+len] != 0x14) //not face{ULONG remote_account = (pbRet[0]<<24) + (pbRet[1]<<16) + (pbRet[2]<<8) + pbRet[3];oicq_info->type = TYPE_FRIEND;oicq_info->local_account = local_account;oicq_info->remote_account = remote_account;memset(oicq_info->content, 0, 2000);strcpy(oicq_info->content, (const char*)&(pbRet[69+len]));#ifndef MSG_ANSICDeCode decoder;decoder.GB2312ToUtf8(oicq_info->content, 1999);decoder.ReplaceChar("'", "''", oicq_info->content, 1999);decoder.ReplaceChar("\\", "\\\\", oicq_info->content, 1999);#endifreturn USER_SUCCEED;}else if (pbRet[18] == 0x00 && pbRet[19] == 0x2b) //QQ2008 Group message{if (out_len < 58){OutputDebugStringA("0x17(WAN2LAN):Invalid receive group message.\n");return USER_CONFIRM;}USHORT len = (pbRet[22]<<8) +pbRet[23];ULONG remote_account = (pbRet[29]<<24) + (pbRet[30]<<16) + (pbRet[31]<<8) + pbRet[32];if (remote_account == local_account) //filter{return USER_CONFIRM;}oicq_info->type = TYPE_GROUP;oicq_info->local_account = local_account;oicq_info->remote_account = remote_account;memset(oicq_info->content, 0, 2000);strcpy(oicq_info->content, (const char*)&(pbRet[57+len]));#ifndef MSG_ANSICDeCode decoder;decoder.GB2312ToUtf8(oicq_info->content, 1999);decoder.ReplaceChar("'", "''", oicq_info->content, 1999);decoder.ReplaceChar("\\", "\\\\", oicq_info->content, 1999);#endifreturn USER_SUCCEED;}else if (pbRet[18] == 0x00 && pbRet[19] == 0x52) //QQ2009: Group Message{if (out_len < 92){OutputDebugStringA("0x17(WAN2LAN):Invalid receive group message.\n");return USER_CONFIRM;}else{ULONG interior_number = (pbRet[0]<<24) + (pbRet[1]<<16) + (pbRet[2]<<8) + pbRet[3]; //interior group number ULONG exterior_number = (pbRet[24]<<24) + (pbRet[25]<<16) + (pbRet[26]<<8) + pbRet[27];//maintain interior-exterior mapmap<ULONG, ULONG>::iterator iter = m_mapGroupNumber.find(interior_number);if (iter == m_mapGroupNumber.end()){m_mapGroupNumber.insert(map<ULONG, ULONG>::value_type(interior_number, exterior_number));}oicq_info->type = TYPE_GROUP;//ULONG local_account = (pbRet[4]<<24) + (pbRet[5]<<16) + (pbRet[6]<<8) + pbRet[7];ULONG remote_account = (pbRet[29]<<24) + (pbRet[30]<<16) + (pbRet[31]<<8) + pbRet[32];//oicq_info->local_account = exterior_number;oicq_info->local_account = local_account;//oicq_info->remote_account = exterior_number;oicq_info->remote_account = remote_account;if (remote_account == local_account) //filter{return USER_CONFIRM;}USHORT font_len = (pbRet[81]<<8) + pbRet[82];USHORT content_len = (pbRet[89+font_len]<<8) + pbRet[90+font_len];memset(oicq_info->content, 0, 2000);memcpy(oicq_info->content, &(pbRet[91+font_len]), content_len);#ifdef MSG_ANSICDeCode decoder;decoder.Utf8ToGB2312(oicq_info->content, 1999);decoder.ReplaceChar("'", "''", oicq_info->content, 1999);decoder.ReplaceChar("\\", "\\\\", oicq_info->content, 1999);#endifreturn USER_SUCCEED;}}else{return USER_CONFIRM;}}//find local_accountULONG local_account = 0;unsigned __int64 ip_port = (((unsigned __int64)(ip_header->destination))<<32) + suad->local_port;map<unsigned __int64, ULONG>::iterator iter1 = m_mapLocalAccount.find(ip_port);if (iter1 == m_mapLocalAccount.end()){OutputDebugStringA("0x17(WAN2LAN): find local_account error.\n");return USER_CONFIRM;}else{local_account = iter1->second;}//find keySessionKey session_key;map<ULONG, SessionKey>::iterator iter2 = m_mapSessionKey.find(local_account);if (iter2 == m_mapSessionKey.end()){OutputDebugStringA("0x17(WAN2LAN): Read key by local_account error.\n");return USER_CONFIRM;}else{session_key = iter2->second;}//decrypt packetBYTE pbRet[2000] = "";CCrypter crypter;int out_len = crypter.Decrypt((BYTE*)data, 7, length-8, session_key.skey, pbRet, 2000);if (out_len <= 0){OutputDebugStringA("0x17(WAN2LAN): decrypt error.\n");return USER_CONFIRM;}if (out_len < 98){OutputDebugStringA("0x17(WAN2LAN):Invalid receive message.\n");return USER_CONFIRM;}USHORT len = (pbRet[22]<<8) +pbRet[23];USHORT fontname_len = (pbRet[93+len]<<8) +pbRet[94+len];if (pbRet[18] == 0x00 && pbRet[19] == 0xa6 && pbRet[50+len] == 0x00 && pbRet[51+len] == 0x0b && pbRet[97+len+fontname_len] == 0x01){ULONG remote_account = (pbRet[0]<<24) + (pbRet[1]<<16) + (pbRet[2]<<8) + pbRet[3];oicq_info->type = TYPE_FRIEND;oicq_info->local_account = local_account;oicq_info->remote_account = remote_account;memset(oicq_info->content, 0, 2000);ULONG message_len = (pbRet[101+len+fontname_len]<<8) +pbRet[102+len+fontname_len];memcpy(oicq_info->content, &(pbRet[103+len+fontname_len]), message_len);#ifdef MSG_ANSICDeCode decoder;decoder.Utf8ToGB2312(oicq_info->content, 1999);decoder.ReplaceChar("'", "''", oicq_info->content, 1999);decoder.ReplaceChar("\\", "\\\\", oicq_info->content, 1999);#endifreturn USER_SUCCEED;}else{return USER_CONFIRM;}}//================================================================================================================================ return USER_CONFIRM; // OICQ protocol}else{return USER_ERROR; // not OICQ protocol}}。
XTR公钥密码体制概述
#$% 是基于大数分解的困难性 假 定 "&’()*)’ 是 基 于 有 限 域 上
的 求 离 散 对 数 难 题 "&++ 是 基 于 椭 圆 曲 线 上 的 求 离 散 对 数 难 题 ! ,--- 年 "./0123) 等 人 提 出 了 基 于 求 有 限 域 上 元 素 的 迹 函 数离散对数难题的 45# 公钥密码体制 ! 该体制运算速度快 " 资 源占用量少 " 成为近年来研究的热点 ! 本 文 介 绍 了 公 钥 密 码 体 制 的 发 展 史 " 着 重 分 析 了 #$%"
"
引言
公钥密码体制的发展是整个密码学历史上最大的而且也
密钥密码体制的概念 " 给密码学专家提出了一个设计满足此公 钥密码体制要求的密码算法的挑战 ! 首先响应这一挑战之一的 是 美 国 麻 省 理 工 学 院 的 #:0 #;</12 "%=; $>)*;3 和 ./0
许是惟一真正的革命 ! 从最初一直到现代 " 几乎所有的密码体 制都是建立在基本的替代和置换工具的基础上的 " 而公钥密码 体制则与以前所有方法都截然不同 # 一方面公开密钥算法是基 于数学难题而不是替代和置换 $ 另一方面 " 它是非对称的 " 用到 两个不同的密钥 " 即公开秘钥和秘密秘钥 ! 建立一个公钥密码 体 制 本 质 在 于 寻 找 一 个 函 数 "该 函 数 易 于 计 算 "但 其 逆 运 算 是 计 算 上 不 可 行 的 " 除 非 再 已 知 某 些 附 加 信 息 % 比 如 秘 密 密 钥 &! 当附加上这些信息后 " 求逆运算可以在多项式时间内完成 ! 现 有的公钥密码体制的分类正是基于不同的陷门单向函数的#
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于串空间的KryptoKnight协议分析及与逻辑化方法的比较荣昆李益发(信息工程大学 河南 郑州 450002)摘要: 网络安全在信息时代非常重要,而网络安全的关键问题之一是安全协议. 本文通过串空间模型对KryptoKnight协议进行了分析, 得出该协议是安全的. 并对串空间模型和BAN逻辑方法进行了比较.关键词: KryptoKnight 串空间安全协议中图分类号:TP309文献标识码:A1 引言随着科学技术, 特别是因特网的迅猛发展, 数字化﹑电子化的趋势已经波及社会生活的几乎所有方面.安全协议是使用密码技术的网络通信协议. 随着网络时代的发展, 特别是各种安全协议的不断出现, 如何准确的分析协议变得尤为重要. 目前, 采用形式化方法来分析安全协议, 这些方法分为3类[2]:推导构造法, 利用逻辑推理来分析协议主体的知识和信任的演化情况,比如BAN 逻辑[3];攻击构造法,利用协议的代数属性建立可能的攻击集合,比如文献[4];证明构造法,证明协议满足其安全性要求,比如文献[5].在文献[5]中, Thayer, Herzog和Guttman提出了分析协议的串空间(Strand Space)模型, 并且证明了Needham-Schroeder-Lowe协议的正确性, 随后在文献[6]中, 作者又对串空间进行了拓展, 给出了理想(Ideal)的概念, 并对Otway-Rees协议进行了分析. KryptoKnight协议是用Hash函数进行身份认证的一个安全协议, 在文章的第3节将给出对其的分析.本文第2节本文简介Strand空间模型和认证协议的正确性概念, 确定协议证明的目标.第3节给出用Strand空间模型证明KryptoKnight协议的过程. 第4节对串空间方法与逻辑化方法进行了比较. 第5节总结全文.2 串空间(Strand Space)模型[5]2.1 项(term)和子项(subterm)定义2.1 设A表示协议的所有参与者之间传送的消息的全体组成的集合, 称A为消息空间, A 中的元素称为消息项.项可由原子项经过级连和加密得到, 原子项可分为文本项T和密钥项K. A可由下面三种运算生成:z加密运算encr: K×A→Az级联运算join: A×A→Az密钥的逆运算inv: K→Kz对信息的压缩hash: A→ A密钥逆运算将公私钥对中的一个映成另一个, 把对称密钥映成自己. 为了方便, 把encr(K,m) 记为{m}K, inv(K)记为K-1, join(a,b)记为ab, hash(a)记为H(a). 把encr的像空间encr(K× A)记作E, 称为密文空间,hash的像空间hash(A)记为H,而把K∪T∪E∪H中的消息项称为A上的简单项. 在消息空间中, 可以定义A中元素的包含关系⊏如下:定义2.2 设A是一信息空间, 递归的定义A中元素的包含关系⊏如下:(1) 若a∈T, 则a⊏a;(2) 若a⊏g或a⊏h, 则a⊏gh;(3) 若h⊏g, 则b⊏{g}K;(4) a⊏gh iff a⊏g or a⊏h or a=gh(5) 若h⊏H(g), 则h⊏g.其中h,g∈A, k∈K.显然, ⊏是一种传递﹑反身的关系.2.2 串,串空间和丛(Bundle)串是协议角色的一个实例. 串空间定义如下:定义2.3 符号项是一个有序对〈σ,t〉, t∈A, σ为+或−, 记作+t或−t, +t表示发出项t; −t表示接收到项t. (±A)*是符号项的有限序列的集合.定义2.4 设A是一个信息空间. 定义A上的一个串空间为一个集合∑和一个迹映射tr: ∑→(±A)*组成的二元组(∑,tr), z中的元素称为这个串空间中的串.定义2.5 给定一个串空间∑(1) 结点是一个有序对〈s,i〉, s∈∑, i满足1≤i≤length((tr(s))). 结点(node)n=〈s,i〉属于串s,表示为n∈s, 并把该节点在s中的序号记为index(n)=i. 结点的集合记为N. 显然每一个节点属于唯一一个串.(2)如果n=〈s,i〉∈N, 那么index(n)=i, 定义term(n)为(tr(s))i, 即串s的第i个符号项. 类似的, unsterm(n)是指((tr(s)i)2, 即s的迹中第i项的无符号部分.(3)n1,n2∈N, 那么n1→n2表示term(n1)=+a, term(n2)= −a, 其中a∈A. 也就是说节点n1发送消息a, 节点n2接收消息a.(4)n1,n2∈N, 那么n1⇒n2表示n1, n2属于同一个串s, 且index(n2)=index(n1)+1. 这时称n1是n2的直接因果前驱.(5)一个无符号项t包含于节点n∈N iff t⊏term(n).(6)项t从结点n产生,当且仅当sign(n)=+t; term(n);而且对于同一个串上任何先于n的结点n′, t⊏term(n′).(7)一个无符号项t是惟一产生,当且仅当t产生于惟一的结点n∈N.所以, 串空间构成一个有向图(N,E), N是结点集合, 边E=(→∪⇒). 丛代表协议可能的运行模式, 它是有向图(N,E)的子图.定义2.6C⊆E是边的集合, N C⊆N是由C中边相连的结点集合, C是丛, 如果(1) C是有限集.(2) 如果n2∈N C,且term(n1)的符号为负, 那么有惟一n1,满足n1→n2∈N C.(3) 如果n2∈N C,且有n1⇒n2,那么n1⇒n2∈N C.(4) C是无环的.因为C是一个图,所以在边→和⇒下, 结点的关系形成偏序关系,表示为°C.2.3 攻击者模型定义2.7 一个攻击者迹是指下列形式之一:(1) M.产生原子文本消息: 〈+t〉,t∈T.(2) F.接收消息: 〈−g〉.(3) T.接收并多次发送消息: 〈−g,+g,+g〉.(4) C.级连收到的消息: 〈−g, −h, +gh〉.(5) S.分割收到的消息: 〈−gh, +g, +h〉.(6) K.发送密钥: 〈+K〉, K∈K℘.(7) E.加密消息: 〈−Κ, −h, +{h}K〉.(8) D.解密消息: 〈−Κ−1, −{h}K, +h〉.(9) H. 消息压缩: 〈−h, +H(h) 〉.其中,K℘表示攻击者的密钥集合, 包括所有的公钥K i, 攻击者所知道的所有私钥K P−1及x的共享的对称密钥K px.定义2.8 一个渗透空间一个二元对(∑,P), 其中∑是一个串空间, P⊆∑使得对于所有的p∈P, tr(p)是一个攻击者的迹.2.4 基本假设与基本引理公理1 m1,m2∈A且K1,K2∈K, 那么{m1}K1={m2}K2⇔m1=m2, K1=K2公理2 若h1,h2∈A, 那么有H(h1)=H(h2) ⇔h1= h2公理3 对于m1,m2,m3,m4∈A且K1,K2∈K(1)m1m2=m3m4⇒m1=m3, m2=m4;(2)m1m2≠{m3}K;(3)m1m2∉K∪T∪H;(4){m1}K∉K∪T∪H;(5)H(m1)∉K∪T∪E.引理2.1 假设C是一个丛, 则C的任何非空结点子集在°C下都有最小元.引理2.2 假设C是一个丛, S⊆C是一个节点集使得:任意m,m', unsterm(m)=unsterm(m')意味着m∈S当且仅当m'∈S. 若n是S的一个°C 极小元, 则n的符号为正.引理2.3 假设C是一个丛, t∈A且n∈C是集合{m∈C: t⊏term(m)}的一个极小元, 则t产生于节点n.2.5 认证目标(1)强一致性条件:协议保证参与者B(响应者)就某个数据项X达成一致, 如果:每次B作为响应者使用数据X与它所认为的A(发起者)完成一轮协议执行时, 确实存在惟一的一轮协议执行, 其中A作为发起者也使用X, 并且认为它的响应者为B .(2)弱一致性条件:每次B作为响应者使用数据X与它所认为的A(发起者)完成一轮协议执行时, 确实存在一轮协议执行, 其中A作为发起者也使用X, 并且认为它的响应者为B.二者区别是若一致性条件不保证协议执行的唯一性, 不能防止A执行了多轮与B对应的协议, 而B只执行了一轮. 类似地, 对于发起者也存在同样的一致性条件.(3)保密属性: 数据x是保密的, 若对于串空间∑中的每一个节点n, 不存在n的组件(Component [8])t0, 使得t0=x.3 KryptoKnight协议的分析KryptoKnight协议的形式如下:1.A→B: ABN a2.B→A: BAN b H(N a N b BK ab)3.A→B: AB H(N a N b K ab)其中H(X)表示对数据X进行Hash.定义3.1 一个渗透空间(∑,P)是一个KryptoKnight空间, 如果∑是下面三种串的集合:1.攻击者串s∈P;2.发起者串Init[A,B,N a,N b,K ab], 且它的迹为〈+ABN a , −BAN b H(N a N b BK ab), +AB H(N a N b K ab)〉3.响应者串Resp[A,B,N a,N b,K ab], 且它的迹为〈−ABN a , +BAN b H(N a N b BK ab), −AB H(N a N b K ab)〉其中A,B∈T name,Νa,Νb∈T, 但是Νa,Νb∉ T name. 这里T name⊆T表示名字的集合. 定义3.2 设A是一信息空间, 递归的定义A中元素的包含关系⊏如下:(1) 若a∈T, 则a⊏a;(2) 若a⊏g或a⊏h, 则a⊏gh.(3) 若h⊏g, 则b⊏{g}K;(4) 若a⊏H(h), 则a⊏h.其中h,g∈A, k∈K.下面就可以对KryptoKnight协议进行分析:由于本协议中除了的原子项除了K ab外, 其他都没有要求保密性, 而K ab是A和B之间的共享密钥, 且只在进行Hash时才用到, 因此本协议中无数据要进行保密性认证.3.1响应者的认证作如下假设:1.∑是一个KryptoKnight空间,从C有一个响应者串s且迹为Resp[A,B,N a,N b,K ab];2.K ab∉K℘;3.N a≠N b,且K ab在∑中是唯一产生的.命题3.1K ab唯一产生于节点〈s,2〉.命题3.2集合S={n ∈C: K ab⊏term(n)且H(N a N b BK ab)term(n)}有一个°极小元n2. 且节点n2是常规(regular)的,符号为正.证明:显然, 集合S是非空的, 因为〈s,3〉属于S. 那么S有一个极小元n2, 且符号为正. 若n2在一个攻击者串p中, 那么:M. tr(p)的迹为〈+t〉, 其中t∈T, 那么就有t=K ab. 那么K ab就产生于这个串, 与K ab唯一产生矛盾;F. tr(p)的迹为〈−g〉, 没有正节点;T. tr(p)的迹为〈−g,+g, +g〉, 正节点不是极小产生的;C. tr(p)的迹为〈−g,−h,+gh〉, 正节点不是极小产生的;K. tr(p)的迹为〈+K 0〉, 且K0∈K℘,但是K ab K0, 因此这种情况也不会发生;H. tr(p)的迹为〈−h,+H(h)〉. 假设K ab⊏H(h)且H(N a N b BK ab)H(h). 因为K ab≠H(h), 那么K ab⊏h,但H(N a N b BK ab)h,因此矛盾。