国王国王的秘密:如何保护你的主密码 | Linux 中国( 二 )
P
的模 , mod P
:
secret = mod.Mod(secret, P)
为了使任意三个孩子掌握的片段就可以重建这个秘密 , 他还得生成另外两个部分 , 并混杂到一起:
polynomial = [secret]
for i in range(2):
polynomial.append(Mod(int_from_bytes(urandom(16)), P))
len(polynomial)
3
下一步就是在随机选择的点上计算某 的值 , 即计算polynomial[0] + polynomial[1]*x + polynomial[2]*x**2 ...
。
虽然有第三方模块可以计算多项式的值 , 但那并不是针对有限域内的运算的 , 所以 , 国王还得亲自操刀 , 写出计算多项式的代码:
def evaluate(coefficients, x):
acc = 0
power = 1
for c in coefficients:
acc += c * power
power *= x
return acc
再下一步 , 国王选择五个不同的点 , 计算多项式的值 , 并分别交给五个孩子 , 让他们各自保存一份:
shards = {}
for i in range(5):
x = Mod(int_from_bytes(urandom(16)), P)
y = evaluate(polynomial, x)
shards[i] = (x, y)
正如国王所虑 , 不是每个孩子都正直守信 。 其中有两个孩子 , 在他尸骨未寒的时候 , 就想从自己掌握的秘密片段中窥出些什么 , 但穷极所能 , 终无所获 。 另外三个孩子听说了这个事 , 合力将这两人永远驱逐:
del shards[2]
del shards[3]
二十年弹指一挥间 , 奉先王遗命 , 三个孩子将合力恢复出先王的大秘密 。 他们将各自的秘密片段拼合在一起:
retrieved = list(shards.values())
然后是 40 天没日没夜的苦干 。 这是个大工程 , 他们虽然都懂些 Python , 但都不如前国王精通 。
最终 , 揭示秘密的时刻到了 。
用于反算秘密的代码基于, 它利用多项式在n
个非 0 位置的值 , 来计算其在0
处的值 。 前面的n
指的是多项式的阶数 。 这个过程的原理是 , 可以为一个多项式找到一个显示方程 , 使其满足:其在t[0]
处的值是1
, 在i
不为0
的时候 , 其在t[i]
处的值是0
。 因多项式值的计算属于线性运算 , 需要计算 这些 多项式各自的值 , 并使用多项式的值进行插值:
from functools import reduce
from operator import mul
def retrieve_original(secrets):
x_s = [s[0] for s in secrets]
acc = Mod(0, P)
for i in range(len(secrets)):
others = list(x_s)
cur = others.pop(i)
【国王国王的秘密:如何保护你的主密码 | Linux 中国】factor = Mod(1, P)
for el in others:
factor *= el * (el - cur).inverse()
acc += factor * secrets[i][1]
return acc
这代码是在太复杂了 , 40 天能算出结果已经够快了 。 雪上加霜的是 , 他们只能利用五个秘密片段中的三个来完成这个运算 , 这让他们万分紧张:
retrieved_secret = retrieve_original(retrieved)
- 作文|如何正确看待,张子枫的高考事件?很多人都是断章取义吗?
- 陈薇院士回应疫苗发热率高|陈薇院士回应疫苗发热率高 如何回应?有啥影响?
- 北斗|北斗卫星高密度发射 产品质量如何保证?专家回应
- 家装百科|如何用银色配饰搭出清凉感?3套40岁左右时尚达人的夏日穿搭示范
- 老人|瑞思拜!107岁老人每天坚持拉伸锻炼1小时 如何做到长寿?
- 防灾减灾如何用北斗?北斗办:毫米级定位可以预警泥石流
- 穿搭|卫衣和短裙如何搭配比较好看时尚?
- 海外资金|外资企业撤出,中国世界工厂地位被取代,传统外贸人该如何面对?
- 二锅头|?二锅头在北京是如何取代黄酒的?
- 央视网 产品质量如何保证?专家回应,北斗卫星高密度发射