[论文阅读]《how to share a secret》

2023-11-01

how to share a secret

Adi Shamir

文章主要讲了如何将数据D分为n份,任意k份可以重组成D,任意k-1份不会泄露任何关于D的信息。这种技术能为密码系统构建鲁棒的密钥管理机制,即使灾难破坏一半信息或者安全性被破坏只剩一部分也仍能安全可靠的运行。

关键词:加密,密钥管理,插值法(interpolation)

  1. Introduction

在文章[4]中,liu讨论了以下问题:

11个科学家从事一个秘密项目,他们希望把文档所在一个箱子里,箱子只有在6个或更多科学家在场时才能打开。最少需要多少锁?每个科学家最少需要保管几把钥匙?

不难证明最小的解决方案是使用462把锁和每人252个钥匙。这个数目显然是不实用的,当科学家人数增加时会呈指数级增加。

在本文中,我们将问题归纳为秘密为某个数据D(例如,安全组合),或者非机械式解决方案(操作这些数据)。我们的目标是将D分成n份 D 1 , D 2 , … D n D_1,D_2,\dots D_n D1,D2,Dn,满足:

(1)任意k或多余k份 D i D_i Di可以很容易地计算出D

(2)任意k-1或少于k-1份 D i D_i Di信息不能准确计算出D(所有可能的值相同)

这样的机制称为一个 ( k , n ) (k,n) (k,n)门限机制。

有效的门限机制在加密密钥管理上非常有用。为了保护数据我们可以将数据加密,但是为了保护密钥,我们需要一种不同的方式(更深一层的加密是改变问题而不是解决问题)。最安全的密钥管理机制是将密钥保管在一个严加防护的地方(一个计算机,一个人的大脑或一个安全的地方),这种机制非常不可靠,因为意外或灾难(如计算机故障,意外死亡,恶意破坏)可以使信息不可访问。一个简单的方案是在不同的地方存储多份密钥,但是这样又增加了安全漏洞的风险(计算机渗透,背叛或人为错误)。使用 ( k , n ) (k,n) (k,n)门限机制,n=2k-1,可以得到一个鲁棒性非常好的密钥管理机制:即使 ⌊ n / 2 ⌋ = k − 1 \left \lfloor n/2 \right\rfloor =k-1 n/2=k1 份被毁也仍可以恢复出原始密钥。即使安全漏洞暴露了 ⌊ n / 2 ⌋ = k − 1 \left \lfloor n/2 \right\rfloor =k-1 n/2=k1份剩余k份也不能重组密钥。

在其他应用中,tradeoff(权衡,利益)不在秘密性和可靠性,而在安全性和易用性。例如,一个公司对它的所有校验进行数字签名(见RSA[5]),如果给每个执行官一份秘密签名key的副本,系统会很方便单也很容易被误用。如果每次签名都需要所有执行官的合作,系统很安全但不方便。标准的解决方案要求每个校验至少三个签名,通过一个(3,n)门限机制很容易实现。给每个执行官一个写有Di碎片信息的磁卡,任意三个就可以通过签名生成器生成签名key D的一个临时副本。签名生成器不含任何秘密信息因此不需要进行保护。在这个系统中,一个不忠诚的执行官至少要有两个同谋才能伪造公司的签名。

门限机制理想情况下适合这样的应用:一组有矛盾的、相互怀疑的个体必须合作。理想情况下,我们希望合作基于双方同意,但是这种机制赋予每个成员的投票权可能会使该组织的活动陷于瘫痪。 通过适当选择参数K和n,我们可以给予任何足够多的多数人采取一些行动的权力,同时给予任何足够多的少数人阻止它的权力。

  1. A Simple (k, n) Threshold Scheme 一个简单的(k, n)门限机制

我们的机制基于多项式插值:在二维平面中给定K个有不同的 x i ′ s x_i 's xis ( x 1 , y 1 ) , … ( x k , y k ) (x_1,y_1),\dots(x_k,y_k) (x1,y1),(xk,yk),有且仅有k-1次多项式q(x)使得 q ( x i ) = y i q(x_i)=y_i q(xi)=yi对所有i成立。在不失一般性的情况下,我们假设D是(或可以被看作)一个数字。为了把它分成 D i D_i Di,随机选择一个k-1次多项式 q ( x ) = a 0 + a 1 x + ⋯ + a k − 1 x k − 1 q(x) = a_0+a_1x+\dots+a_{k-1}x^{k-1} q(x)=a0+a1x++ak1xk1,其中 a 0 = D a_0=D a0=D且: D 1 = q ( 1 ) , … , D i = q ( i ) , … , D n = q ( n ) D_1=q(1),\dots,D_i=q(i),\dots,D_n=q(n) D1=q(1),,Di=q(i),,Dn=q(n)

