shamir秘密分享方案实现-Python

环境

  • 编程语言:python
  • 依赖包: math,galois,pypbc,numpy
  • 环境:Ubuntu
  • 编程软件:pycharm

代码

import math  
import galois  
import pypbc  
import numpy as np  
  
#随机生成一个大素数内的数,有点多余了其实。  
def get_random_value(q):  
    v = 0  
    v = pypbc.get_random(q)  
    while not v < q:  
        v = pypbc.get_random(q)  
    return v  
  
def get_distinct_xlist(n,GF):  
    '''  
    生成自变量列表,保证不重复。  
    '''    x_list=[GF(0)]  
    i = 1  
    while i <= n:  
        # m_t = random.randint(1, GF.order)  
        m_t = get_random_value(GF.order)  
        m = GF(m_t)  
        if(m not in x_list):  
            x_list.append(m)  
            i = i + 1  
    return x_list  
  
  
def run_shamir_scheme(t, n, k, GF):  
    '''  
  
    :param t:门限值  
    :param n:参与者数量  
    :param k:秘密  
    :param q:素数  
    :param GF:伽罗华域  
    :return:秘密份额数值对  
    '''    
    k = GF(k)  
    # 初始值置为0,是为了排除自变量为0的可能性  
    # 之后下标就可以和原始下班一一对应了  
    x_list = [GF(0)]  
    # 初始值置为0,是因为零次项系数为秘密K  
    A_list = [GF(0)]  
    #和x_list对应,组成秘密份额数值对  
    share_pairs = []  
    #生成基础的自变量列表,并且保证每一位都不相等  
    x_list = get_distinct_xlist(n,GF)  
    # 随机生成多项式的系数 A_i i值在[1,t-1]。因为A_0就是秘密值不用随机生成  
    for i in range(1, t):  
        A_i = get_random_value(GF.order)  
        A_list.append(GF(A_i))  
    #此时实际多项式已经构建完成  
    # print(x_list)  
    # print(A_list)    #计算秘密值  
    for i in range(1, n + 1):  
        x = x_list[i]  
        polynomialSum = k #多项式零此项系数即为秘密值  
        for j in range(1, t):  
            A_i = A_list[j]  
            exponent = np.power(x, j)  
            # polynomialSum +=  A_i * exponent # 不能使用+=号。不知道是不是包不支持。反正是这里出了问题。BUG  
            polynomialSum = polynomialSum + A_i * exponent  
            # print(polynomialSum) #测试一下是否在GF域内  
        share_pairs.append([x,polynomialSum])  
    # print(share_pairs)  
    return share_pairs  
  
# 恢复秘密k  
def generateK(share_pairs,GF):  
    '''  
    恢复秘密  
    :param share_pairs: 秘密份额数值对  
    :param GF: 伽罗华域  
    :return: 恢复的秘密  
    '''    res_sum = GF(0)  
    for i in range(0,len(share_pairs)):  
        polynomial_sum = GF(0)  
        l = GF(1)  
        n = GF(1)  
        for j in range(0,len(share_pairs)):  
            if(j == i):  
                continue  
            else:  
                l *= GF(0) - (share_pairs[j][0])  
                n *= share_pairs[i][0] - share_pairs[j][0]  
        polynomial_sum =  share_pairs[i][1] * l *(GF(1) / n)  
        res_sum = res_sum + polynomial_sum  
    return res_sum  
  
  
if __name__ == '__main__':  
    q_bit = 64  
    q = pypbc.get_random_prime(q_bit)  
    n = 10  
    t = 8  
    GF = galois.GF(q)  
    K = pypbc.get_random(q)  
    print(K)  
    share_pairs = run_shamir_scheme(t, n, K, GF)  
    print(share_pairs)  
    K_1 = generateK(share_pairs[0:t], GF)  
    print(K_1)

注意事项

  1. pypbc包的安装需要安装其余的依赖库。此处不列出。
  2. galois包主要用来实现伽罗华域以及其运算。大数的伽罗华域生成比较耗费时间,可以自行修改代码,使其在初始阶段生成一个足够大的GF,例如GF(2^256)。之后直接在该伽罗华域内运算即可。
  3. galois包的+=运算会出问题。我不知道为什么,找这个BUG花了我快一天时间。改用普通的运算。
  4. galois包支持numpy的运算。
  5. pypbc主要用于支持双线性映射。本处用于生成大素数。因为python的int范围受限,直接用random.randint会溢出。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值