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 ./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

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

3、安装charm-crypto

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、最后终端显示下面的内容就成功了,撒花,休息一下,继续后面的内容,加油,后面也很值得学习。
在这里插入图片描述

4、安装pycharm,以及导入python

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那么证明导入成功了。
在这里插入图片描述

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

7、Charm-crypto官方文档学习

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

  • 21
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 47
    评论
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值