首页 > 其他分享 >密码学门限方案实现

密码学门限方案实现

时间:2023-12-24 12:56:00浏览次数:30  
标签:方案 密钥 门限 long param 分片 密码学 coefficients mod

密码学门限方案实现

分出来的块

/**
 * 块。将密钥按照某种规则分解成的密码片。对应于多项式的坐标,index表示横坐标,value表示纵坐标
 *
 * @author Seven
 * @version 1.0
 * @date 2020-09-14 22:18
 */
@Data
public class Piece {
    /**
     * 块下标,从 1 开始
     */
    private int index;
    /**
     * 块存储的数值
     */
    private long value;
    /**
     * 构造器
     *
     * @param index 块下标
     * @param value 块存储的数值
     */
    public Piece(int index, long value) {
        this.index = index;
        this.value = value;
    }
}

一、界面效果

  • 输入参数

image-20200920221204227

  • 生成密钥
    image-20200920221222770

  • 选择“恢复密钥“选项卡
    image-20200920221240858

  • 点击”获取分片”
    image-20200920221308615

  • 保留任意 3 个分片,可以正常恢复出密钥
    image-20200920221337291

  • 保留任意两个分片,不能准确恢复密钥
    image-20200920221355462

二、Shamir(k, n)门限方案

参考:

[1] Shamir 门限方案介绍:Secret Sharing Explained Visually

1. 密码块生成算法

1)多项式求值算法

/**
 * 计算生成多项式 f(x) = secretKey + coefficients[0] * x + coefficients[1] * x ^ 2 + ... + coefficients[n] * x ^ n
 * 的值。模运算。
 *
 * @param coefficients 系数,下标 0 表示 x^1 的系数,下标 n 表示 x^(n + 1) 的系数
 * @param x            自变量
 * @param c            常数项
 * @param mod          模,所有运算为模运算
 * @return f(x)
 */
private long fun(int x, long c, long[] coefficients, long mod) {
    LinkedList<Long> coefs = new LinkedList<>();
    for (long item : coefficients) {
        coefs.add(item);
    }

    return (fun0(x, coefs, mod) + c) % mod;
}

/**
 * 多项式算法(模运算)
 * f(x) = c + a1 * x^1 + a2 * x^2 + a3 * x^3 + ... + an * x^n
 * = c + x(a1 + x(a2 + x(a3 ... + x(an))))
 *
 * @param x            自变量
 * @param coefficients 系数
 * @param mod          模
 * @return f(x)
 */
private long fun0(int x, LinkedList<Long> coefficients, long mod) {
    if (coefficients == null || coefficients.size() == 0) {
        return 0;
    }

    if (coefficients.size() == 1) {
        return (long) ((1.0 * coefficients.get(0)) * x % mod);
    }

    long a0 = coefficients.removeFirst();
    LinkedList<Long> list = new LinkedList<>(coefficients);
    return (long) ((1.0 * x * (a0 + fun0(x, list, mod))) % mod);
}

2)随机系数生成算法

/**
 * 生成随机数
 *
 * @param coefficients 保存的位置
 * @param bound        最大值,不包含
 */
private void genRandomNum(long[] coefficients, long bound) {
    Random random = new Random();
    for (int i = 0; i < coefficients.length; i++) {
        // 这里的随机数可能为负数,需要转成正数
        coefficients[i] = Math.floorMod(random.nextLong(), bound);
    }
}

3)密钥块生成算法

/**
 * 计算分片
 *
 * @param secretKey               密钥
 * @param totalPieceNumber        总分片数(n)
 * @param minEffectiveSliceNumber 最小有效分片数(k),取 k 个以上的分片才能还原出密钥
 * @param mod                     模,所有的运算将在此模下进行。素数,大于 <code>totalPieceNumber</code> 和 <code>secretKey</code>
 * @return 分片后的数据
 */
@Override
public Piece[] genPieces(long secretKey, int totalPieceNumber, int minEffectiveSliceNumber, long mod) {
    // 1. 随机生成多项式的系数。多项式的项数为:totalPieceNumber - minEffectiveSliceNumber
    // 系数,下标 0 表示 x^1 的系数,下标 n 表示 x^(n + 1) 的系数
    long[] coefficients = new long[totalPieceNumber - minEffectiveSliceNumber];
    // 生成随机数,取值范围为 [0, mod)
    genRandomNum(coefficients, mod);

    // 生成多项式为 f(x) = secretKey + coefficients[0] * x + coefficients[1] * x ^ 2 + ... + coefficients[n] * x ^ n
    // 2. 求每个块,即求 f(1), f(2) ... f(totalPieceNumber)
    Piece[] result = new Piece[totalPieceNumber];
    for (int i = 0; i < result.length; i++) {
        long value = fun(i + 1, secretKey, coefficients, mod);
        result[i] = new Piece(i + 1, value);
    }

    return result;
}

2. 密钥恢复算法

1)欧几里得插值多项式求解

