Yang's blog Yang's blog
首页
Java
密码学
机器学习
命令手册
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

xiaoyang

编程爱好者
首页
Java
密码学
机器学习
命令手册
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 现代密码学

    • Chapter 0:Introduction to Modern Cryptography
    • Chapter 1:Introduction and Classical Cryptography
    • Chapter 2:Perfectly Secret Encryption
    • PChapter 3:rivate-Key Encryption
    • Chapter 4:Message Authentication Codes
    • Chapter 5:CCA-Security and Authenticated Encryption
    • Chapter 6:Hash Functions and Applications
    • Chapter 9:Number Theory and Cryptographic Hardness Assumptions
    • Chapter 11:Key Management and the Public-Key Revolution
  • 对称加密

    • DES加密算法详解
  • 同态加密方案

    • RSA乘法同态
    • Paillier 加法同态
    • 可验证Paillier同态加密
    • CKKS EXPLAINED PART 1, VANILLA ENCODING AND DECODING
    • CKKS EXPLAINED, PART 2 FULL ENCODING AND DECODING
    • CKKS EXPLAINED, PART 3 ENCRYPTION AND DECRYPTION
    • CKKS EXPLAINED, PART 4 MULTIPLICATION AND RELINEARIZATION
    • CKKS EXPLAINED, PART 5 RESCALING
  • 隐私计算框架

    • pysyft

      • README
      • PySyfy介绍
      • 数据集与资产
      • 客户端和 Datasite 访问
      • 提出研究问题
      • 审查代码请求
      • 检索结果
  • 安全知识

    • 信息安全四大顶会与分级
    • 数字签名与数字证书关系
    • 伪随机函数在密码学中的作用及其应用实例
    • 伪随机函数在与哈希函数的关系
  • 密码学
  • 同态加密方案
xiaoyang
2024-05-10

可验证Paillier同态加密

当S=(KeyGenS,Sign,Verify)表示一个签名方案时,其中:

  • KeyGenS是密钥生成算法。
  • Sign是签名算法。
  • Verify是验证算法。

AkeyGen(sz,I):接受素数大小为 sz(以比特为单位)和整数I(表示每个数据集中加密的消息数量上限)作为输入。算法计算安全的私钥 sk 和公钥 pk 参数,步骤如下:

  1. 从大小为 sz2的四个(安全的)素数 pE,qE,pS,qS中选择,使得 NE=pE⋅qE和 NS=pS⋅qS,同时满足 ϕ(NS)=(pS−1)⋅(qS−1),其中 ϕ表示欧拉函数。
  2. 生成群元素 g0,g1,h1,...,hI∈ZNS∗和 g∈ZNE2∗,其阶为 NE。
  3. 选择哈希函数 H。
  4. 最后,运行 KeyGenS(sz)以获取安全的私钥和签名密钥 (skS,pkS)。返回密钥对 (sk,pk),其中 pk=(NE,g,NS,g0,g1,h1,...,hI,H,pkS),而 sk=(pE,qE,pS,qS,skS)。

AEncrypt(sk,τ,i,m)是一个概率算法,它接受秘密参数 sk、消息 m∈M、数据集标识符 τ和索引 i∈{1,...,I}作为输入,用于计算包含带有验证标记的消息的加密后的密文 c。

具体步骤如下:

  1. 计算消息 m的 Paillier 加密 C。
  2. 取 $R = H(\tau || i) $,其中 H是哈希函数。
  3. 计算出元组 (a,b)∈ZNE×ZNE∗,使得 $g^{a}b^{N_{E}} \equiv CR \pmod {N_{E}^{2}} $,其中 g是生成群元素。
  4. 如果 τ是第一次使用,选择一个长度为 l≤sz2的尚未使用的素数 e,满足 gcd(eNE,ϕ(NS))=1,计算其逆 e−1(modϕ(NS))和签名 μe=SignskS(τ||e),并将 (τ,e,e−1,μe)存储在列表 L中。否则,从列表 L中取出 (τ,e,e−1,μe)。
  5. 从 ZeNE中随机均匀选择一个元素 s,并使用 pS和 qS计算 x,使得 $x^{eN_E} \equiv g^{s}0h_i g^{a}{1} \pmod{N_S} $。
  6. 返回 c=(C,ei,ei−1,μe,τ,σ),其中 σ=(a,b,s,x)是验证标记。

这个算法的主要目的是将消息 m加密为一个密文,并在密文中附加了用于验证正确性的标记 σ。

AEval(pk,τ,f,{ci}i∈[I]): 接受公钥 pk、数据集标识符 τ、线性函数 f=(fi)i∈I和 I个密文 {ci}i∈[I]=(Ci,ei,ei−1,τi,σi)作为输入。输出是一个密文 c。这一步的目的是对给定的一组密文进行验证和线性函数的评估,并生成一个新的密文作为输出。

该算法首先执行一系列检查:

  1. 检查是否存在索引 l∈[I]使得 τ≠τl,或者签名的验证 (Verify(pkS,τ||el,μel)=0)成立。
  2. 检查是否有两个索引 i≠j∈[I]使得 ei≠ej。

如果其中一项检查为真,则该算法将中止。否则:

  1. 设置 e=e1,e−1=e1−1,μe=μe1并在密文上评估线性函数 f。
  2. 计算新的密文 C=∏i=1ICifi(modNE2)。
  3. 通过对标签进行评估以获得新的标签 (a,b,s,x),计算如下:
    • a=∑i=1Ifiai(modNE)
    • b=∏i=1Ibifi(modNE2)
    • s=∑i=1Ifisi(modeNE)
    • s′=(∑i=1Ifisi−s)/(eNE)
    • a′=(∑i=1Ifiai−a)/(NE)
    • x=∏i=1Ixifig0s′g1a′e−1modNS
  4. 返回密文 c=(C,e,e−1,μe,σ)。

AVerify(pk,τ,c,f): 接受公钥 pk、数据集标识符 τ、密文 c=(C,a,b,e,s,τ,x)以及线性函数 f=(fi)i∈[I]作为输入,用于检测密文 c是否为有效或无效。为达到此目的,算法检查以下条件:

{Verify(pkS,τ∥e,σe)=1;a,s∈ZeNE;xeNE=g0s∏i=1Ihifig1amodNS;gabNE=C∏i=1IH(τ∥i)fimodNE2;

如果所有检查都通过,算法输出1(即 c是一个有效的密文),否则输出0(即 c是一个无效的密文)。

ADecrypt(sk,τ,c,f): 接受秘密参数 sk、数据集标识符 τ、密文 c以及线性函数 f=(fi)i∈[I]作为输入,用于计算密文 c的解密或 ⊥(如果 c是无效的密文)。然后,它通过运行 AVerify(pk,τ,c,f)来验证 c是否为有效密文。如果验证通过,算法返回通过 Dec(c)获得的消息 m。否则,返回 ⊥。

CMP14还存在一个关于函数Hp的小的实际问题,该函数为每个数据集绑定一个唯一的质数。它没有检查这个质数与群ZNS的阶是否互素。如果不是这种情况,在AEncrypt过程中计算签名值x相当于破解RSA假设,而这被认为是不可行的。

编辑 (opens new window)
上次更新: 2025/04/01, 01:48:12

← Paillier 加法同态 CKKS EXPLAINED PART 1, VANILLA ENCODING AND DECODING→

最近更新
01
操作系统
03-18
02
Nginx
03-17
03
后端服务端主动推送消息的常见方式
03-11
更多文章>
Theme by Vdoing | Copyright © 2023-2025 xiaoyang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式