Shamir秘密共享实现为何仅支持有序分片还原?
问题分析与解决方案
核心异常原因
你的Shamir秘密共享实现存在两个致命错误,导致非连续/乱序分片无法正常还原:
1. 分片索引匹配错误
在reconstruct函数中,你没有根据用户输入的shareIndex提取对应的分片数据:
- 用户输入的
shareIndex是1-based的分片编号(如[4,1,3]),对应gen_imgs中索引为3,0,2的分片 - 但代码直接使用了
imgs[:, i](所有n个分片的第i个像素值)作为插值的y值,同时用用户输入的k个索引作为x值 - 这会导致x(长度k)和y(长度n)维度不匹配,只有当n=k且输入所有分片索引时才不会报错,完全违背了Shamir用任意k个分片还原的设计
2. 错误使用实数域插值
Shamir秘密共享要求在**有限域GF(251)**上进行多项式运算,但你使用了scipy的lagrange函数做实数域插值:
- 实数运算存在浮点精度误差,当x值乱序或跨度较大时,插值多项式的系数会急剧增大,误差被放大,导致计算出的
poly(0)(原始像素值)偏离正确整数 - 连续x值(如1,2,3)插值时,多项式系数较小,误差碰巧处于可接受范围,因此表现为“能正常工作”,但这只是偶然现象
修复方案
修复分片提取逻辑
先根据shareIndex筛选出对应分片,确保x和y维度匹配:
def reconstruct(imgs, index, k): print("Shares: ", index) # 将1-based索引转换为0-based selected_indices = [i-1 for i in index] # 提取用户选择的k个分片 selected_imgs = imgs[selected_indices, :] assert selected_imgs.shape[0] == k x = np.array(index) dim = selected_imgs.shape[1] img = [] for i in range(dim): if i % 10000 == 0: print("Reconstructing pixel ", i, " of ", dim, " pixels") y = selected_imgs[:, i] poly = lag(x, y) # 先四舍五入到最近整数再取模,减少浮点误差影响 pixel = round(poly(0)) % 251 img.append(pixel) return np.array(img)
替换为有限域插值(彻底解决精度问题)
实现GF(251)上的拉格朗日插值,完全避免实数浮点误差:
def lagrange_interpolate(x, y, prime): # 有限域GF(prime)上的拉格朗日插值,计算f(0) n = len(x) result = 0 for i in range(n): xi, yi = x[i], y[i] # 计算拉格朗日基函数l_i(0) numerator = 1 denominator = 1 for j in range(n): if i != j: numerator = (numerator * (0 - x[j])) % prime denominator = (denominator * (xi - x[j])) % prime # 用费马小定理计算分母逆元 inv_denominator = pow(denominator, prime-2, prime) term = (yi * numerator) % prime term = (term * inv_denominator) % prime result = (result + term) % prime return result def reconstruct(imgs, index, k): print("Shares: ", index) selected_indices = [i-1 for i in index] selected_imgs = imgs[selected_indices, :] assert selected_imgs.shape[0] == k x = np.array(index) dim = selected_imgs.shape[1] img = [] prime = 251 for i in range(dim): if i % 10000 == 0: print("Reconstructing pixel ", i, " of ", dim, " pixels") y = selected_imgs[:, i] pixel = lagrange_interpolate(x, y, prime) img.append(pixel) return np.array(img)
验证说明
修复后,无论输入的分片是连续、非连续还是乱序,只要数量达到k个,都能正确还原原始图像,完全符合Shamir秘密共享的理论特性。
内容的提问来源于stack exchange,提问作者Raisa A
相关产品推荐
相关产品推荐