/**
 * 根据部分分片,尝试还原出密钥
 *
 * @param pieces                  部分分片
 * @param totalPieceNumber        总分片数(n)
 * @param minEffectiveSliceNumber 最小有效分片数(k),取 k 个以上的分片才能还原出密钥
 * @param mod                     模,所有的运算将在此模下进行。素数,大于 <code>totalPieceNumber</code> 和 <code>secretKey</code>
 * @return 还原出的密钥,如果分片不充分,则不能还原出正确的密钥
 */
@Override
public long restoreSecretKey(Piece[] pieces, long mod) {
    long x = 0;
    // 这里使用 double 是为了防止 long 数值溢出
    double result = 0;
    for (Piece piece : pieces) {
        // 这里使用 double 是为了防止 long 数值溢出
        double a = piece.getValue();
        for (Piece p : pieces) {
            if (p != piece) {
                long inverse = ModUtil.modInverse(piece.getIndex() - p.getIndex(), mod);
                a *= (x - p.getIndex()) * inverse;
                a = Math.floorMod((long) (a % mod), mod);
            }
        }
        result += a;
        result = Math.floorMod((int) (result % mod), mod);
    }
    return (long) result;
}

三、基于中国剩余定理的(k, n)门限方案

标签:方案,密钥,门限,long,param,分片,密码学,coefficients,mod
From: https://www.cnblogs.com/xianzun/p/17924252.html

相关文章

  • 使用office打开word文档时候提示错误:0x426-0x0的解决方案
    在使用office打开word文档时候提示错误:0x426-0x0。如下图:昨天还用的好好的,怎么今天就不行了?为什么呢?这个错误导致office无法启动通常是由于office软件所依赖的服务无法正常运行导致。为什么会无法启动呢?突然想到,凯哥昨天手贱,昨天电脑重启时候,提示有需要优化的启动项,于是在wind+R,运......
  • 在使用 npm install的时候提示node-sass command faile 解决方案
    在使用npminstall的时候错误提示node-sass相关的。错误信息如下图:解决方法(PS:凯哥的不适用)出现这种问题基本是由于node版本与sass版本不匹配导致的方案1:卸载node,安装对应版本方案2:修改sass版本修改sass版本,有可能导致其他依赖包出错,所以还是重新安装node版本。node-v4、查看node......
  • GB28181安防监控LiteCVR视频平台智慧工地AI视频解决方案
    AI视频技术与安防监控结合使用的场景和技术不仅提高了安全性和准确性,还降低了人力成本和监控盲区,广泛应用于公共场所、企业、学校等各个领域。随着人工智能技术的不断发展,AI视频识别技术在工地场景中的应用也越来越广泛。这种技术可以帮助工地实现智能化、高效化的管理,提高施工质量......
  • JAVA 同城服务家政服务系统源码的运营方案?
    随着社会的发展和生活水平的提高,人们对家庭服务的需求也日益增加。为了满足这一需求,开发一款基于JAVA的家政服务系统源码具有重要意义。本文将介绍该系统的运营方案,包括市场分析、目标市场定位、竞争优势、营销策略、客户服务等方面。一、市场分析当前家政服务市场存在诸多问题,如服......
  • 密码学期末复习
    密码学复习笔记欧几里得算法欧几里得算法(辗转相除法)利用带余除法求两个整数a和b的最大公因子的过程。给定两个正整数a和b,假定a大于b,由带余除法,可以得到:其中r就是a和b的最大公因子算术基本定理同余关系的性质取模重要结论快速幂计算器快速模幂运算如果B是2......
  • 实时获取淘宝商品评论数据:价值、挑战与解决方案
    一、引言随着电商行业的迅猛发展,用户评论在电商决策中的影响力逐渐增强。作为中国电商市场的领军者,淘宝提供了商品评论API,使得第三方开发者可以轻松获取淘宝商品评论数据。本文将深入探讨淘宝商品评论API在电商行业中的重要性,以及如何通过API实现实时数据获取。二、淘宝商品评论API......
  • Configuration 'compile' is obsolete and has been replaced with 'implementati解决
    AndroidStudio更新到3.1.2编译之前的项目直接抛出下面的异常,这让我很是头疼,经过一翻查找发现是我们配置文件中的API已经过期,我对过期的API进行修改就Over了1、异常显示Configuration‘compile’isobsoleteandhasbeenreplacedwith‘implementation’and‘api’.It......
  • PostgreSQL. 异常“more than one owned sequence found”的解决方案
    一、异常信息描述执行数据库操作时,主键id没有自增,且报“morethanoneownedsequencefound”的异常,造成数据没有insert进去,下面是详细的异常信息:java.lang.reflect.InvocationTargetExceptionatsun.reflect.GeneratedMethodAccessor613.invoke(UnknownSource)ats......
  • Hessian——轻量级远程调用方案
    Hessian——轻量级远程调用方案转载自:https://www.cnblogs.com/lyhero11/p/5277583.htmlHessian是caucho公司开发的一种基于二进制RPC协议(RemoteProcedureCallprotocol)的轻量级远程调用框架。具有多种语言的实现,但用的最多的当然是Java实现:)CreatingaHessianservi......
  • [C++] 获取工程路径、解决方案路径和.exe路径
    作者:丶布布文章预览:......