Charm-crypto的安装以及简单实现聚合签名算法

  • 1、基本环境搭建
  • 2、拉取需要的依赖库
  • 3、安装charm-crypto
  • 4、安装pycharm,以及导入python
  • 5、创建pycharm快捷方式
  • 6、使用charm实现简单的签名算法
  • 7、Charm-crypto官方文档学习

1、因为自己学习需要,老师让使用charm来实现一些密码学算法,所以才接触了Charm-crypto这个库,中间安装过程也是比较心酸。
2、过程比较繁琐,耐心看下去吧,如果有啥问题也可以积极讨论,一块交流。

1、基本环境搭建

1、首先需要安装虚拟机以及Ubuntu系统,因为在windows上安装Charm-crypto库比较复杂并且问题比较多,尤其是使用minGW等软件是遇见的一些问题。
2、系统安装完后首先检查是否有gcc,make这两个工具。
a、可以通过下面两条命令来查看

gcc -v

make -v


最后检测perl版本,应该都在5.26以上,如果低于5.10需要进行更新

perl  -v


b、如果没有通过下面命令实现安装:

sudo apt-get update

安装gcc工具:

sudo apt-get install gcc

安装make工具:

sudo apt-get install make

上面的操作都是安装库的前提准备工作。

2、拉取需要的依赖库

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 ./configuresudo makesudo make install

b、Openssl库的安装,在Openssl目录下依次执行下面命令:

sudo ./configsudo makesudo make install

c、PBC库的安装,在PBC目录下依次执行下面命令:

sudo ./configuresudo makesudo make install

注:上面这些库的安装也不会出现安装成功等日志,没有错误并且命令都能成功执行下去,一般就是成功了。

3、安装charm-crypto

1、安装charm-crypto时可能会出现一错误,但没事,问题不大,一个个解决它,慢慢来。

2、同理,在charm库目录下面执行下面命令:

sudo ./configure.sh

这一步应该不会有什么错误,如果有错误,那就进行百度吧,因为我当时没遇见错误,慢慢解决吧。然后执行:

sudo makesudo make install

3、这两步如果有错误一般是因为python需要的依赖包还没有安装完,因为ubuntu自带的python缺少一些第三包执行下面命令:

sudo apt-get install python3-setuptools python3-dev libssl-dev

4、安装pip3后安装pyparsing库:

sudo apt-get install python3-pippip3 install pyparsing

5、这下应该全了,我当时安装时到这,需要的东西基本都全了,如果你还是不行就再继续根据错误安装需要的库吧,这块都好解决,一般都是python缺少一些依赖的问题,加油。问题解决后,回过头继续执行:

sudo makesudo make install

6、最后终端显示下面的内容就成功了,撒花,休息一下,继续后面的内容,加油,后面也很值得学习。

4、安装pycharm,以及导入python

1、去pycharm官网下载对应linux版本
2、在对应目录下进行解压
3、进入pycharm的bin目录下执行下面命令,启动pycharm

sh ./pycharm.sh

4、启动pycharm后,把python导入进去,一般是/usr/bin/python3,如果没有发现charm包,可以通过下面的方法进行实现。

python3 -vimport charm


通过上面的命令获取charm的路径,在pycharm解析器里添加就行了




在下面这块添加一下路径就好

5、最后测试一下,如果出现下图自动补全的charm那么证明导入成功了。

5、创建pycharm快捷方式

1、启动Pycharm->
2、点击菜单栏上的Tools->Create Desktop Entry
3、在弹出的窗口中勾选并点击OK->输入认证密码,如下图:

4、点击ubuntu左下角的显示应用程序
5、在Pycharm图标上右键->添加到菜单栏,此时就可以在Ubuntu左侧菜单栏看到Pycharm的快捷键图标了,如下图:

6、使用charm实现简单的签名算法

1、此处声明:我是实现《高效的可证明安全的无证书聚合签名方案_杜红珍》中的签名算法,读者可自行阅读以及尝试实现