给定任意Di值的k个子集(联通他们的识别索引号),我们可以通过插值找到q(x)的系数,然后计算D=q(0)。否则,只知道k-1个值不能计算出D。

为了更准确的描述这个声明,我们使用模块化算法而非真实算法。整数集对素数p取模,形成一个可以进行插值的域。给定一个值为Data D的整数,选择一个比D和n都大的素数p,q(x)中的系数 a 1 , … , a k − 1 a_1,\dots,a_{k-1} a1,,ak1从整数[0, p)的均匀分布中随机选择, D − 1 , … , D n D-1,\dots,D_n D1,,Dn的值通过对p取模得到。

现在假设n份信息中有k-1份落入一个敌人手中 ,对于[0,p)中的每一个候选值D’他能且仅能由给定的k-1个参数构造一个k-1次多项式q’(x)使q’(0)=D’,q’(i)=Di。通过构造,这p个可能的多项式大致相同,因此敌人几乎不可能推算出D的真实值。

用于多项式评估和插值的高效 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)算法在文献[1]和[3]中进行了讨论,但是即使是简单的二次算法对实际密钥管理方案来说也足够快了。如果数字D很长,可以将它分解成更短bit的block(被独立处理的block)以避免多精度的数学操作。blocks不能任意短,因为p的最小可用值为n+1(在{0,p)中要求至少有n+1个不同的参数来求q(x))。但是,这不是一个严格的限制,因为16位的模数(可以用一个廉价的16位算术单元来处理)足以应对最多64,000片Di的应用。

这种(k,n)门限机制(与机械锁和密钥解决方案相比)有用的属性是:

(1)每部分信息的大小不回超过原始数据

(2)当k固定时,Di可以动态地增删(例如,当一位执行官加入或离开公司时)而不影响其他信息片(pieces)(一个piece被删除,仅当离职的执行官使它完全不可访问,包括他自己时)

(3)可以在不改变原始数据D的情况下容易的改变Di pieces,我们需要的只是一个新的有相同自由项的多项式q(x)。这种类型的频繁变化可以提高安全性,这样由安全漏洞暴露的pieces就不回累积,除非它们都是同一个版本的q(x)多项式的值。

(4)通过使用多项式值数组作为Di,我们可以得到一个分层机制,决定D所需的pieces数量依赖于它们的重要性。例如,如果我们给公司的主席3个q(x)的值,每个副主席两个值,每个执行官1个值,则(3,n)门限机制给检查签名需要:任意三个执行官或者任意两个执行官其中一个执行官是副主席,或者主席自己。

G.R.Blakley[2]发表了一个不同的(然而更低效的)门限机制

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[论文阅读]《how to share a secret》 的相关文章

