Shamir秘密共享机制(加法、乘法共享)Matlab可视化实现

本文详细介绍了Shamir秘密共享的加法和乘法方案的MATLAB实现过程,包括门限设置、多项式分发、秘密恢复等步骤,并提供了相应的MATLAB代码。此外,还展示了使用MATLAB App Designer创建的可视化界面,使得秘密共享流程更加直观易用。

具体秘密共享的流程可以参考下面这个链接的内容:https://blog.youkuaiyun.com/Matrix_element/article/details/117357359

main1.m
加法方案的主函数:确认门限(代码里(5,3))以及对应的两个多项式(代码对应的多项式是y1 = 2 * x ^ 2 - 3 * x + 4, y2 = x ^ 2 + 5 x - 6,所以通过多项式分发给每个人两个值,最后通过3个人的子秘密和恢复出4 + -6 = - 2)-> 给每个人分发子秘密值 -> 通过3个人的子秘密值和使用拉格朗日恢复出-2(两个多项式的常数项和)

%%%加法方案
%%分发
% 首先确定方案门限值
 a = [5,3];
% 输入多项式的参数,生成每个人相应的密钥
% coef1 = [2,-3,4;
%          1,5,-6];%自己定义多项式系数矩阵
coef1 = ceil(rand(2,a(2))*10)%随机生成多项式系数矩阵
 s = Sharing(a, coef1);
 add_s = sum(s,2);
 
%%恢复
%P = [1,3,5];
P = [1,add_s(1);
     3,add_s(3);
     5,add_s(5)];
y = Recover(a,P)
% %恢复加法秘密值
% ab=0;
% ab = add_s(1) * ( (0-P(2)) * (0-P(3)) ) / ( (P(1)-P(2)) * (P(1)-P(3)) ) + ...
%      add_s(3) * ( (0-P(1)) * (0-P(3)) ) / ( (P(2)-P(1)) * (P(2)-P(3)) ) + ...
%      add_s(5) * ( (0-P(1)) * (0-P(2)) ) / ( (P(3)-P(1)) * (P(3)-P(2)) )
% %恢复多项式
% syms x;
% y = add_s(1) * ( (x-P(2)) * (x-P(3)) ) / ( (P(1)-P(2)) * (P(1)-P(3)) ) + ...
%      add_s(3) * ( (x-P(1)) * (x-P(3)) ) / ( (P(2)-P(1)) * (P(2)-P(3)) ) + ...
%      add_s(5) * ( (x-P(1)) * (x-P(2)) ) / ( (P(3)-P(1)) * (P(3)-P(2)) )
% y = expand(y)
       
       

main2.m
乘法方案主函数:确认门限以及对应的两个多项式-> 给每个分发子秘密值 -> 每个人再通过分发的子秘密值乘积为常数项生成自己的多项式->用自己的多项式给每个人再次进行分发(代码里的C矩阵)->计算lamda向量(这个每个人都可以计算) ->根据计算的lamda向量和每个人手里拥有的向量求每个人的最终拥有的子秘密值-> 通过3个人的子秘密值和使用拉格朗日恢复出-24(两个多项式的常数项积)

%%%乘法
%%一、首先确定方案门限值
 a = [5,3];
% 输入多项式的参数,生成每个人相应的密钥
%coef1 = ceil(rand(2,a(2))*10)%随机生成矩阵值
 coef1 = [2,-3,4;
          1,5,-6];%或者自定义矩阵
 s = Sharing(a, coef1);
 mul_s = prod(s,2);
 
%%二、每个P根据自己得到的d生成自己的n-1次多项式,并分发给每个参与者
%coef_H = [ceil(rand(a(1),a(2)-1)*100),mul_s]%随机生成多项式系数矩阵
coef_H = [1,-1,mul_s(1);
          1,-10,mul_s(2);
          1,-100,mul_s(3);
          1,-200,mul_s(4);
         1,-300,mul_s(5)];%或者自定义多项式系数矩阵
%计算C矩阵
CMatrix = CalculateCMatrix1(a,coef_H)

%%三、计算λ矩阵,每个人Pi根据自己得到的5个cji(1 <= j <= 5)
lamda = zeros(1,a(1));
M = zeros(a(1),a(1));
m = [1:1:a(1)]';
for i = 1:a(1)
    M(:,i) = m.^(i-1)
