2024年1月16日发(作者:)

哈尔滨工程大学软件安全大作业

Linux下基于CPABE

的共享文件加密策略

院 (系)名 称: 计算机科学与技术学院

专 业 名 称: 计算机科学与技术

学 生 姓 名: 刘欣卓

学 生 学 号: 2009142212

指 导 教 师: 赵靖

2013年5月

1

摘 要

随着Internet互联网络带宽的增加,传输文集几乎成为人们每天都需要做的工作。然而,如果网络传输不加密文件是很不安全的。加密的话,基本上是1对1,如何做到加密与权限控制两者和一呢,这就需要基于属性的加密即ABE加密。

关键词:ABE加密 传输加密 混合加密 CPABE

注:本次作业系统基于乌班图12.10

2

第1章:绪论

1.1 概述

ABE加密即基于属性加密,CPABE即基于属性的公钥加密,在这次作业中我采用的就是CPABE基于属性的公钥加密,其好处在于,1次加密,多次解密,实现权限控制与加密的统一化。当解密一个文件时,只有在密钥中具备加密时所设定的属性,才可对其进行解密。

在这次作业中,遭遇了很多困难,经过多次测试与筛选,选在了在乌班图12.10下,利用脚本语言完成。因为我以前很少在Linux下进行实验,因此给自己带来很多困难。

1、脚本语言,这门语言是现学的,虽然不难,但是功能真的十分强大。

2、单引号、双引号、反引号,这3个符号很讨厌,因为其用处与限制各不相同,尤其实在脚本语言中。

3、CPABE的安装,很困难,错误不好排查。

3

第2章:CPABE的安装

2.1 CPABE的安装

CPABE是基于PCB库的,PCB库是基于GMP库的,GMP库 是建立在M4库之上的,因此要先安装M4库,然后反序安装。

1、安装M4库

使用指令“sudo apt-get install m4”即可

2、安装GMP库

使用指令“sudo apt-get install libgmp-dev”即可

3、安装PBC库

(1)从/pbc/ 下载PBC的源码

(2)将压缩包解压缩,然后使用“./configure”指令

(3)使用“make”指令生成

(4)使用“make install”指令安装

4、安装openssl

使用指令“sudo apt-get install openssl-dev”即可

5、从网站/cpabe/ 下载libbswablibbswabe与cpabe源码

6、安装libbswablibbswabe

4

(1)将压缩包解压缩,然后使用“./configure”指令

(2)使用“make”指令生成

(3)使用“make install”指令安装

在进行4、5部的时候,会提示glib有一个依赖,可以通过“sudo apt-get install

libglib2.0-dev”解决掉

7、安装CPABE

(1)将压缩包解压缩,然后使用“./configure”指令

(2)使用“make”指令生成

(3)使用“make install”指令安装

在make install的时候出现问题:

usr/bin/ld: /usr/local/lib/: undefined reference to symbol '__gmpz_init'

/usr/bin/ld: note: '__gmpz_init' is defined in DSO

/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/ so try adding it to the linker

command line

/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/: could not read symbols:

Invalid operation

collect2: ld 返回 1

make: *** [cpabe-setup] 错误 1

5

更改make文件

将:

LDFLAGS = -O3 -Wall

-lglib-2.0

-Wl,-rpath /usr/local/lib -lgmp

-Wl,-rpath /usr/local/lib -lpbc

-lbswabe

-lcrypto -lcrypto

更改为:

LDFLAGS = -O3 -Wall

-lglib-2.0

-Wl,-rpath /usr/local/lib -lgmp

-Wl,-rpath /usr/local/lib -lpbc

-lbswabe

-lcrypto -lcrypto

-lgmp

即可。

6

第3章:加解密策略

3.1 加密概述

直接使用CPABE加密难免造成加密时间过长的情况,而且无法校验解密是否正确,发送方是否正确,文件容易被攻击,因此需要重新设计加密策略!

首先要对文件的发送发进行确认,这就需要进行签名,而对于大文件来说,签名时间很长,需要改进。可对其进行报文摘要算法,然后对报文摘要签名其次为了提高加密速度,需要改变加密模式,可用对称性加密原文件,用CPABE加密对称性算法的密钥。

另外本组策略需要多组密钥,密钥管理同样需要设计

7

3.2 CPABE的使用

1、公钥与主钥的生成

使用命令:

$cpabe-setup

即可生成pub_key与master_key如图

2、私钥的生成

使用如下命令,即可生成2个分别属于sara与kevin的私钥:

8

$ cpabe-keygen -o sara_priv_key pub_key master_key

sysadmin it_department 'office = 1431' 'hire_date = '`date +%s`

$ cpabe-keygen -o kevin_priv_key pub_key master_key

business_staff strategy_team 'executive_level = 7'

'office = 2362' 'hire_date = '`date +%s`

