实验一:Shamir 秘密共享

实验一:Shamir 秘密共享

一、问题描述:

实现一个(k,n)-Shamir 秘密共享方案,其中 k=3,n=4,包含以下功能:

(1) 给定一个数字,可以计算出对应的 share

(2) 给定 k 个 share, 能够重构出秘密值。

二、实验环境:

系统:Windows 10

IDE:pycharm

编译语言:python

三、程序代码与结果分析:

(1)解Shamir算法部分

Shamir秘密共享算法是基于拉格朗日插值计算来实现的秘密共享,他核心是在人数未达到门限值之前,没有人能够恢复秘密,下面我们来简单介绍一下秘密共享算法的实现过程:

首先是类的初定义,我们需要提供秘密即info,门限值k,秘密共享人数p给类,然后定义了大素数,我们调用创建大素数函数,最开始创建一个16位的大素数,然后进行一些类对象的初始化,最后执行检查,检查主要是检查大素数是否大于秘密的值,如果没有进行这一步,那么就无法恢复秘密,因为拉格朗日插值计算要在大素数域内计算,如果你的消息值大于这个数,那么肯定无法还原,接下来我们看一下创建以及检查函数的实现。

 

下面是创建大素数函数,这个函数就是简单使用随机函数创建一个对应位数的值然后如果这个是素数就返回,否则,再创建一个大素数。check函数则是检查密码是否小于大素数,我们这里先对秘密进行判断,检查它是str类型还是int类型,字符类型的话就转化为大端整数,并标记,这一步在恢复秘密的时候需要用到,判断是否需要转化为字符串。如果秘密大于大素数,就按照之前定义好的位数依次调高,直到大于秘密值为止,下面简单简述一下判断素数的过程。 

 

 

我们这里运用了Miller-Rabin算法,首先对初始状态进行判断,之后计算出公式当中的将n-1表示为2^k * m中的k和m,然后进行判断,随机从1到n-1选出一个数,计算他的m次方在该素数域下,如果b的值是1或者n-1那么进行进一步循环,最多循环n-1次。找出b^2在素数域下的值,如果这个值等于n-1则认为可能是素数,否则,肯定是合数,这样循环10次(这个10次是自己定的,因为这个算法只是计算是素数的概率,重复10次都可能是素数,那么它是素数的概率就很大了)

当准备好这些数之后,就开始分发秘密,首先多项式的第一个值是秘密值,其他值就是随机选取1到大素数减一,然后开始分发秘密,这个秘密就是多项式的值,这个多项式的系数是定好的系数,次数最高是门限减一,这里简单的把1, 2等作为x分配给人员,没人得到一个分享。

 

 

之后就是恢复秘密,我们首先判断是否满足最低门限要求,如果没有提示错误,如果满足,则按找拉格朗日插值进行恢复秘密

 

这里我将拉格朗日插值的累加和累乘分开来写了

 

最后检查秘密的类型,还原秘密,并输出。

(2)GUI部分

GUI采用了tkinter库,由于有很多组件,详细代码见后文,这里不再赘述,仅简述一下功能性的方面下面是生成秘密的按钮的功能,我们这里按照秘密分享的人数生成对应个数的框,每个框可以进行勾选,表示是否参与恢复秘密,框内会展示秘密的分享值,这里对于用户的输入也进行了检查,不合法的会弹出提示或者错误框。

 

 

下面是恢复秘密的按钮函数,也是进行了一些判定,如果合法则会在对应的地方输出秘密。至此,代码简述结束,下面在下一节展示运行结果。

 

  1. 代码运行结果实例

一开始会出现这样的样式

 

之后我们输入

 

恢复秘密

 

 

还有一些错误提示不再展示。

  • 实验中遇到的问题以及实验体会:

本次实验是第一个密码学实验,了解了一些秘密分享的加密算法,在实验中,也遇到了很多问题,比如说素数的情况,最开始我选择的固定一个素数,但是不小心秘密值大于了素数值,结果检查了很久,还有就是多项式的计算是在素数域下进行,最开始我没有注意,结果也花了不少时间检查。

这次试验对于我对这种密码算法也有了更深入的了解,对于拉格朗日插值计算也有了深入的理解,在一些python编程的小技巧上也有了更深的理解,比如进行求逆计算等。

通过这次实验,也极大的锻炼了我的编程能力,在于图形化界面的编写,也更加熟练了。

附录:代码

https://download.csdn.net/download/dxxmsl/87699285

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dxxmsl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值