隐私计算 2.2 Shamir秘密共享方案

1 简介

  • 作者:Shamir
  • 时间:1979年
  • 理念:基于多项式插值算法

2 具体实现

I 秘密分割算法

  • (1)选择一个随机素数 ppp,并产生一个随机的 t−1t-1t1 次多项式;
    f(x)=at−1xt−1+⋯+a1x+a0modpf(x)=a_{t-1} x^{t-1}+\cdots+a_{1} x+a_{0} \bmod p f(x)=at1xt1++a1x+a0modp
    a0=Sa_0 = Sa0=SSSS为想要分享的秘密),则f(0)=a0=Sf(0) = a_0 = Sf(0)=a0=Sf(x)f(x)f(x)的最高次必须设置为xt−1x^{t-1}xt1

  • (2)选择 nnn 个互不相同的整数 1≤x1,…,xn≤p−11≤ x_1,…,x_n ≤ p-11x1,,xnp1

  • (3)第iii 个参与者计算Si=f(xi)S_i = f(x_i)Si=f(xi)作为其分享的秘密;

  • (4)销毁f(x)f(x)f(x)

II 秘密重构算法

  • (1)ttt 个参与者拿出自己的秘密消息。假设 S1,…,StS_1, …, S_tS1,,St 是这 ttt 个秘密,分别对应 x1,…,xtx_1, …, x_tx1,,xt。利用这些信息可以重构出 f(x)f(x)f(x)
    f(x)=∑iSi∏j≠i(x−xj)∏j≠i(xi−xj)modporf(x)=∑i=1tSi∏j∈{1,2,…,t}∖{i}(x−xj)∏j∈{1,2,…,t}∖{i}(xi−xj)modp\begin{array}{l} f(x) = \sum_{i} \frac{S_i \prod_{j \neq i} (x - x_j)}{\prod_{j \neq i} (x_i - x_j)} \bmod p \\ \textrm{or} \\ f(x) = \sum_{i=1}^t \frac{S_i \prod_{j \in \{1, 2, \dots, t\} \setminus \{i\}} (x - x_j)}{\prod_{j \in \{1, 2, \dots, t\} \setminus \{i\}} (x_i - x_j)} \bmod p\\ \end{array} f(x)=ij=i(xixj)Sij=i(xxj)modporf(x)=i=1tj{1,2,,t}{i}(xixj)Sij{1,2,,t}{i}(xxj)modp
    a0=Sa_0 = Sa0=SSSS为想要分享的秘密),则f(0)=a0=Sf(0) = a_0 = Sf(0)=a0=Sf(x)f(x)f(x)的最高次必须设置为xt−1x^{t-1}xt1

  • (2)重构出f(x)f(x)f(x)以后,计算S=f(0)S = f(0)S=f(0), 多于 ttt个参与者重构f(x)f(x)f(x)的过程也是适用的。

3 实例

设秘密S=13S = 13S=13n=5n = 5n=5, t=3t = 3t=3,选择模数p=17p = 17p=17
I 秘密分割

  • (1)生成t−1t - 1t1个小于等于ppp的随机数,a1=10a_1 = 10a1=10a2=2a_2 = 2a2=2a0=S=13a_0 = S = 13a0=S=13
  • (2)分别计算

S1=(13+10∗1+2∗12)mod17=8S2=(13+10∗2+2∗22)mod17=7S3=(13+10∗3+2∗32)mod17=10S4=(13+10∗4+2∗42)mod17=0S5=(13+10∗5+2∗52)mod17=11\begin{array}{l} S_{1}=\left(13+10 * 1+2 * 1^{2}\right) \bmod 17=8 \\ S_{2}=\left(13+10 * 2+2 * 2^{2}\right) \bmod 17=7 \\ S_{3}=\left(13+10 * 3+2 * 3^{2}\right) \bmod 17=10 \\ S_{4}=\left(13+10 * 4+2 * 4^{2}\right) \bmod 17=0 \\ S_{5}=\left(13+10 * 5+2 * 5^{2}\right) \bmod 17=11 \end{array} S1=(13+101+212)mod17=8S2=(13+102+222)mod17=7S3=(13+103+232)mod17=10S4=(13+104+242)mod17=0S5=(13+105+252)mod17=11