如代码所示,Sara是系统管理员,属于it部门,办公室号1431,后面的data即为现在的时间Kevin则是商业雇员,属于策略团队,执行权限是7,办公室2362,在此已经将属性写入密钥,运行结果如图:

3、文件的加密

使用如下代码,即可为一个名为的图片加密

$ cpabe-enc pub_key de,jpg

(sysadmin and (hire_date < 946702800 or security_team)) or

(business_staff and 2 of (executive_level >= 5, audit_group, strategy_team))

^D

写入属性即为代码中的属性,如果是系统管理员,需要入职日期小于946702800或者属于安全团队,如果是商业职员则需要满足3个条件中的2个。

其中定义密钥中的`date +%s`是带反引号的,表示返回这个函数的值,而这个值是由目前系统的时间减去1970年1月1日8点整所的出的秒数。

加密策略最后^D 是指ctrl+D

9

、文件的解密

如下命令,即可为解密:

$ cpabe-dec pub_key kevin_priv_key security_

若属性不满足加密时的设置,则会显示无法解密

10

4

3.3 策略的加密过程

加密过程如图:

11

1、对原文件进行报文摘要算法(MD5),生成印章文件1

2、利用RSA私钥对印章文件1进行签名

3、生成DES密钥,并输出到文件

4、利用DES算法对文件进行加密

5、将存储DES密钥的文件利用CPABE进行加密

6、将签名文件、利用DES加密后的文件和利用CPABE加密后的DES密钥文件打包压缩

12

3.4 策略解密过程

解密过程如图:

1、开始之后对压缩包解压缩

2、先利用CPABE的私钥对存有DES密钥的文件进行解密,若解密成功则继续,若解密失败,则终止

3、利用DES密钥将DES加密后的文件解密,

4、利用RSA公钥从签名文件中得到原始的印章文件1

5、利用MD5算法从解密后的文件中计算出印章文件2

6、比较印章文件1与印章文件2,若相同则解密成功,解密后的文件保留,若不相同,则证明文件不安全,删除

注:

1、因为对称性算法DES的安全性不太好,所以本次作业我采用了加盐的3DES算法

2、RSA密钥为了保证安全性,我采用了1024位的密钥

13

3、印章文件其实就是一个文本文件,里面的内容格式为:

MD5(filename)= $String

$String 是一个由数字和字母组成的32位字符串

14

3.5 密钥的管理

因为我设计的策略有3组密钥:RSA密钥、CPABE属性密钥、DES密钥,其中DES密钥会被传递,不需要考虑。

RSA密钥的公钥将存放在主文件夹下的PUB_KEY文件夹中,而私钥在存放在主文件夹中。

CPABE的master key、public key、私钥,都存在主文件夹下。

其中PUB_KEY文件夹、CPABE的master key、public key、私钥都需要提前分发

15

16

3.6 策略的实现

因为每次都需要录入终端命令,很麻烦,所以在实现策略的时候,我选用了shell脚本实现。

其中分为2个文件:enc(加密)、dec(解密) 如图:

将程序写入文本文档,在终端输入“chmod +x filename”授权,再输入

“./filename” 就可以使用了

17

第4章:策略演示

4.1 密钥的管理

4.1.1RSA密钥生成,我设计了另一个脚本,如图:

利用openssl随机生成了一对命名为bill的1024位的RSA密钥,并将公钥提取出来,存入PUB_KEY文件夹中,运行结果如下:

4.1.2CPABE master_key与pub_key的生成

输入命令“cpabe-setup”即可生成

如下图,可以看到输入命令后,master_key与pub_key已经生成

4.1.3CPABE私钥的生成,如图将属性分别写入名为sara和kevin的密钥中:

18

从图中可以看到私钥已经成功生成!

19

4.2脚本的运行

4.2.1编写脚本文件并编译授权:

4.2.2脚本的执行

输入“./enc”和“./dec”执行脚本

20

4.3加密的过程

4.3.1在终端输入“./enc”执行加密脚本

4.3.2输入文件名与应用签名的用户名

4.3.3输入DES的密码,此密码会自动保存在主文件夹下DESK文件中,如下图图所示

4.3.4编写CPABE的加密策略 在程序中支持文法 AND OR OF > < =

>= <=

如图,上图编写的文法就是说 如果是sysadmin需要满足入职时间小于946702800或者属于安全团队 如果是商业雇员,需要满足后面3个条件中的2个才能解密,执行级别大于或等于5,审计团队,策略团队。

如图,自动会生成DESK、、3salt、。

然后会将DESK应用CPABE策略,生成,然后将、、3salt生成压缩包,加密过程完毕。

21

4.4解密的过程

4.4.1首先将压缩包解密到主文件夹,将会释放压缩包内的、3salt、

4.4.2验证私钥所包含的的属性是否满足加密时的属性,如果满足,则继续解密,如图

