◆曹龙龙
基于属性加解密通信系统的设计与实现
◆曹龙龙
(山东农业大学信息科学与工程学院 山东 271000)
为了实现用户双方通信的安全和保密性,将属性加密用于实际应用中,通过OpenABE加密算法,使用流式套接字编程,实现了一方加密消息发送,另一方接收并解密消息。为了实现对端交互通信和任意一方加解密,引入了CryptHook通信方式,通过socket劫持,实现了对端加解密交互通信系统,通过运行测试,系统加解密消息均正常,实现了双方保密通信。
属性加密;OpenABE;流式套接字;CryptHook
属性加密(ABE),是一种新的公钥加密算法。最先由Waters提出,被看作是最具前景的支持细粒度访问的加密源语[1]。张文芳[2]提出了基于CP-ABE(密文策略属性基加密)的属性撤销方案。该方案中设计了高效的重加密算法,引入了属性撤销列表,实现了细粒度的属性直接撤销。文献[3]是国外研究者基于Event-B方法,通过先验的形式验证,提出了一种基于属性的访问控制的正确构造模型。本文结合属性加密的基本原理,使用OpenABE加密算法和流式套接字编程技术,实现了一个对端加解密交互通信程序。
本系统为基于属性加解密的对端通信程序,主要功能为:发送方对消息加密形成密文,之后发送给接收方,接收方收到密文后进行解密,得到原消息。该系统的总体架构如图1所示。
图1 系统总体架构图
图1显示了该系统加解密的全过程。用户A作为服务端,输入明文,明文通过公共参数加密得到密文,服务端将密文发送出去;用户B作为客户端,接收密文,并通过产生的私钥解密,还原得到原明文,从而实现了加密通信。
2.2.1 ABE的预备知识
ABE(基于属性的加密),一种更广泛的公钥加密类型,是一种模糊的基于身份加密的方案。在ABE体制中,用属性集合来标识一个用户的身份,多种不同的属性组成就可以方便地表示某一些具有共同属性的用户组身份,从而可以实现一对多的加密通信。
ABE在密文和密钥中引入了访问结构(又称策略)。根据策略嵌入对象不同,又可分成KP-ABE和CP-ABE。前者的策略在密钥中,属性集合在密文中;而后者的策略在密文中,属性集合在密钥中。
KP-ABE将策略嵌入了密钥,密文用属性加密存放在服务器,当允许用户得到某种消息时,就分配一个特定的策略给用户。同时,用户若想解密多个文件,则要有多个匹配的密钥,这种方式多用于日志加密的管理及付费网站。
CP-ABE将策略嵌入了密文,因此Owner可以设定访问密文的策略,限定只有拥有特定属性的用户才能访问密文。CP-ABE对数据做了粒度可细化到属性的访问控制,因此多用于细粒度的数据共享和属性撤销,在属性加密机制中比较常用。
ABE包含四个基本算法:
(1) Setup(K,U):输入安全参数K和系统属性全集U,输出公共参数Params和主密钥mk;
(2) KeyGen(mk,X):输入mk和权限索引X,输出密钥skx;
(3) Enc(Params,Y,M):输入Params、密文索引Y和明文M,输出密文CTy;
(4) Dec(Params,skx,CTy):输入Params、skx和CTy,输出解密后的结果M’。
在CP-ABE中,X表示用户的属性集合,密文索引Y表示策略,只有X是Y的授权集,X满足Y。解密成功,当且仅当 Dec(Params,KeyGen(mk,X),Enc(Params,Y,M))=M成立。
2.2.2 OpenABE加密方案的流程分析
OpenABE(开放的属性加密),是一个基于C/C++的加密库,支持基椭圆曲线和双线性操作。它实现了多种属性加密的方案,提供了数学API(ZML),方便了用户的操作。实现加密的基本流程如下:
初始化OpenABE库
选择一种ABE加密算法构建上下文
生成ABE设置参数(主公共参数)
加密明文数据和主公共参数
解密密文和用户私钥(密钥机构产生)
卸载OpenABE库
本系统是在Ubuntu 16.04.5 –server虚拟机环境下开发的,通过SSH模拟工具Termius进行本地测试。
首先,服务端创建监听套接字,经过三次握手建立TCP连接。两端分别初始化openabe库,并构建CP-ABE上下文。
服务端调用generateParams()函数产生主公共参数和主密钥参数,调用keygen()函数生成用户私钥key0,用来解密消息。服务端将主公共参数导出并通过write()函数发送给客户端,用于加密使用。
客户端收到主公共参数后导入上下文,调用encrypt()函数将输入的明文加密形成密文,并将密文发送给服务端。
服务端接收密文后,调用decrypt()函数,引入私钥key0进行解密,将解密消息输出到控制台,一轮通信结束。实现核心函数如下:
采用策略树加密,将明文pt1加密后存入ct。
使用用户私钥key0解密,将密文ct解密后存入pt2。
在上述实现过程中,系统只能在一端加密或解密,只能由客户端发送消息给服务器,失去了交互性,这不符合实际场景的应用。为解决该问题,引入了CryptHook。
CryptHook是一个模块化的实现,它将网络通信中的收发函数和加解密函数封装起来,通过劫持send/sendto和recv/recvfrom基本系统调用,屏蔽掉TCP通信的accept、connect、listen函数,实现了直接互发消息。同时,使用对称分组密码加密,保证了程序的安全性。劫持实现的核心函数如下:
该函数本质上是一个回调函数,当使用自定义函数时,可以自动回调系统函数。通过动态链接库操作句柄和标志,返回标志对应函数执行代码的地址。因此,只需在收发函数中分别调用该函数并将标志参数分别设为“recv”、“recvfrom”、“send”、“sendto”,就可自动回调系统函数实现收发消息。
在之前的加解密系统中,加密方先加密消息再发送给对方,解密方先接收消息再进行解密。因此,可重新定义收发消息函数与加解密函数。在send/sendto函数中调用自定义的encrypt_data()函数,并保证调用顺序在dlsym()函数之前。同理,在recv/recvfrom函数中调用自定义的decrypt_data()函数,并保证调用顺序在dlsym()函数之后。
通过上述实现,就可以满足任意一方加解密并收发消息,实现了真正的交互加解密通信。重新编译源文件,执行程序,运行结果如图2所示。
图2 系统运行结果图
本文实现了基于属性加密、解密的通信系统。通过引入socket劫持,实现了对端交互,同时无须建立连接即可实现通信,降低了时间开销,提高了运行效率。当前属性加密存在着属性门槛设置通用性差、双线性映射耗费时间等问题亟待解决。属性加密在区块链、云计算等前沿领域应用仍然潜力巨大。
[1]Proc Eurocrypt.Fuzzy Identity Based Encryption[J]. 2005, 3494:457-473.
[2]张文芳,陈桢,刘旭东,王小敏.支持细粒度属性直接撤销的CP-ABE方案[J].软件学报,2019,30(09):2760-2771.
[3]HaniaGadouche,ZoubeyrFarah,AbdelkamelTari. A correct-by-construction model for attribute-based access control[J]. Cluster Computing,2019(prepublish).