D = libnum.s2n(D) bit_D = math.log(D, 2) bit_n = math.log(n, 2) bit = max(bit_D, bit_n) p = getPrime(int(bit) + 2) while p < D or p < n: p = getPrime(int(bit) + 2)
num = [D] for i inrange(k-1): num.append(random.randint(1, p))
deff(num, x, p): # 计算每个i多项式方程的值 result = 0 for i inrange(len(num)): result += num[i]*(x**i) return (x, result % p)
_D = [] for i inrange(1, n+1): tmp = f(num, i, p) _D.append(tmp) print("D" + str(i) + ':' + str(tmp))
将每一个 Di 输出,由秘密输入者进行分发 n 个部分。
运行效果:
(k, n) = (3, 6)
秘密恢复
首先输入 k,然后输入素数 p,接着将 Di 的值输入进去,以 (x, y) 的形式打包存储进一个列表中。
1 2 3 4 5 6 7 8
recoverD = [] print("Now to recover your secret") k = int(input("Subset: ")) p = int(input("Prime: ")) print("Now to input your point like x,y") for i inrange(k): x, y = map(int, input("Input point " + str(i+1) + ": ").split(',')) recoverD.append((x, y))
数据获取完毕后,利用拉格朗日插值法进行计算,将 i 值和 Di 的值分开各位一个列表,然后每一次计算每一个小块的 q(x)。对于多项式的计算,形如 (x-1)(x-2) ,这里为了偷懒我利用了 numpy 里的 array,并利用它的性质计算多项式。