随机推荐

  • postman(二)——全局变量&环境变量

    一 全局变量 1 1 例如 token 1 作用范围 针对postman中所有使用该变量的请求 作用 方便维护 举例 有一个系统 含有100个接口 所有的接口服务器地址 或者某一个参数都是固定的值 那么把这个值设置全局变量接口中调用 这样接
  • python安装cv2

    pip install opencv python
  • [开发过程]<RTOS>关于RT-Thread

    以前一直折腾FreeRTOS 没时间折腾RT Thread 虽然暂时对RT Thread学的不深 但是从学习难度和社区支持来看 相信多年后RT Thread会成为主流 大概是因为很多RT Thread的中文资料吧 入门还要先学FreeRTO
  • matlab工作区显示的是什么,matlab工作区介绍

    Workspace 工作区窗口 Command History 指令历史记录窗口 Current Directory 当前目录选择窗口 主要内容 Matlab简介 数组和矩阵 Matlab绘图 Matlab Workspace 工作区窗口
  • Spring oauth2.0 刷新token后设置原token5分钟内继续可用

    默认情况下刷新token后原token会立马不可用 但是在某些情况下我们需要刷新token后原token在一定时间内继续可用 例如微信的刷新token 通过查看DefaultTokenServices中的刷新token方法refreshAc
  • 栈破坏检测

    在C C 语言中 由于代码书写人员能够直接通过指针来操作内存的内容 在通常的时候没有可靠的方法来防止对数组的越界访问读写操作 但是 我们可以在发生了越界访问的时候 在没有造成任何有害结果之前 尝试检测到他 栈保护机制是在栈帧中任何局部缓冲区
  • Maven之pom.xml文件中的Build配置

    Maven之pom xml文件中的Build配置 前言 在日常的开发中 我们经常使用maven来管理和构建我们的项目 即使现在使用了各种springboot等方便快捷的框架 jar包的引入也是通过maven来进行的 因此有必要了解pom x
  • Batch和Epoch之间的区别是什么?

    写在前面 快速理解 随机梯度下降 SGD 是一种迭代学习算法 它使用训练数据集来更新模型 Batch 批量 大小是梯度下降算法的超参数 在模型的内部参数更新之前控制训练样本的数量 一个周期内一次批量训练的样本数 Epoch数是梯度下降算法的
  • python 图片与二进制之间的转换

    一 PIL格式图片转成二进制 先读取为PIL格式 再转为二进制 import io import base64 from PIL import Image def image2byte image 图片转byte image 必须是PIL格
  • java代码分层 handle_java 代码分层

    JAVA代码层次 阿里推荐 开放接口层 可直接封装 Service 方法暴露成 RPC 接口 通过 Web 封装成 http 接口 进行 网关安全控制 流量控制等 终端显示层 各个端的模板渲染并执行显示的层 当前主要是 velocity 渲
  • PyTorch torch.optim.lr_scheduler 学习率设置 调参 -- CosineAnnealingLR

    lr scheduler 学习率 学习率的参数调整是深度学习中一个非常重要的一项 Andrew NG 吴恩达 认为一般如果想调参数 第一个一般就是学习率 作者初步学习者 有错误直接提出 热烈欢迎 共同学习 感谢Andrew ng的机器学习和
  • easyui tabs 一个窗口修改完成后刷新另一个窗口

    在一个tab中添加或删除数据后 要改变主页 相当于链接的另一个tab 的内容 1 在要刷新的窗口的初始化中添加 js 刷新方法 并保存到 window top 中 window top Refresh CloudHomePage Conte
  • 二、基础平滑、面积折线图与折线堆叠、面积堆叠《手把手教你 ECharts 数据可视化详解》

    注 本系列教程需要对应 JavaScript html css 基础 否则将会导致阅读时困难 本教程将会从 ECharts 的官方示例出发 详解每一个示例实现 从中学习 ECharts ECharts 官方示例 https echarts
  • Mybatis学习(二)--getMapper接口绑定方案和多参数传值

    在Mybatis的基础使用中 如果想向一个sql语句中传递多个参数 只能将parameterType设置为某个类或者Map 不能直接传入多个参数 接口绑定方案可以实现直接传入多个参数 Mybatis的接口绑定方案与基本的使用方法不同的地方在
  • unity 射线获取坐标

    射线 碰到障碍物就会断开 鼠标点击屏幕获得一个二维坐标 通过相机的射线转换为三维世界坐标 private Vector3 worldPos 鼠标点击的点所对应的世界里面的位置 点击鼠标右键 if Input GetMouseButton 1
  • ThinkPHP文件包含漏洞分析

    出品 长白山攻防实验室 ID A Tree 0x00 声明 以下内容 来自长白山攻防实验室的A Tree作者原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作者不承担任何责
  • Vue3集成高德地图方法

    1 注册高德开发者账号 获取key和安全密钥 2 下载依赖 可参考高德官方文档 https lbs amap com api jsapi v2 guide webcli map vue1 npm i amap amap jsapi load
  • GD32f103 8M晶振改12M , 要修改的地方

    手里的单片机是gd32f103ret6 晶振和官方库默认的8M不一致 导致串口乱码 网上找了好久全是STM32的例子 不过还是有参考意义的 以下是gd32f10x 的设置方式 1 Keil中的Target设置 PS 这一项好像会自动设置 安
  • 7、变量进阶

    7 变量进阶 理解 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1 1 引用的概念 在 Py
  • [论文阅读]《how to share a secret》

    how to share a secret Adi Shamir 文章主要讲了如何将数据D分为n份 任意k份可以重组成D 任意k 1份不会泄露任何关于D的信息 这种技术能为密码系统构建鲁棒的密钥管理机制 即使灾难破坏一半信息或者安全性被破坏