如果私钥不满足,则无法解密,如图

4.4.3验证签名,如果签名验证成功即sign1=sign2,删除其他文件,保留filename,若签名不匹配,则在10秒后全部删除,如图,修改sign1,让sign1与sign2不匹配:

如图,文件已经被删除!

22

参考文献:

/cpabe/

Using the cpabe Toolkit

First download, untar, compile, and install the most recent tarball of libbswabe, the support library.

Next do the cpabe tarball. Each can be can be installed with the standard GNU build system

commands.

$ ./configure

$ make

$ make install

The "$" denotes your shell’s prompt. Note that the package requires the PBC§ library, so make sure

you have that installed first.

Next, to set up the public key and master keys, run cpabe-setup§.

$ cpabe-setup

$ ls

master_key pub_key

Now you can use the file master_key to produce private keys associated with various sets of attributes.

Let’s say you work for a company that just hired two new employees, Sara and Kevin, and you are

going to make private keys for their workstations.

To do so, you use cpabe-keygen§.

$ cpabe-keygen -o sara_priv_key pub_key master_key

sysadmin it_department 'office = 1431' 'hire_date = '`date +%s`

$ cpabe-keygen -o kevin_priv_key pub_key master_key

business_staff strategy_team 'executive_level = 7'

'office = 2362' 'hire_date = '`date +%s`

$ ls

master_key pub_key sara_priv_key kevin_priv_key

23

As you can see in those examples, some attributes are assigned a value, while others a key simply "has"

without further qualification. The date command can be used to help use the current time as an attribute

value.

Now suppose later someone wants to encrypt a sensitive document. All they need is the public key,

then can use cpabe-enc§ to encrypt it under a specified policy.

$ ls

pub_key security_

$ cpabe-enc pub_key security_

(sysadmin and (hire_date < 946702800 or security_team)) or

(business_staff and 2 of (executive_level >= 5, audit_group, strategy_team))

^D

$ ls

pub_key security_

In this case, they typed the policy on stdin. Note that the attributes of Kevin’s key satisfy this policy,

but the attributes of Sara’s key do not.

If Kevin wants to decrypt the document, he can use cpabe-dec§.

$ ls

pub_key kevin_priv_key security_

$ cpabe-dec pub_key kevin_priv_key security_

$ ls

pub_key kevin_priv_key security_

If Sara were to try to decrypt it, an error would be reported.

That’s all there is to using cpabe!

24

附录:(源代码)

1、RSA密钥生成

#!/bin/sh

echo "请输入签名用户用户名"

read kname

openssl genrsa -out RSA_$ 1024

cat RSA_$

openssl rsa -in RSA_$ -text -noout

openssl rsa -in RSA_$ -pubout -out PUB_KEY/pub_RSA_$

echo "签名密钥生成完毕"

2、加密脚本

#!/bin/sh

echo "请输入文件名"

read fname

if [ -f "$fname" ] ;

then

echo "$fname 文件存在"

echo "请输入签名密钥用户名"

25

read pname

openssl dgst -md5 -out $ $fname;

openssl rsautl -sign -in $ -inkey RSA_$ -out $

echo "签名完毕"

echo "请输入DES加密密码"

read DK

echo $DK>>DESK

openssl enc -p -des3 -pass file:DESK -in $fname -out $3salt

echo "请使用CPABE加密生成策略生成加密代码粘贴到此处! 按ctrl+D确认"

cpabe-enc pub_key DESK

echo "文件加密完毕 正在建立压缩包"

tar -zcvf CPABE$fname.$ $ $3saltecho "文件压缩完毕"

sleep 1

rm -f $

rm -f $

rm -f $3salt

rm -f DESK

rm -f

26

else

echo "$fname 文件不存在"

fi

3、解密脚本

#!/bin/sh

echo "请输入ABE私钥用户名"

read kname

echo "请输入签名密钥的用户"

read pname

echo "请输入文件名"

read fname

if [ -f "CPABE$fname.$" ] ;

then

tar -zxvf CPABE$fname.$

cpabe-dec pub_key "$kname"_priv_key

openssl enc -d -des3 -pass file:DESK -in $3salt -out $fname

openssl rsautl -verify -in -pubin

PUB_KEY/pub_RSA_$ -out sign1

openssl dgst -md5 -out sign2 $fname

diff -r sign1 sign2

-inkey

27

if [ $? -ne 0 ];

then

echo "签名不匹配!"

echo "文件不安全!10秒后即将删除!"

rm -f $3salt

rm -f $

rm -f DESK

rm -f sign1

rm -f sign2

sleep 10

rm -f $fname

exit 1

fi

echo "签名匹配!"

rm -f $3salt

rm -f $

rm -f DESK

rm -f sign1

rm -f sign2

echo "文件解密完成!"

28

else

fi

echo "CPABE$fname.$ is not exist!"

29