1、因为自己学习需要,老师让使用charm来实现一些密码学算法,所以才接触了Charm-crypto这个库,中间安装过程也是比较心酸。
2、过程比较繁琐,耐心看下去吧,如果有啥问题也可以积极讨论,一块交流。
1、首先需要安装虚拟机以及Ubuntu系统,因为在windows上安装Charm-crypto库比较复杂并且问题比较多,尤其是使用minGW等软件是遇见的一些问题。
2、系统安装完后首先检查是否有gcc,make这两个工具。
a、可以通过下面两条命令来查看
gcc -v
make -v
最后检测perl版本,应该都在5.26以上,如果低于5.10需要进行更新
perl -v
sudo apt-get update
安装gcc工具:
sudo apt-get install gcc
安装make工具:
sudo apt-get install make
上面的操作都是安装库的前提准备工作。
1、依赖的库:m4、flex、bison
更新:
sudo apt-get update
安装m4库:
sudo apt-get install m4
安装flex库:
sudo apt-get install flex
安装bison库:
sudo apt-get install bison
2、安装GMP,PBC,Openssl库
下面是这三个库以及charm-crypto0.5库的资源:
链接:https://pan.baidu.com/s/1hlMyYbxhkVfxBO839aifNA
提取码:sbdq
注:因为openssl1.0到openssl1.1版本之间有部分内容改变所以charn-crypto也要进行改变,这里你不用考虑这些问题,因为我给的资源都是版本匹配的。
3、下载好着几个库后把这几个库拉到虚拟机里
a、GMP库的安装,在GMP目录下依次执行下面命令:
sudo ./configure
sudo make
sudo make install
b、Openssl库的安装,在Openssl目录下依次执行下面命令:
sudo ./config
sudo make
sudo make install
c、PBC库的安装,在PBC目录下依次执行下面命令:
sudo ./configure
sudo make
sudo make install
注:上面这些库的安装也不会出现安装成功等日志,没有错误并且命令都能成功执行下去,一般就是成功了。
1、安装charm-crypto时可能会出现一错误,但没事,问题不大,一个个解决它,慢慢来。
2、同理,在charm库目录下面执行下面命令:
sudo ./configure.sh
这一步应该不会有什么错误,如果有错误,那就进行百度吧,因为我当时没遇见错误,慢慢解决吧。然后执行:
sudo make
sudo make install
3、这两步如果有错误一般是因为python需要的依赖包还没有安装完,因为ubuntu自带的python缺少一些第三包执行下面命令:
sudo apt-get install python3-setuptools python3-dev libssl-dev
4、安装pip3后安装pyparsing库:
sudo apt-get install python3-pip
pip3 install pyparsing
5、这下应该全了,我当时安装时到这,需要的东西基本都全了,如果你还是不行就再继续根据错误安装需要的库吧,这块都好解决,一般都是python缺少一些依赖的问题,加油。问题解决后,回过头继续执行:
sudo make
sudo make install
6、最后终端显示下面的内容就成功了,撒花,休息一下,继续后面的内容,加油,后面也很值得学习。
1、去pycharm官网下载对应linux版本
2、在对应目录下进行解压
3、进入pycharm的bin目录下执行下面命令,启动pycharm
sh ./pycharm.sh
4、启动pycharm后,把python导入进去,一般是/usr/bin/python3,如果没有发现charm包,可以通过下面的方法进行实现。
python3 -v
import charm
通过上面的命令获取charm的路径,在pycharm解析器里添加就行了
在下面这块添加一下路径就好
5、最后测试一下,如果出现下图自动补全的charm那么证明导入成功了。
1、启动Pycharm->
2、点击菜单栏上的Tools->Create Desktop Entry
3、在弹出的窗口中勾选并点击OK->输入认证密码,如下图:
4、点击ubuntu左下角的显示应用程序
5、在Pycharm图标上右键->添加到菜单栏,此时就可以在Ubuntu左侧菜单栏看到Pycharm的快捷键图标了,如下图:
1、此处声明:我是实现《高效的可证明安全的无证书聚合签名方案_杜红珍》中的签名算法,读者可自行阅读以及尝试实现
'''
Date: 2020/3/19
Author: likemeng
wechat: li1217151209
'''
from charm.toolbox.pairinggroup import PairingGroup, ZR, G1, G2, pair
from charm.core.engine.util import objectToBytes
from charm.toolbox.IBSig import *
debug = False
class AGG319(IBSig):
def __init__(self,groupobj):
IBSig.__init__(self)
global group
group = groupobj
'''Select the generator and generate the public-private key of the system '''
def setup(self):
s, g = group.random(ZR), group.random(G2)
p_pub = g ** s
T = group.hash(p_pub, G1)
obj = {'a': g, 'b': p_pub}
w = objectToBytes(obj, group)
W = group.hash(w, G1)
msk = {'s': s}
mpk = {'g': g, 'p_pub': p_pub, 'T': T, 'W': W}
return (mpk, msk)
'''Generate the public-private key of the users'''
def keygen(self, mpk, msk, ID):
s = msk['s']
g, p_pub = mpk['g'], mpk['p_pub']
Q = group.hash(ID, G1)
'''a part of sk'''
d_id = Q**s
x = group.random(ZR)
pk_id = g**x
sk = {'s': s, 'd_id': d_id, 'x': x}
pk = {'pk_id': pk_id, 'ID': ID, 'Q': Q}
return (pk, sk)
'''Generate the signature of message'''
def sign(self, pk, sk, mpk, message):
r = group.random(ZR)
U = mpk['g'] ** r
obj1 = {'a': message, 'b': pk['ID'], 'c': pk['pk_id']}
h = objectToBytes(obj1, group)
h = group.hash(h, ZR)
V = (mpk['T']**r)*((sk['d_id']*(mpk['W']**sk['x']))**h)
hQ = pk['Q']**h
hpk_id = pk['pk_id']**h
sig = {'V': V, 'U': U, 'hQ': hQ, 'hpk_id': hpk_id}
print("signature: '%s'" %sig)
return sig
'''Verify the signature of message'''
def verify(self, pk, sig, mpk, message):
obj1 = {'a': message, 'b': pk['ID'], 'c': pk['pk_id']}
h = objectToBytes(obj1, group)
h = group.hash(h, ZR)
if pair(mpk['g'], sig['V']) == pair(sig['U'], mpk['T']) * (pair(mpk['p_pub'], pk['Q'])**h) * pair((pk['pk_id']**h), mpk['W']):
print("pass the verify of signature")
return True
return False
'''Aggregate the signatures of multiple messages'''
def aggregate(self, sig, sig1, sig2):
V = sig['V'] * sig1['V'] * sig2['V']
U = sig['U'] * sig1['U'] * sig2['U']
hQ = sig['hQ'] * sig1['hQ'] * sig2['hQ']
hpk_id = sig['hpk_id'] * sig1['hpk_id'] * sig2['hpk_id']
agg_sign = {'V': V, 'U': U, 'hQ': hQ, 'hpk_id': hpk_id}
print("aggregate the signature...")
print("aggregate sign: '%s'" %agg_sign)
return agg_sign
'''Aggregate verify the signatures of multiple messages'''
def agg_verify(self, mpk, agg_sign):
print("aggregate verify the aggregate signature...")
if pair(mpk['g'], agg_sign['V']) == pair(agg_sign['U'], mpk['T']) * pair(mpk['p_pub'], agg_sign['hQ']) * pair(agg_sign['hpk_id'], mpk['W']):
print("aggregate verify success!")
return True
return False
def setInfo(mpk, msk, Agg):
V, U, hQ, hpk_id = 1, 1, 1, 1
while True:
# flag = input("please input your choice(continue or exit):\n")
# if flag == "exit":
# break
ID = input("please input your ID:\n")
message = input("please input your message:\n")
M = {'ID': ID, 'message': message}
(pk, sk) = Agg.keygen(mpk, msk, M['ID'])
sig = Agg.sign(pk, sk, mpk, M['message'])
assert Agg.verify(pk, sig, mpk, M['message']), "Failure!"
V = V*sig['V']
U = U*sig['U']
hQ = hQ*sig['hQ']
hpk_id = hpk_id*sig['hpk_id']
flag = input("please input your choice(continue or exit):\n")
if flag == "exit":
break
agg_sign = {'V': V, 'U': U, 'hQ': hQ, 'hpk_id': hpk_id}
return agg_sign
def main():
groupobj = PairingGroup('MNT224')
Agg = AGG319(groupobj)
(mpk, msk) = Agg.setup()
agg_sign = setInfo(mpk, msk, Agg)
assert Agg.agg_verify(mpk, agg_sign), "agg_verify Failure"
if debug: print('Verify Success!!!')
if __name__ == "__main__":
debug = True
main()
2、在实现中应注意论文中的算法和具体实现存在一定差异,例如论文中私钥的生成为生成元乘上秘密值,实现时这块的乘法就是实际中的指数运算,加法就是实际的乘法运算,多注意这些细节。然后就是大胆尝试着去写代码,加油干就是了。
1、charm-crypto官网
2、进入官网后里面有DOC文档,里面也有charm的安装教程,可以进行参考。
3、charm中自带的schemes
可以通过上面链接对代码进行学习,有许多别人写的事例,有普通加密,属性加密,签名等等,我最开始就是先看这些慢慢学的,因为这方面的资源比较少,所以官方文档其实挺重要的也比较正规。
4、这个博客是我第一次写,希望对大家有所帮助,中间可能有许多细节没注意到,大家可以互相讨论,谢谢!