zoukankan      html  css  js  c++  java
  • 基于RSA的实用门限签名算法

    摘自:https://zhuanlan.zhihu.com/p/135258941

    1 门限签名

    门限签名是普通数字签名的一个重要分支,是门限秘密共享技术和数字签名的一种结合。1991年,Desmedt-Frankel首次提出了 [公式]门限签名方案。 [公式]门限签名方案是指由 [公式] 个成员组成一个签名群体,该群体有一对公钥和私钥,群体内大于等于 [公式] 个合法、诚实的成员组合可以代表群体用群私钥进行签名,任何人可利用该群体的公钥进行签名验证。这里 [公式] 是门限值,只有大于等于 [公式] 个合法成员才能代表群体进行签名,群体中任何[公式]个或更少的成员不能代表该群体进行签名,同时任何成员不能假冒其他成员进行签名。采用门限签名方式可以实现权力分配,避免滥用职权。

    2 基于RSA的门限签名

    本算法[1]由IBM实验室提出,算法有以下特点:

    1. it is unforgeable and robust in the random oracle model, assuming the RSA problem is hard;
    2. signature share generation and verification is completely non-inter-active;
    3. the size of an individual signature share is bounded by a constant times the size of the RSA modulus.

    算法流程:

     

    2.1 RSA算法

    2.1.1 RSA加解密

    首先,RSA算法的安全性是建立在大整数因子分解的困难性之上的。

    • 秘钥生成:选择两个互异的大素数[公式][公式],二者保密。计算[公式],公开[公式][公式][公式]保密,选择一个公开的随机数[公式],满足[公式],计算[公式][公式]保密。此时,公钥为[公式],私钥为[公式]
    • 加密:加密结果[公式],已知条件[公式],公钥[公式]
    • 解密:解密结果[公式],已知条件[公式],私钥[公式]

    2.1.2 RSA签名验签

    选取整数[公式],消息空间与签名空间均为整数空间,即[公式],定义秘钥集合[公式]

    [公式],Bob要对[公式]签名,取[公式][公式],于是验证等式[公式]是否成立。

    2.2 系统初始化

    系统中有[公式]个参与者,编号分别为[公式],有一个可信的dealer和一个敌手adversary。dealer选择两个长度(512bit)相等的素数[公式][公式],设[公式],其中[公式]也都是素数。RSA模[公式],令[公式],并选择公共一个素数指数[公式]

    此时,RSA公钥为[公式]

    2.3 密钥分享

    接下来,dealer选择[公式],满足[公式],即[公式]就是要分享的秘密值。设置[公式],dealer随机的选择[公式]为门限值。即构成的关于[公式]次多项式为[公式]

    对于[公式],计算分享的密钥值[公式][公式]就是对于参与者[公式]的私钥[公式]

    接下来,计算 verification keys,用于验证签名的是否有效。dealer选择一个随机值[公式],并计算[公式],令[公式]

    接下来,计算拉格朗日系数。令[公式],对于集合大小为[公式]的子集[公式],其中元素均属于[公式],对于任何[公式],定义:

    [公式]

    这些值是标准拉格朗日插值公式系数。从拉格朗日插值公式可得:

    [公式]

    2.4 生成门限签名份额

    下面,计算一个关于消息[公式]的一个签名份额:令[公式],对于参与者[公式]计算[公式][公式]是一个参与者[公式]的签名份额。

    每个签名份额对于有一个正确性的证明,这个正确性证明仅对于基[公式][公式]离散对数与对于基[公式][公式]离散对数相似。

    下面,计算内阁签名份额的正确性证明以及如何验证这个签名份额:[公式][公式]的比特长度,[公式]是一个hash函数,函数输出一个[公式]bit的整数,此处[公式]是第二个安全参数。为了生成正确性证明,参与者选择随机数[公式],计算:

    [公式]

    此时,正确性证明就变成[公式]。为了验证这个证明,只需要检查下面等式是否成立:

    [公式]

    此处,计算的是[公式],而不是[公式],原作者是这样解释的:Although [公式] is supposed to be a square, this is not easily verified. This way, we are sure to be working in [公式], where we need to be working to ensure soundness.

    2.5 组合签名份额

    在组合所有签名份额之前,先要验证每一个签名份额,并且要满足有效的签名份额个数不能小于门限[公式]

    假设此处有一组有效的签名份额集合[公式][公式]。令[公式],且假设[公式]。然后组合签名份额,计算:

    [公式]

    此处的[公式]就是2.3节中的[公式]。根据[公式],可得[公式],此处[公式]

    因为[公式],通过算法:[公式],即为组合后的签名结果。此处[公式][公式]均为整数,且满足[公式],可以从[公式][公式]上的扩展欧几里德算法得到,这样就很容易计算出满足[公式][公式]

    2.6 签名验证

    验证签名与RSA签名验证逻辑一样:计算[公式],此处[公式]即为2.5节中组合后的签名结果。验证者,只需要验证[公式]是否成立。

    3 参考资料

    [1]

     

    本文首发公众号VenusBlockChain,VenusBlockChain致力于区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。有兴趣的小伙伴们,欢迎关注。

  • 相关阅读:
    datatables ajax异步分页
    redis实现消息发布/订阅
    使用Tomcat+Redis来实现集群部署中的Session共享问题
    工具:从一个文件夹中复制jar到另一个文件夹中
    CentOS配置上网
    热力图与百度地图扩展实例
    【转】JavaWeb编码之get方式中文乱码问题
    数字转换大写核心类
    详说 Navicat for MySQL 快捷键
    MYBATIS常用的sql事例
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/13407537.html
Copyright © 2011-2022 走看看