代码编织梦想

from charm.toolbox.pairinggroup import PairingGroup, ZR, G1, G2, GT, pair
# from charm.toolbox.secretutil import SecretUtil
from charm.toolbox.ABEnc import ABEnc
debug=False
class node:
    def __init__(self,att=None,gate=None,children=None):
        """
        :param att: 属性值默认为int类型,其中内部节点null,外部节点为int
        :param gate:用两个数字表示(t,n),建议直接使用元组,其中t表示门限值,n表示子节点个数
        :param children:是个子节点索引列表,里面记录孩子在那儿
        :parm valid :用于秘密恢复,表示此节点是否可以恢复
        所以进行建立节点的时候需要注意参数
        """
        self.gate=gate
        self.children=children
        self.att=att
        self.valid=None
        self.secretshare=None#这个值就是group().random()类型的

    def isLeaf(self):
        if self.children==None:
            return True
        return False

    def tostring(self):
        """
        将🌿子节点属性值和门限值转化为string???
        :return:
        """
        pass
"""
关于树的构建在构建node的时候已经暗含进去了
因此这个访问树的功能就是进行秘密共享和秘密的恢复
"""
def nodeshare(accesstree,node1):
    #如果是叶子```````````````````````节点不需要在进行分享
    if not node1.isLeaf():
        "如果不是叶子节点,则首先生成一个随机多项式,多项式的常数项为当前节点的秘密值"
        "多项式的次数则由当前节点对应的门限值决定"
        coef=randomp(node1.gate[0],node1.secretshare)
        for i in node1.children:
            childrennode=accesstree[i]
            childrennode.secretshare=qx(group.random(seed=i),coef)
            print(childrennode.secretshare)
            # temp=xxx
            # xxx=xxx**childrennode.secretshare
            # print(xxx)
            # xxx=temp
            # nodeshare(accesstree,childrennode,xxx)
            nodeshare(accesstree,childrennode)
    # else:
    #     print(type(node1.att))

def randomp(d,s):
    """
    :param d: 为门限值
    :param s: 为秘密
    :return: 多项式列表
    """
    coef=[]
    coef.append(s)
    for i in range(1,d):
        coef.append(group.random())
    return coef

def qx(index,coef):
    res=coef[0]
    for i in range(1,len(coef)):
        exp=group.random(seed=i)
        temp=index
        res=res+coef[i]*(index**exp)
        index=temp
    return res

def noderecover(accesstree,node1,userattlist):
    if not node1.isLeaf():
        validchildrenlist=[]
        #遍历每一个子节点
        for i in node1.children:
            #print(i)
            childnode=accesstree[i]
            #递归调用,恢复子节点的秘密值
            if noderecover(accesstree,childnode,userattlist):
                str1="the node with index "+str(i)+" is satisfied!!!"
                print(str1)
                validchildrenlist.append(i)
                if len(validchildrenlist)==node1.gate[0]:
                    node1.valid=True
                    break
            else:
                str2="the node with index "+str(i)+" is not satisfied!!!"
                print(str2)
        if len(validchildrenlist)==node1.gate[0]:
            print("validchildrenlist",validchildrenlist)
            secret=group.random(GT)#机智如我
            secret=secret/secret
            for i in validchildrenlist:
                delta=lagrange(i,validchildrenlist,0)
                secret=secret*(accesstree[i].secretshare**delta)
            node1.secretshare=secret
    else:
        if node1.att in userattlist:
            node1.valid=True
    return node1.valid

def lagrange(i,s,x):
    print("i",i)
    res=group.random()
    res=res/res
    ielement=group.random(seed=i)
    xelement=group.random(seed=x)
    for j in s:
        if i!=j:
            numerator=xelement-group.random(seed=j)
            denominator=ielement-group.random(seed=j)
            res=res*(numerator/denominator)
    return res