end
% M = [1,1,1,1,1; 
%     1,2,2^2,2^3,2^4; 
%     1,3,3^2,3^3,3^4; 
%     1,4,4^2,4^3,4^4; 
%     1,5,5^2,5^3,5^4];
lamda = [1,0,0,0,0] * inv(M);
%每个人根据自己得到的Cji计算C值
C = lamda * CMatrix;

%%四、进行恢复(比如满足1,3,5人),根据这几个人计算得到的C值进行恢复
P = [1,3,5];
ab=0;
ab = C(P(1)) * ( (0-P(2)) * (0-P(3)) ) / ( (P(1)-P(2)) * (P(1)-P(3)) ) + ...
     C(P(2)) * ( (0-P(1)) * (0-P(3)) ) / ( (P(2)-P(1)) * (P(2)-P(3)) ) + ...
     C(P(3)) * ( (0-P(1)) * (0-P(2)) ) / ( (P(3)-P(1)) * (P(3)-P(2)) )
%恢复多项式
syms x;
y = C(P(1)) * ( (x-P(2)) * (x-P(3)) ) / ( (P(1)-P(2)) * (P(1)-P(3)) ) + ...
     C(P(2)) * ( (x-P(1)) * (x-P(3)) ) / ( (P(2)-P(1)) * (P(2)-P(3)) ) + ...
     C(P(3)) * ( (x-P(1)) * (x-P(2)) ) / ( (P(3)-P(1)) * (P(3)-P(2)) );
y = expand(y)

       

在这里插入图片描述Sharing.m

function [s] = Sharing(a,b)
%计算分发给每个人的密钥
poly_num = size(b,1);%多项式个数
s = zeros(a(1),poly_num);
max = size(b,2);%每个多项式项数
for x = 1:a(1)
    for i = 1:poly_num
        for j = 0:max-1
            s(x,i) = s(x,i) + b(i,max-j) * x^j;
        end
%     s(x,1) = b(1,1) * x^2 + b(1,2) * x + b(1,3);
%     s(x,2) = b(2,1) * x^2 + b(2,2) * x + b(2,3);
    end
end

CalculateCMatrix.m
计算c矩阵方法1

function [s] = CalculateCMatrix(a,coef_H)

% s = zeros(a(1),a(1));
% max = size(coef_H,2);
% for i = 1:a(1)
%     for j = 1:a(1)
%        for t = 0:max-1
%             s(i,j) = s(i,j) + coef_H(i,max-t) * j^t;
%        end 
%     end  
% end

M = zeros(a(2),a(1));
m = [1:1:a(1)];
for i = a(2):-1:1
    M(i,:) = m.^(a(2)-i);
end
s = coef_H * M;


end


方法2:

function [C] = CalculateCMatrix(a,coef_H)
C = zeros(a(1),a(1));
for i = 1:a(1)
    for j = 1:a(1)
        C(i,j) = coef_H(i,1) * j^2 + coef_H(i,2) * j + coef_H(i,3);
    end
end
end

Recover.m
朗格朗日恢复

function [y] = Recover(a,P)
    num = size(P,1);
    y = 0;
    if num<a(2)
        tip = "人数不足恢复"
    else
        syms x;
        for i = 1:num
            s = P(i,2);
            for j = 1:num               
                if(i ~= j)
                    s = s * (x - P(j,1))/ ( P(i,1) - P(j,1) );
                end            
            end
           y = y + s;
        end
%         y = add_s(1) * ( (x-P(2)) * (x-P(3)) ) / ( (P(1)-P(2)) * (P(1)-P(3)) ) + ...
%              add_s(3) * ( (x-P(1)) * (x-P(3)) ) / ( (P(2)-P(1)) * (P(2)-P(3)) ) + ...
%              add_s(5) * ( (x-P(1)) * (x-P(2)) ) / ( (P(3)-P(1)) * (P(3)-P(2)) )
    end
    y = expand(y);
end

以上函数可以将整个流程进行实现。接下来使用matlab appdesigner调用上面函数进行可视化实现,整个流程更加清晰明了。

classdef SharingSecret < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure          matlab.ui.Figure
        ShamirLabel       matlab.ui.control.Label
        Panel             matlab.ui.container.Panel
        Button            matlab.ui.control.Button
        nSpinnerLabel     matlab.ui.control.Label
      
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

☆年青新☆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值