python 加密算法
我们中的许多人都使用密码管理器来安全地存储许多唯一的密码。 密码管理器的关键部分是主密码。 该密码可以保护所有其他密码,因此存在风险。 任何拥有它的人都可以假装成为你……任何地方! 自然地,您难以猜测主密码,将其提交到内存中,并执行所有其他应做的事情 。
但是,如果发生什么却忘记了怎么办? 也许您在一个没有任何技术的孤岛上度假了一个月。 每天在水中嬉戏并吃了菠萝之后,您就不太记得密码了。 也许是“长腿旅行很快”? 还是像“汤匙吃得快”之类的东西? 当您想到它时,它绝对是聪明的。
输入“ Shamir的秘密共享” ,这是一种算法,它允许用户将秘密分成只能与其他部分结合使用的部分。
让我们通过一个古老和现代的故事来看看Shamir的秘密分享活动。
这个故事确实假定了一些密码学知识。 您可以通过对密码学和公共密钥基础结构的介绍来完善它 。
远古时代的秘密故事
在一个古老的王国里,国王有了一个秘密。 一个可怕的秘密:
def int_from_bytes
( s
) :
acc
=
0
for b
in s:
acc
= acc *
256
acc +
= b
return acc
secret
= int_from_bytes
(
"terrible secret" .
encode
(
"utf-8"
)
)
国王太可怕了,可以把它托付给他的后代。 他有五个人,但知道未来的道路上会有危险。 国王知道他的孩子死后将需要秘密来保护王国,但是他无法忍受二十年来人们一直在为他哀悼的秘密。
因此,他用强大的魔法将秘密分成了五个碎片。 他知道一个或两个孩子可能不会尊重他的愿望,但他不相信其中三个会:
from mod
import Mod
from
os
import urandom
国王精通有限领域和随机性的魔术艺术。 作为一个明智的国王,他使用Python来分割秘密。
他所做的第一件事是选择了一个大型素数-第十三枚梅森素数( 2**521 - 1
)-并下令在宫殿上方用10英尺高,金色的锻造字母书写:
P = 2 ** 521 - 1
这不是秘密的一部分:它是公共数据 。
国王知道如果P
是质数,则模数P
构成一个数学字段 :只要除数不为零,就可以对它们进行加,乘,减和除。
作为忙碌的国王,他使用了实现模数算法的PyPI 软件包mod
。
他确保他的可怕机密小于P
:
secret < P
TRUE
然后将其转换为其模数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天40夜里,他们努力寻找国王的秘密。 他们面前没有轻松的任务。 像国王一样,他们知道Python,但是没有一个人比他聪明。
最后,答案就来到了他们身上。
检索代码基于称为拉格朗日插值的概念。 它基于在其他n
个地方的值来评估多项式为0
,其中n
是多项式的次数。 它的工作方式是,您可以显式地找到一个多项式的公式,该公式在t[0]
为1
,在t[i]
为0
,因为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
)
factor
= Mod
(
1
, P
)
for el
in others:
factor *
= el *
( el - cur
) .
inverse
(
)
acc +
= factor * secrets
[ i
]
[
1
]
return acc
难怪他们花了40天40夜的时间-代码很复杂! 但是他们在幸存的碎片上奔跑着,喘息着等待着:
retrieved_secret = retrieve_original ( retrieved )
孩子们得到了正确的秘密吗?
retrieved_secret == secret
TRUE
数学的神奇之处在于它每次都能可靠运行! 孩子们现在已经长大了,能够理解父亲的选择,使用了可怕的秘密来捍卫王国。 王国繁荣昌盛。
沙米尔的秘密分享的现代故事
在现代,我们许多人还承担着一个可怕的秘密:我们密码管理器的主密码。 虽然很少有人拥有一个人,他们可以用他们最深,最黑暗的秘密完全信任,但许多人可以找到五个人组成的小组,而三个人不可能将他们的信任放在一起。
幸运的是,在这些现代时代,我们不需要像国王那样自行分割秘密。 通过开源的现代技术,我们可以使用现有的软件。
假设您有五个您信任的人-不是绝对的,而是相当多的:您最好的朋友,您的配偶,您的妈妈,一位亲密的同事和您的律师。
您可以安装并运行程序ssss
来拆分密钥:
$
echo
'long legs travel fast'
| ssss-split
-t
3
-n
5
Generating shares using a
(
3 ,
5
) scheme with dynamic security level.
Enter the secret, at most
128 ASCII characters: Using a
168 bit security level.
1 -797842b76d80771f04972feb31c66f3927e7183609
2 -947925f2fbc23dc9bca950ef613da7a4e42dc1c296
3 -14647bdfc4e6596e0dbb0aa6ab839b195c9d15906d
4 -97c77a805cd3d3a30bff7841f3158ea841cd41a611
5 -17da24ad63f7b704baed220839abb215f97d95f4f8
啊,强大,有效的主密码: long legs travel fast
。 永远不能将它委托给一个人,但是您可以将五个碎片发送给五个监护人。
- 您将
1
发送给您最好的朋友F。 - 您将
2
发送给您的配偶S。 - 您将
3
发送给妈妈M。 - 您将
4
发送给您的同事C。 - 您将
5
寄给您的律师L。
现在,说您去家庭度假。 在一个月的时间里,您在温暖的沙滩上嬉戏。 嬉戏时,您不会触摸任何一种电子设备。 很快,您强大的主密码就被忘记了。
您的爱人配偶和您亲爱的母亲在假期与您同在。 他们将分片保存在密码管理器中,但忘记了密码 。
这可以。
您与最好的朋友F联系,他给您1-797842b76d80771f04972feb31c66f3927e7183609
。 您的同事,涵盖了您的所有班次,很高兴您回来,并给您4-97c77a805cd3d3a30bff7841f3158ea841cd41a611
。 您的律师每小时收费150美元,进入其密码管理器,然后提取5-17da24ad63f7b704baed220839abb215f97d95f4f8
。
使用这三个部分,您可以运行:
$ ssss-combine
-t
3
Enter
3 shares separated by newlines:
Share
[
1
/
3
] :
1 -797842b76d80771f04972feb31c66f3927e7183609
Share
[
2
/
3
] :
4 -97c77a805cd3d3a30bff7841f3158ea841cd41a611
Share
[
3
/
3
] :
5 -17da24ad63f7b704baed220839abb215f97d95f4f8
Resulting secret: long legs travel fast
因此,借助开源技术,您也可以像国王一样生活!
为了安全起见,安全分享
密码管理是当今在线生活的一项基本技能。 当然,创建一个复杂的密码,但不要就此止步。 使用方便的Shamir的Secret Sharing算法可以与他人安全地共享它。
python 加密算法