'''
Date: 2020/3/19
'''from charm.toolbox.pairinggroup import PairingGroup, ZR, G1, G2, pair
from charm.core.engine.util import objectToBytes
from charm.toolbox.IBSig import *debug = Falseclass AGG319(IBSig):def __init__(self,groupobj):IBSig.__init__(self)global groupgroup = 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 ** sT = 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**sx = group.random(ZR)pk_id = g**xsk = {'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'] ** robj1 = {'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']**hhpk_id = pk['pk_id']**hsig = {'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 Truereturn 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 Truereturn Falsedef setInfo(mpk, msk, Agg):V, U, hQ, hpk_id = 1, 1, 1, 1while True:# flag = input("please input your choice(continue or exit):\n")# if flag == "exit":#     breakID = 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":breakagg_sign = {'V': V, 'U': U, 'hQ': hQ, 'hpk_id': hpk_id}return agg_signdef 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 = Truemain()

2、在实现中应注意论文中的算法和具体实现存在一定差异,例如论文中私钥的生成为生成元乘上秘密值,实现时这块的乘法就是实际中的指数运算,加法就是实际的乘法运算,多注意这些细节。然后就是大胆尝试着去写代码,加油干就是了。

7、Charm-crypto官方文档学习

1、charm-crypto官网
2、进入官网后里面有DOC文档,里面也有charm的安装教程,可以进行参考。
3、charm中自带的schemes
可以通过上面链接对代码进行学习,有许多别人写的事例,有普通加密,属性加密,签名等等,我最开始就是先看这些慢慢学的,因为这方面的资源比较少,所以官方文档其实挺重要的也比较正规。
4、这个博客是我第一次写,希望对大家有所帮助,中间可能有许多细节没注意到,大家可以互相讨论,谢谢!

Charm-crypto的安装以及简单实现的聚合签名算法相关推荐

  1. Crypto++安装和简单使用RSA加密解密

    Crypto++安装和简单使用 一.前言 二.下载 三.安装 四.使用 五.RSA加密/解密 (一)生成密钥/公钥 (二)OAEP加密/解密 六.RSA加密/解密的源码 一.前言 能搜索这个的估计都知 ...

  2. Crypto windows 安装

    Crypto win 安装 pycrypto,pycrytodome和crypto是一个东西,在很久以前,crypto在python上面的名字是pycrypto它是一个第三方库,但是已经停止更新三年了 ...

  3. docker-compose的安装与简单使用

    docker-compose的安装与简单使用 docker-compose简介 屁话不这么多,直接开干 docker-compose安装步骤 由于docker-compose托管在github上面,所 ...

  4. 内核同步对性能的影响及perf的安装和简单的使用

    更多文章目录:点击这里 GitHub地址:https://github.com/ljrkernel 内核同步对性能的影响及perf的安装和简单的使用 看了一篇关于多线程应用程序性能分析的外文,结合之前 ...

  5. cakephp 安装mysql_CakePHP的安装的简单方法

    在对于CakePHP的作用有了初步认识后,我们可以下载CakePHP来进行一些使用.在安装前,要检查php的版本情况,防止CakePHP框架出现不适配的情况. 对于具体的框架组装,会涉及到依赖库和Co ...

  6. 怎么进入python官网-Python的安装及简单的使用

    原标题:Python的安装及简单的使用 像我们想要抓住一门好的编程语言,如何开始学习呢?我来简单介绍下python Python特性:语法简单,入门上手快,很多女神也在学习,方便找个编程的妹纸---- ...

  7. 刚安装的python如何使用-Python requests的安装与简单运用

    强烈推荐!requests官方文档已有了中文版,请见http://cn.python-requests.org/zh_CN/latest/ . requests是python的一个HTTP客户端库,跟 ...

  8. python requests的安装与简单运用

    强烈推荐!requests官方文档已有了中文版,请见http://cn.python-requests.org/en/latest/. requests是python的一个HTTP客户端库,跟urll ...

  9. memcache的windows下的安装和简单使用

    原文:memcache的windows下的安装和简单使用 memcache是为了解决网站访问量大,数据库压力倍增的解决方案之一,由于其简单实用,很多站点现在都在使用memcache,但是memcach ...

最新文章

  1. python迷宫小游戏大全_C课程设计迷宫小游戏
  2. 使用Visual Studio Code配合TypeScript增强SAP UI5开发的语法检查
  3. JavaScript事件处理的例子:事件捕捉和冒泡 - event capture and bubble
  4. C语言 指针数组和数组指针区别 - C语言零基础入门教程
  5. 微服务架构 —— 服务雪崩与容错方案
  6. ASP.NET操作Excel
  7. 第6章 上传视频业务流程开发 6.1
  8. Apache Drill学习
  9. LINUX下用C判断一个进程是否活着
  10. 监视Python程式自动退出,并重新启动程式
  11. 十分钟免费拥有永久网站
  12. Typora:Typora快捷键
  13. 算法题(2)力扣第n位数字
  14. android设置listview的item颜色相间排列
  15. limma差异分析谁和谁比很重要吗
  16. 第八届省赛——D.引水工程)
  17. 数据治理周周谈(三):数据质量管理
  18. 工程总承包和施工总承包的区别
  19. (超级详细)Vue项目实战App3- - - 城市选择
  20. 写个python,爬行【游明星空】的壁纸(4)

热门文章

  1. Windows7常见问答汇总二【2010.10】
  2. 树莓派4B设置代理服务器的方法
  3. 计算机协会活动横幅标语,社团 | 广科数学建模等你来pick
  4. php 报错:A non-numeric value encountered
  5. Java泛型使用介绍
  6. 经典垃圾收集器 CMS、G1
  7. java fusioncharts_FusionCharts free -flash图表组件在java中使用
  8. 腾讯面试题:两个玻璃杯判断哪个楼层恰巧碎裂
  9. git:建立映射到远程分支的本地分支
  10. 判断当前的日期是否是节假日、调休、补班、工作日、双休日