(3)将(Si,i)(S_i, i)(Si,i)作为钥匙分发给第iii个参与者。

II 秘密重构

(1)收集任意t=3t = 3t=3个参与者的钥匙,例如第1个人的(8, 1),第2个人的(7, 2),第5个人的(11, 5);

(2)列出方程
f(x)=∑iSi∏j≠i(x−xj)∏j≠i(xi−xj)modp=(8(x−2)(x−5)(1−2)(1−5)+7(x−1)(x−5)(2−1)(2−5)+11(x−1)(x−2)(5−1)(5−2))mod17\begin{array}{l} f(x) &=& \sum_{i} \frac{S_i \prod_{j \neq i} (x - x_j)}{\prod_{j \neq i} (x_i - x_j)} \bmod p \\ &=&(\frac{8(x - 2)(x-5)}{(1-2)(1-5)} + \frac{7(x - 1)(x-5)}{(2-1)(2-5)} + \frac{11(x - 1)(x-2)}{(5-1)(5-2)}) \bmod 17 \\ \end{array} f(x)==ij=i(xixj)Sij=i(xxj)modp((12)(15)8(x2)(x5)+(21)(25)7(x1)(x5)+(51)(52)11(x1)(x2))mod17
计算S=f(0)=13S = f(0) = 13S=f(0)=13

或者列出方程组:
a0+a1∗(1mod17)+a2∗(12mod17)=8a0+a1∗(2mod17)+a2∗(22mod17)=7a0+a1∗(5mod17)+a2∗(52mod17)=11\begin{array}{l} a_0 + a_1 * (1 \bmod 17) + a_2 * (1^2 \bmod 17) = 8 \\ a_0 + a_1 * (2 \bmod 17) + a_2 * (2^2 \bmod 17) = 7 \\ a_0 + a_1 * (5 \bmod 17) + a_2 * (5^2 \bmod 17) = 11 \\ \end{array} a0+a1(1mod17)+a2(12mod17)=8a0+a1(2mod17)+a2(22mod17)=7a0+a1(5mod17)+a2(52mod17)=11
求解方程组,得到a0=13,a1=10,a2=2a_0 = 13, a_1 = 10, a_2 = 2a0=13,a1=10,a2=2,则S=a0=13S = a_0 = 13S=a0=13

4 代码

