python 加密算法_使用此Python加密算法永远不会忘记您的密码

本文介绍了如何使用Shamir的秘密共享算法来安全地分发和存储密码。通过Python实现,允许将秘密分割成多个部分,只有一定数量的部分组合才能还原秘密,增加了安全性。
摘要由CSDN通过智能技术生成

python 加密算法

我们中的许多人都使用密码管理器来安全地存储许多唯一的密码。 密码管理器的关键部分是主密码。 该密码可以保护所有其他密码,因此存在风险。 任何拥有它的人都可以假装成为你……任何地方! 自然地,您难以猜测主密码,将其提交到内存中,并执行所有其他应做的事情

但是,如果发生什么却忘记了怎么办? 也许您在一个没有任何技术的孤岛上度假了一个月。 每天在水中嬉戏并吃了菠萝之后,您就不太记得密码了。 也许是“长腿旅行很快”? 还是像“汤匙吃得快”之类的东西? 当您想到它时,它绝对是聪明的。

XKCD comic on password strength

XKCDCC BY-NC 2.5

输入“ 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算法可以与他人安全地共享它。

翻译自: https://opensource.com/article/20/6/python-passwords

python 加密算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值