车联网数据共享方案原理及Python实现 - Shamir门限秘密共享算法
一、实验目的
掌握车联网中的数据共享方案原理。
二、实验环境
Python 3.9
三、实验内容
本次实验通过实现Shamir门限秘密共享算法,来掌握车联网中的数据共享方案原理。具体内容如下:
- Shamir数据共享方案原理
Shamir数据共享方案是一种基于密钥分割的数据共享方案,其原理如下:
- 首先,将需要共享的主密钥S作为多项式的常数项。
- 然后,将多项式分割成w个碎片密钥,每个碎片密钥由一个参与者保管。
- 当碎片密钥数量大于或等于t的时候,就可以通过对这些碎片密钥进行组合来求解出主密钥S。
- 具体而言,利用Lagrange插值法,可以通过任意t个点来确定一个t-1次多项式,并且这个多项式的常数项就是主密钥S。
- Shamir门限秘密共享算法的实现
本次实验通过Python 3.9来实现Shamir门限秘密共享算法,具体实现细节如下:
- create()函数: 生成秘密碎片的函数。在该函数中,首先输入秘密保存人数w和秘密恢复所需人数t,然后输入需要共享的秘密S。接着,随机生成w个不相同的x值和t个不同的系数a,利用这些参数构造多项式f(x),并将f(x)的每个点(x, y)作为秘密碎片,返回结果。
- restore()函数: 恢复秘密的函数。在该函数中,首先输入之前生成的密钥碎片,然后根据Lagrange插值法,求解出主密钥S,并返回结果。
具体代码实现如下:
import Crypto.Util.number as numb
import random
# 求逆的函数,之前的版本用python2写的,这次用的python3,只把整除符号改了一下
def oj(a, n):
a = a % n
s = [0, 1]
while a != 1:
if a == 0:
return 0
q = n // a
t = n % a
n = a
a = t
s += [s[-2] - q * s[-1]]
return s[-1]
# max_length 为p的长度,同时也是秘密的最大长度
# secret_is_text =0 默认输入时文本, 非0时认为是数字
# p 默认为0, 会根据max_length 自动生成,不为0时直接使用,需要保证p为素数, 函数内没有素性检验
def create(max_length=513, secret_is_text=0, p=0):
if not p:
p = numb.getPrime(max_length)
w = int(input('请输入秘密保存人数:'))
t = int(input('请输入秘密恢复所需人数:'))
while not (t > 0 and t <= w):
t = int(input('请重新输入:'))
s = input('请输入你的秘密:')
if secret_is_text:
s = numb.bytes_to_long(s.encode('utf-8'))
else:
try:
s = int(s)
except Exception as e:
s = numb.bytes_to_long(s.encode('utf-8'))
x_list = list()
a_list = list()
i = w
while i > 0:
x = random.randint(p // 2, p) # 该范围没有特定限制,如果想让xi,yi取小一点儿的话可把范围写小点儿,但是要大于w
if x not in x_list:
x_list.append(x)
i -= 1
for a in range(t):
a_list.append(random.randint(p // 2, p)) # 同上
result = list()
for x in x_list:
y = s
for a_n in range(t):
a = a_list[i]
y += a * pow(x, i + 1, p)
result.append((x, y))
return t, p, result
# get_text=1 默认恢复为字符串,若想得到数字填0
def restore(p, information, get_text=1):
x_list = list()
y_list = list()
for x, y in information:
x_list.append(x)
y_list.append(y)
s = 0
for x_i in range(len(x_list)):
tmp_num = y_list[x_i]
x_i_j = 1
for x_j in range(len(x_list)):
if x_i != x_j:
tmp_num = tmp_num * (0 - x_list[x_j]) % p
x_i_j *= x_list[x_i] - x_list[x_j]
tmp_num = tmp_num * oj(x_i_j, p) % p
s += tmp_num
s = s % p
print(s)
if get_text:
try:
s = numb.long_to_bytes(s)
s = s.decode('utf-8')
except Exception as e:
print(e)
return s
t, p, result = create() # result为秘密碎片的列表
print(result)
print('还原出最初的秘密S:')
print(restore(p, result[:t], 0))
以上代码为参考,根据实验内容 改写上述代码,在代码中添加相应的注释,完成实验报告。
内容: 实验报告
一、实验目的
掌握车联网中的数据共享方案原理。
二、实验环境
Python 3.9
三、实验内容
本次实验通过实现Shamir门限秘密共享算法,来掌握车联网中的数据共享方案原理。具体内容如下:
- Shamir数据共享方案原理
Shamir数据共享方案是一种基于密钥分割的数据共享方案,其原理如下:
- 首先,将需要共享的主密钥S作为多项式的常数项。
- 然后,将多项式分割成w个碎片密钥,每个碎片密钥由一个参与者保管。
- 当碎片密钥数量大于或等于t的时候,就可以通过对这些碎片密钥进行组合来求解出主密钥S。
- 具体而言,利用Lagrange插值法,可以通过任意t个点来确定一个t-1次多项式,并且这个多项式的常数项就是主密钥S。
- Shamir门限秘密共享算法的实现
本次实验通过Python 3.9来实现Shamir门限秘密共享算法,具体实现细节如下:
- create()函数: 生成秘密碎片的函数。在该函数中,首先输入秘密保存人数w和秘密恢复所需人数t,然后输入需要共享的秘密S。接着,随机生成w个不相同的x值和t个不同的系数a,利用这些参数构造多项式f(x),并将f(x)的每个点(x, y)作为秘密碎片,返回结果。
- restore()函数: 恢复秘密的函数。在该函数中,首先输入之前生成的密钥碎片,然后根据Lagrange插值法,求解出主密钥S,并返回结果。
具体代码实现如下:
# ... (代码内容,参考上面代码示例,并添加注释)
实验结果分析:
...
结论:
...
原文地址: https://www.cveoy.top/t/topic/n8cS 著作权归作者所有。请勿转载和采集!