基于numpy和gmpy2实现的线性秘密共享方案(LSSS)
为了实现自己写的CP-ABE方案,写的这个,代码放到这儿,分享给大家。
至于numpy和gmpy2的安装使用,请自行在CSDN找,我的另一篇博客中也有提及。
Matrix_Construct.py
#! usr/bin/env python3
# -*- coding: utf-8 -*-
#说在最前,整体代码效率很低,也没用什么函数编程,递归之类的,都是一些笨办法,但笨办法比较好看懂,也算是一个优点吧-_-!!!
#代码写的确实有点烂,但好在功能实现了,也算有一点点小小的成就感,至于改进什么的,就留给各位看客了,也许在未来会发一个效率改进的版本吧,不过近期没有这个打算,嘻嘻!!!
#至于代码的基础理论,请参看CSDN上博主e小王同学V的博客https://blog.csdn.net/ping802363/article/details/77900273
#e小王同学V的博客中有些错误,但都无伤大雅,确实写得很好,浅显易懂,再想深究的请参看论文
#1,Linear Integer Secret Sharing and Distributed Exponentiation
#2,An expressive and provably secure Ciphertext-Policy Attribute-Based Encryption
#论文请自行下载,本人就不提供了。
#下面进入正题
import numpy as np
def matrix_construct( policy_list ):
#代码的输入要严格按照相关的要求录入,np.array( [[1,2,5],[1,3,4]], dtype = np.int )
#且每行中元素个数不能为1,为1的话没有意义
#每行的元素间均为与门1&2&5,行与行之间为或门[1,2,5]or[1,3,4]
#p_len访问策略中行的数量,即或门的数量,先计算与门,再计算或门
p_len = len( policy_list )
list_and = []
for i in range( p_len ):
list_and.append( matrix_construct_and( policy_list[i] ) )
return_value = matrix_construct_or( list_and[0], list_and[1] )
for i in range( p_len - 2 ):
return_value = matrix_construct_or( return_value, list_and[i+2] )
return return_value.astype(np.int)
#计算与门元素生成的矩阵
def matrix_construct_and( list_and ):
length = len( list_and )
#若长度为2,则不进行计算,直接返回这个矩阵
two_item_array = np.array( [[1,1],[0,1]] )
#虽然输入中已经确定了不可能为1,但还是放在这儿,以方便理解算法
if ( length ==1 ):
return np.array( [[1]] )
elif ( length == 2 ):
return two_item_array
else :
#设定返回值
return_value = two_item_array
#每次循环都是一个大矩阵与单条目矩阵[[1]]进行计算
for i in range( length - 2 ):
return_temp = np.empty( [ i+3, i+3 ] )
#生成c_a的过程
c_a = return_value[...,0]
c_a_temp =