class cpabe_00(ABEnc):
    # 这一步主要是设置一个椭圆曲线参数,至于为什么要用util却是不杂理解
    def __init__(self, groupobj):
        ABEnc.__init__(self)
        global group
        group = groupobj

    def setup(self):
        #选取基本参数
        g=group.random(G1)
        alpha,beta=group.random(),group.random()
        #进行简单计算
        g_alpha=g**alpha
        g_beta=g**beta
        egg_alpha=pair(g,g)**alpha

        msk={'g_alpha':g_alpha}
        pk={'g':g,'egg_alpha':egg_alpha,'g_beta':g_beta}
        #########
        #########建议的话是以文件形式保存下来
        #########
        return (msk,pk)

    def keygen(self, pk, msk, userattlist):
        t = group.random()
        D=msk['g_alpha']*(pk['g_beta']**t)
        D0=pk['g']**t
        K_x=[group.hash(s,G1)**t for s in userattlist]
        k_x={}
        for i in range(0,len(K_x)):
            k_x[userattlist[i]]=K_x[i]
        #key={'D':D,'D0':D0,'Datt':k_x,"userattlist":userattlist,"t":t}
        key = {'D': D, 'D0': D0, 'Datt': k_x, "userattlist": userattlist}
        #########
        #########仍然是建议以文件形式保存下来,,,,,另外关于t的处理方式,后续注意一下
        #########
        return key

    #def encrypt(self, pk,sk, message,accesstree):
    def encrypt(self, pk, message, accesstree):
        s = group.random()
        C = message*(pk['egg_alpha']**s)
        C0 = pk['g']**s
        #开始进行秘密共享,首先设置根结点秘密值为s
        accesstree[0].secretshare=s
        #进行共享,使得每个叶子节点获得对应的秘密分片
        #xxx=pair(pk['g'],pk['g_beta']**(sk['t']))
        nodeshare(accesstree,accesstree[0])

        #x=pair(pk['g'], pk['g_beta']) ** (sk['t'] * s)
        #print('x',x)
        C1={}
        C2={}

        for i in range(len(accesstree)):
            if accesstree[i].isLeaf():
                r=group.random()
                #这个稍微改了一点
                Hi=group.hash(str(accesstree[i].att), G1)
                c1=(pk['g_beta']**accesstree[i].secretshare)*(Hi**-r)
                c2=pk['g']**r
                str1='C1-'+str(accesstree[i].att)
                str2='C2-'+str(accesstree[i].att)
                C1[str1]=c1
                C2[str2]=c2
        #ct={"C":C,'C0':C0,"C1":C1,"C2":C2,'x':x}
        ct = {"C": C, 'C0': C0, "C1": C1, "C2": C2}
        return ct
    def decrypt(self, sk,ct,accesstree):
        userattlist=[int(i) for i in sk['userattlist']]
        #print(userattlist)
        C,C0=ct['C'],ct['C0']
        D,D0=sk['D'],sk['D0']

        for i in range(len(accesstree)):
            if accesstree[i].isLeaf():
                if accesstree[i].att in userattlist:
                    C1string='C1-'+str(accesstree[i].att)
                    c1=ct['C1'][C1string]
                    C2string='C2-'+str(accesstree[i].att)
                    c2=ct['C2'][C2string]
                    Dattstring=str(accesstree[i].att)
                    Datt=sk['Datt'][Dattstring]

                    accesstree[i].secretshare=pair(c1,D0)*pair(c2,Datt)
                    print(accesstree[i].secretshare)

        treeok=noderecover(accesstree,accesstree[0],userattlist)
        if treeok:
            #egg_alphas=pair(C0,D)/ct['x']
            egg_alphas = pair(C0, D) / accesstree[0].secretshare
            print("secret",accesstree[0].secretshare)
            return C/egg_alphas
        else:
            print("the access tree is not satisfied")
            return None


def main():
    # Get the eliptic curve with the bilinear mapping feature needed.
    groupObj = PairingGroup('SS512')
    cpabe = cpabe_00(groupObj)
    (msk, pk) = cpabe.setup()
    attr_list = ['1','2','3','4']
    m = groupObj.random(GT)#############比较难搞的是怎么将真正想要加密的东西和GT上的东西联系在一起
    cpkey = cpabe.keygen(pk, msk, attr_list)

    #此处为相应的访问树
    accesstree=[]
    accesstree.append(node(gate=(4,4),children=[1,2,3,4]))
    accesstree.append(node(att=1))
    accesstree.append(node(att=2))
    accesstree.append(node(att=3))
    accesstree.append(node(att=4))

    #ct=cpabe.encrypt(pk,cpkey,m,accesstree)
    ct = cpabe.encrypt(pk,  m, accesstree)
    res=cpabe.decrypt(cpkey,ct,accesstree)
    print('m',m)
    print('res',res)


if __name__=="__main__":
    debug = True
    main()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52642385/article/details/127266648

pypbc的使用与一个密码方案的实现-爱代码爱编程

pypbc的使用与一个密码方案的实现 一、pypbc的安装二、包的相关情况1、初始化2、函数介绍 三、实现的一个方案 一、pypbc的安装 具体的安装过程可以见文章安装点这里。 讲一点自己的感受:安装其实

【属性基加密】Ubuntu下CP-ABE库安装及调用教程详解-爱代码爱编程

目录 一、前言 二、CP-ABE 1、啥是CP-ABE 2、CP-ABE流程 三、CP-ABE库安装 1、下载 2、安装依赖项 3、gmp安装 4、pbc安装 5、libbswabe安装 6、cpabe安装 四、调用 1、setup 2、keygen 3、encrypt 4、decrypt 一、前言 最近在搞密码学,了解

JPBC库(基于配对的密码学)入门和避坑指南-爱代码爱编程