package com.duwei.crypto;import java.math.BigInteger;
import java.util.Random;/*** @BelongsProject: Secure_Aggregation* @BelongsPackage: com.duwei.crypto* @Author: duwei* @Date: 2022/4/28 16:37* @Description: Shamir秘密共享方法*/
public class SecretShare {private static BigInteger p;private static Random random;/*** 秘密分享算法** @param secret 秘密* @param m      系统总用户数* @param t      秘密分享的阈值* @return m个用户的秘密数组*/public static BigInteger[] share(BigInteger secret, int m, int t) {//储存t - 1次多项系系数BigInteger[] coefficients = new BigInteger[t];coefficients[0] = secret;for (int i = 1; i < t; i++) {coefficients[i] = generateRandomBigInteger();}BigInteger[] userShares = new BigInteger[m];//进行秘密分享for (int i = 0; i < m; i++) {userShares[i] = computeShare(coefficients, (i + 1));}return userShares;}/*** 为指定用户计算秘密份额** @param coefficients 系数向量* @param userIndex    用户索引,即对于用户的x值*                     这里计算f(x)时x取值为 (下标 + 1)*                     如果直接从下标开始不加1会 直接暴露出 f(0)即秘密* @return*/public static BigInteger computeShare(BigInteger[] coefficients, int userIndex) {BigInteger index = new BigInteger(String.valueOf(userIndex));int len = coefficients.length;BigInteger temp = BigInteger.ONE;BigInteger result = BigInteger.ZERO;for (int i = 0; i < len; i++) {BigInteger cur = coefficients[i].multiply(temp);temp = temp.multiply(index);result = result.add(cur).mod(p);}return result.mod(p);}/*** 生成小于p的随机数** @return*/public static BigInteger generateRandomBigInteger() {BigInteger result;do {result = new BigInteger(p.bitLength(), random);} while ((result.compareTo(p) >= 0) && (result.compareTo(BigInteger.ZERO) != 0));return result;}/*** 初始化方法,指定模数的bit长度* @param bitLen*/public static void init(int bitLen) {random = new Random();p = BigInteger.probablePrime(bitLen,random);}/*** 秘密重建算法** @param shares 用户输入的秘密* @param t      可以恢复秘密的阈值* @return*/public static BigInteger reconstruction(BigInteger[] shares, int t) throws Exception {int n = shares.length;if (t > n) {throw new Exception("你当前收集的秘密份额不足以恢复秘密");}BigInteger result = new BigInteger("0");for (int i = 0; i < t; i++) {result = result.add(interpolation(shares, i + 1, t));}return result.mod(p);}/*** 求第i号用户(xK = i + 1)的了拉格朗日插值** @param values* @param t* @return*/public static BigInteger interpolation(BigInteger[] values, int xK, int t) {BigInteger result;//常量0,计算f(0)BigInteger zero = BigInteger.ZERO;BigInteger x_k = new BigInteger(String.valueOf(xK));//拉格朗日多项式BigInteger up = BigInteger.ONE;BigInteger down = BigInteger.ONE;//i代表第i个用户的份额for (int i = 0; i < t; i++) {BigInteger x_i = new BigInteger(String.valueOf((i + 1)));if (x_i.equals(x_k)) {continue;}up = up.multiply(zero.subtract(x_i));down = down.multiply(x_k.subtract(x_i));}result = up.multiply(down.modInverse(p));result = result.multiply(values[xK - 1]);return result;}public static void main(String[] args) throws Exception {init(1024);int times = 1000;System.out.println("测试开始.....");for (int i = 0;i < times;i++){//生成小于p的随机秘密BigInteger secret = generateRandomBigInteger();int m = (int) (Math.random() * 100 ) + 5;int t = (int) (Math.random() * 50 ) + 1;//阈值必须小于总用户数while (t > m){t = (int) (Math.random() * 50 ) + 1;}BigInteger[] shares = share(secret, m, t);BigInteger reconstruction = reconstruction(shares, t);if (reconstruction.compareTo(secret) != 0){System.out.println("秘密值恢复错误");}}System.out.println("测试结束.....");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue理由设置_在你的下一个Web应用中使用Vue.js的三个理由

Vue.js是那么地易上手&#xff0c;它在提供了大量开箱即用的功能的同时也提供了良好的性能。请继续阅读以下事例及代码片段以便更加了解Vue.js。选择一个JavaScript框架真是太难了——因为有太多的框架可以供我们使用&#xff0c;并且它们之间的差距并不是很明显。如果你认为生…

什么是spark的惰性计算?有什么优势?_spark——spark中常说RDD,究竟RDD是什么?

本文始发于个人公众号&#xff1a;TechFlow&#xff0c;原创不易&#xff0c;求个关注今天是spark专题第二篇文章&#xff0c;我们来看spark非常重要的一个概念——RDD。在上一讲当中我们在本地安装好了spark&#xff0c;虽然我们只有local一个集群&#xff0c;但是仍然不妨碍我…

隐私计算 2.3 基于中国剩余定理的秘密共享方案

1 简介 作者&#xff1a;Asmuth和Bloom&#xff1b;时间&#xff1a;1983年&#xff1b;理念&#xff1a;基于中国剩余定理&#xff08;CRT&#xff09;。 2 具体实现 I 秘密分割算法 &#xff08;1&#xff09;选择nnn个整数d1,d2,…,dnd_1, d_2, \dots, d_nd1​,d2​,…,d…

服务器基线加固脚本_Linux 基线检查,安全加固脚本

#!/bin/bash# Author:韩伟# Date: 2019-12-29# 实现对用户密码策略的设定&#xff0c;如密码最长有效期等datedate %Y-%m-%dread -p "是否设置密码策略[y/n]:" Yif [ "$Y" "y" ];thenread -p "设置密码最多可多少天不修改&#xff1a;&quo…

前端websocket获取数据后需要存本地吗_是什么让我放弃了Restful API?了解清楚后我全面拥抱GraphQL!...

背景REST作为一种现代网络应用非常流行的软件架构风格&#xff0c;自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性&#xff0c;可扩展性&#xff0c;伸缩性受到广大Web开发者的喜爱。REST 的 API 配合JSON格式的数据交换&#xff…

隐私计算 2.4 Brickell秘密共享方案

1 简介 作者&#xff1a;Brickell&#xff1b;时间&#xff1a;1989年&#xff1b;理念&#xff1a;Shamir秘密共享方案的推广&#xff0c;由一维方程转向多维向量。 2 具体实现 I 秘密分割算法 &#xff08;1&#xff09;首先确定可以掌握钥匙的人数nnn&#xff0c;以及模数…

fabric shim安装合约_智能合约简介_智能合约开发_Hyperledger Fabric_开发指南_区块链服务 BaaS - 阿里云...

概述在 Hyperledger Fabric 中&#xff0c;链码(Chaincode)又称为智能合约(下文中我们统一称为链码)&#xff0c;是用Go&#xff0c;node.js或Java编写的程序&#xff0c;主要用于操作账本上的数据。用户的应用程序通过链码与 Fabric 账本数据进行交互&#xff0c;交互关系如下…

子集和问题 算法_LeetCode刷题实战90:子集 II

算法的重要性&#xff0c;我就不多说了吧&#xff0c;想去大厂&#xff0c;就必须要经过基础知识和业务逻辑面试算法面试。所以&#xff0c;为了提高大家的算法能力&#xff0c;这个公众号后续每天带大家做一道算法题&#xff0c;题目就从LeetCode上面选 &#xff01;今天和大家…

隐私计算 2.5 Blakley秘密共享方案

1 简介 作者&#xff1a;Blakley&#xff1b;时间&#xff1a;1979年&#xff1b;理念&#xff1a;基于高斯消元法。 2 具体实现 I 秘密分割算法 II 秘密重构算法 3 实例 设秘密S(3,10,5)S (3, 10, 5)S(3,10,5)&#xff0c;n5n 5n5, t3t 3t3。 I 秘密分割 &#xff0…

webconfig的解决方案怎么添加_解决在Web.config或App.config中添加自定义配置的方法详解...

解决在Web.config或App.config中添加自定义配置的方法详解本篇文章是对在Web.config或App.config中添加自定义配置的方法进行了详细的分析介绍&#xff0c;需要的朋友参考下.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持…

conda如何升级pytorch_Google Cloud TPUs 支持 Pytorch 框架啦!

在2019年PyTorch开发者大会上&#xff0c;Facebook&#xff0c;Google和Salesforce Research联合宣布启动PyTorch-TPU项目。项目的目标是在保持PyTorch的灵活性的同时让社区尽可能容易地利用云TPU提供的高性能计算。团队创建了PyTorch/XLA这个repo&#xff0c;它可以让使PyTorc…

隐私计算 2.6 秘密共享的同态特性

1 秘密共享的同态性 秘密共享的同态性&#xff1a;秘密份额的组合等价于组合的秘密共享份额。 假设A、B两方分别有秘密SAS^ASA和SBS^BSB&#xff1b;他们的值被随机拆分为S1A,…,SnAS_1^A, \dots, S_n^AS1A​,…,SnA​和S1B,…,SnBS_1^B, \dots, S_n^BS1B​,…,SnB​&#xff…

chromiumwebbrowser 使用_用Tchromium替换webbrowser

用惯了EmbeddedWB,不想换&#xff0c;但是IE内核一直存在内存泄漏问题&#xff0c;没办法&#xff0c;只有寻找替代品了。要把用习惯的EmbeddedWB换成完全不一样的TChromium&#xff0c;有点挑战&#xff0c;特别是在资料不多&#xff0c;英语没过三级的情况下。未来趋势是这样…

python是在linux系统下运行的吗_Linux系统下python代码运行shell命令的方法

方法一&#xff1a;os.popen #!/usr/bin/python#-*- coding: UTF-8 -*- importos, sys#使用 mkdir 命令 a lsb os.popen(a,w,1)print b 方法二&#xff1a;os.system #!/usr/bin/python#-*- coding: UTF-8 -*- importos, sys arg0"121.429015"arg1"31.245255&q…

隐私计算 2.7 Shamir门限秘密共享的加法同态性

1 Shamir门限秘密共享的加法同态性 Shamir门限秘密共享方案具有(,)(, )(,)同态的性质&#xff0c;即&#xff1a; SASBFI(S1A,…,StA)FI(S1B,…,StB)FI(S1AS1B,…,StAStB)\begin{array}{l} S^A S^B && F_I(S_1^A, \dots, S_t^A) F_I(S_1^B, \dots, S_t^B)\\ &&a…

pageable设置size_分页工具一Pageable与Page

import org.springframework.data.domain.Pageable;import org.springframework.data.domain.Page;1.Pageable概述Page findByAge(int age, Pageable pageable);Pageable 是Spring Data库中定义的一个接口&#xff0c;用于构造翻页查询&#xff0c;是所有分页相关信息的一个抽象…

二阶龙格库塔公式推导_带你走进最美数学公式

同学们&#xff0c;我们先来跟老师欣赏一下数学中最优美的式子吧&#xff1f;是什么魔力让以上几个似乎毫不相干的数学中最特殊的数字能如此优美的写在同一个式子呢&#xff1f;是欧拉&#xff0c;是数学。0和1——老师就不用介绍啦&#xff0c;e是自然常数(natural constant)&…

python如何做辅助线_角平分线如何做辅助线,学霸总结了4种模型,轻松应付中考...

角平分线2大辅助线思路4种基本模型对称形思路包括3种基本模型&#xff0c;思想都是为了构造全等三角形&#xff0c;然后转换图像中的角度和线段关系。平行线思路则是为了构造一个等腰三角形&#xff0c;通常是为了转移线段关系。双角平分线夹角公式记住这个结论&#xff0c;在选…

隐私计算 2.8 Shamir门限秘密共享的乘法同态性

1 Shamir门限秘密共享的乘法同态性 Shamir门限秘密共享方案具有(,)(\times, \times)(,)同态的性质&#xff0c;即&#xff1a; SASBFI(S1A,…,StA)FI(S1B,…,StB)FI(S1A⊗S1B,…,StA⊗StB)\begin{array}{l} S^A \times S^B && F_I(S_1^A, \dots, S_t^A) \times F_I(S_…

备份数据库的expdp语句_【ORACLE语句备份】数据库表同步 ——定时任务管理器(EXPDP导出,IMPDP导入)...

1、C:\Users\Administrator>sqlplus sys/xxxxxx as sysdba;2、SQL> create directory dbbak4 as e:\app\temp4;3、SQL> grant read,write on directory dbbak4 to xxx;--xxx:源数据库用户名4、SQL> exit;5、备注&#xff1a;还需手动创建目录&#xff0c;否则报错C…