视频地址:https://www.bilibili.com/video/BV1o5411Y77r/ 1. JPBC简介 Java Pairing-Based Cryptography Library 对PBC库(C语言)的Java封装 常用于基于配对的密码学算法仿真(身份基加密、属性基加密等) 2. JPBC环境 JPBC: http://gas.

Ubuntu下Charm-Crypto安装-爱代码爱编程

经过一下午的努力终于是把Charm-Crypto给安上了,经过查询资料,大致有三种方案(两坑一可行)。 适用于我的电脑的是Ubuntu 18.04版本。 第一种方案是根据连接https://pypi.org/project/charm-crypto/的教程进行安装,但是该方案的优势在于下载快速,缺陷在于Ubuntu系统仅仅更新到13+版本。 第二种就是网络

python是如何实现控制_如何实现python控制树-爱代码爱编程

展开全部 class node: def __init__(self, data): self._data = data self._children = [] def getdata(self): return self._data def getchildren(self): return self._children def a

python软件运行不了_Python错误:可以从命令行运行程序,但不能从IDE运行-爱代码爱编程

我正在尝试使用魅力密码库。我已经安装了这个库,可以看到Python/Lib/site包中的鸡蛋。当我使用命令行运行下面的程序时,它会运行,但是当我尝试使用Eclipse和PyDev插件时,它会给我这个错误。我使用的是python2.7,windows7。如果需要其他信息,请告诉我。在Traceback (most recent call last):

ubuntu安装gmp+pbc+charm以及CP_ABE的两种实现方式-爱代码爱编程

ubuntu安装gmp+pbc+charm以及CP_ABE的两种实现方式 依赖以及基础密码学库安装 安装依赖项:m4,flex,bison。 在安装之前,我们要先进入root权限: sudo su 然后我们使用如下命令安装: sudo apt-get install m4 sudo apt-get install flex sudo ap

Charm安装、使用-爱代码爱编程

项目链接:https://github.com/JHUISI/charm Charm是Joseph A. Akinyele等在2013提出的一个用于进行快速加密的平台(Python库), 再Charm平台里有着各种工具包能够进行加密,解密等, 具体包括IBE,ABE,AES,DES,RSA等对称以及非堆成加密。 Charm安装前准备 sudo ap

KP-ABE和CP-ABE(步骤详细讲解)-爱代码爱编程

KP-ABE是密文-》属性集,私钥-》访问结构。属性集满足访问结构才能解出最终的明文。 CP-ABE是密文-》访问结构,私钥-》属性集。属性集满足访问结构才能解出最终的明文。这里面的属性集是私钥,包含了数据请求者的属性,用来解访问控制树,最终得到根节点的秘密数S,然后带入公式3解密就能得到明文。 在密文策略基于属性加密方案中,最难理解的过程莫过

论文翻译—Ciphertext-Policy Attribute-Based Encryption-爱代码爱编程

         Abstract         在一些分布式系统中,只有当用户拥有一组特定的凭证或属性时,用户才能访问数据。目前,实施这种策略的唯一方法是使用一个受信任的服务器来存储数据并协调访问控制。但是,如果存储数据的任何服务器被泄露,那么数据的机密性也会被泄露。本文提出了一种对加密数据进行复杂访问控制的系统——Ciphertext-Policy

ubuntu系统安装charm-crypto-爱代码爱编程

charm-crypto 安装 一、安装环境 ubuntu 16.04python 3.4.3pip3 6.0.8二、安装步骤 2.1 首先安装部分所需组件 m4、flex、bison组件sudo apt-get install m4 sudo apt-get install flex sudo apt-get install bison py

毕业设计 基于大数据的社交平台数据爬虫舆情分析可视化系统_dancheng-studio的博客-爱代码爱编程

文章目录 0 前言1 课题背景2 实现效果**实现功能****可视化统计****web模块界面展示**3 LDA模型 4 情感分析方法**预处理**特征提取特征选择分类器选择实验 5 部分核心代码6 最后

大专毕业,从6个月开发转入测试岗位的一些感悟——写在测试岗位3年之际_测试界的彭于晏的博客-爱代码爱编程

时光飞逝,我从前端开发岗位转入测试岗位已经三年了,这期间从迷茫到熟悉,到强化,到熟练,到总结,感受还是很深的! 三年前的某一个晚上,我正准备下班回家,我们的项目经理把我叫到办公司和我谈话,谈了很多,具体说什么不记得了,大体意思就是说测试组缺人,而前端组人员暂时较充足,问我能不能从前端岗位转到测试组的岗位。我当时感觉很惊讶,不明白为什么是我,难道是因为我才

fabric+cpabe加密的医疗数据共享代码(分级加密、多授权中心)_区块链cpabe-爱代码爱编程

代码是关于基于fabric区块链的医疗数据共享系统,具体的代码放在了github上:链接 目录 一、功能介绍一、运行步骤三、代码介绍1. 区块链模块介绍2. 加密模块介绍 一、功能介绍 产