热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

密码学学习笔记之pailliercryptosystem

 Preface现代公钥密码系统中,其实远远不止RSA、DSA、ECC等众所周知的公钥密码系统,最近还学习到了一种比较年轻的公钥密码系统 —— paillier cryptosystem 但是wiki

 

Preface

现代公钥密码系统中,其实远远不止RSA、DSA、ECC等众所周知的公钥密码系统,最近还学习到了一种比较年轻的公钥密码系统 —— paillier cryptosystem 但是wiki上并没有给出该方案的解密的proof。

 

Introduce

Paillier密码,于1999年由Pascal Paillier发明,是一种用于公钥加密的概率非对称算法。该算法具有加法同态的性质 ; 这意味着,仅给出公钥和m1、m2加密,可以计算出m1 + m2

 

Key generation



The frist pattern:



  1. 随机选择两个大质数p、q满足gcd(pq, (p-1)*(q-1))。

  2. 计算n=p*q,λ = lcm(p-1, q-1) = (p-1)*(q-1) / gcd(p-1,q-1)

  3. 选择随机整数g,0
  4. 定义L(x) = (x-1) / n

  5. 计算μ = (L(g^λ mod n^2 ))^(-1) mod n

  6. 公钥为(n,g)

  7. 私钥为(λ,μ)



The second pattern(a simpler variant):

其余参数不变,主要改变了g,λ,μ的定义


  1. g = n+1

  2. λ = φ(n) = (p-1)*(q-1)

  3. μ = φ(n)^(-1) (mod n)

 

Encryption



  1. 设m为要加密的消息,显然需要满足,0 ≤ m < n

  2. 选择随机 r,保证gcd(r, n) = 1

  3. 密文c:c = (g^m) *(r^n) mod n^2

 

Decryption



  1. m = ( L( c^λ mod n^2 ) * μ ) mod n



Proof

以下推理过程就用数学公式记录了,如果平台显示不出来的话,建议复制进typora等此类编辑器中食用,下面也会给出截图


The first pattern

由 $L(c^λ pmod{n^2}*μ) pmod{n}$

有 $L(g^{mλ}r^{nλ} pmod{n^2})μ pmod{n}$ ①

其中$λ = frac{(p-1)(q-1)}{gcd((p-1)(q-1))}, μ = L(g^λ pmod{n^2})^{-1} pmod{n}$

所以①式=> $L(g^{mλ}r^{nλ} pmod{n^2})L(g^λ pmod{n^2})^{-1} pmod{n}$ ②

∵$(p-1)|λ, (q-1)|λ$

∴$λ = k_1(p-1) = k_2(q-1)$

∴$g^λ = g^{k_1(p-1)}equiv 1 pmod{p},即 (g^λ -1) | p$

$ g^λ = g^{k_2(q-1)}equiv 1 pmod{q}, 即 (g^λ -1) | q$

∴$ (g^λ -1) | lcm(p,q) ,即 (g^λ -1) | pq,即g^λ equiv 1 pmod{n} $

∴$g^λ pmod{n^2} equiv 1pmod{n}$

∴$g^λpmod{n^2} = k_gn+1; k

∴$L(g^λpmod{n^2}) = k_g$

且有


  1. $1+kn equiv 1+kn pmod{m^2}$

  2. $(1+kn)^2 equiv 1+2kn+(kn)^2 equiv 1+2kn pmod{m^2}$

  3. $(1+kn)^3 equiv 1+3(kn)^2+3kn+(kn)^3 equiv 1+3kn pmod{m^2}$这里我们就不用数学分析法了,就直接易得了=> $(1+kn)^{m} equiv knm+1 pmod{n^2}$

∴$g^{mλ} = (1+k_gn)^{m} equiv k_gnm+1 pmod{n^2}$

∴$r^{nλ} = (1+k_nn)^{n} equiv k_nn^2+1 equiv 1pmod{n^2}$

∴$L(g^{mλ}*r^{nλ}pmod{n^2}) = L(k_gnm+1)=mk_g$

又∴$L(g^λpmod{n^2}) = k_g$

∴②式: $L(g^{mλ}r^{nλ} pmod{n^2})L(g^λ pmod{n^2})^{-1} pmod{n}$ => $mk_g*k_g^{-1} equiv m pmod n$

证毕
截图:


The second pattern

由 $L(c^λ pmod{n^2}*μ) pmod{n}$

有 $L(g^{mλ}r^{nλ} pmod{n^2}μ) pmod{n}$ ①

其中$λ = (p-1)*(q-1), μ = φ(n)^{-1} pmod{n}$

∵$r^{nλ} = r^{n(p-1)*(q-1)} = r^{φ(n^2)}$

由欧拉定理:$r^{φ(n^2)} equiv 1 pmod{n^2}$

①式 => $L(g^{mλ} pmod{n^2}*μ) pmod{n}$ ②

∵$g = n+1$

∴$g^{mλ} = (1+n)^{mλ} equiv nmλ+1 pmod{n^2}$

②式=> $L((nmλ+1)*μ) pmod{n}$

=> $ frac{(nmλ+1)-1}{n}*μ pmod{n}$

=>$(mλ*μ) pmod{n}$ ③

∵$λ = φ(n),μ = φ(n)^{-1} pmod{n}$

∴③式: $(mλ*μ) equiv mpmod{n}$

证毕
截图:

 

DASCTF四月月赛 not RSA

from Crypto.Util.number import getPrime as bytes_to_long
from secret import flag,p,q
from sympy import isprime,nextprime
import random
m=bytes_to_long(flag)
n=p*q
g=n+1
r=random.randint(1,n)
c=(pow(g,m,n*n)*pow(r,n,n*n))%(n*n)
print "c=%d"%(c)
print "n=%d"%(n)

可以看到,这一题就是用的paillier cryptosystem,且参数用的是上文中的The second pattern

但是我们计算λ = φ(n) = (p-1)*(q-1) ,需要用到p和q

这里我们直接上yafu分解n发现可以成功分解,原因是p与q其实非常接近,所以其实直接对n开根然后再在附近寻找素数就能找到p、q了。

所以构造解密脚本

# -*- coding: utf-8 -*-
from Crypto.Util.number import long_to_bytes,inverse
from sympy import nextprime
from gmpy2 import iroot
def L(x,n):
return (x-1)/n
c=
n=
#factor(n)
a = iroot(n,2)[0]
p = nextprime(a)
q = n//p
assert p*q == n
#根据解密公式,计算所需私钥对(λ,μ)
Lambda=(p-1)*(q-1)
miu=inverse(Lambda,n*n)
m=(L(pow(c,Lambda,n**2),n)*miu)%n
print long_to_bytes(m)

 

Homomorphic properties



Homomorphic addition of plaintexts

设D为解密函数,E为加密函数

即:D(E(m1, r1)*E(m2,r2) mod n^2)≡ m1+m2 (mod n)


proof

C = (g^m1) * (r1^n) * (g^m2) *(r2^n) mod n^2

= g^(m1+m2)*(r1r2)^n mod n^2

首先我们可以将m1+m2看作一个整体M,然后由于r1、r2是随机选的,所以r1*r2可以看作一个整体R,

故C = g^M * R^n mod n^2

由于gcd(r1,n) = 1; gcd(r2,n) = 1; => gcd(r1*r2, n) = 1,故R符合要求

所以D(C) = M ≡ m1 + m2 (mod n)


Homomorphic multiplication of plaintexts

设D为解密函数,E为加密函数

即:D(E(m1, r1)^k mod n^2)≡ km1 (mod n)


proof

C = (g^m1) * (r1^n)^k (mod n^2 )

=(g^km1)*(r1^(kn) ) (mod n^2)

首先我们可以将km1看作一个整体M,然后由于r1是随机选的,所以r1^k可以看作一个整体R,

故C = g^M * R^n mod n^2

由于gcd(r1,n) = 1 => gcd(r1^k, n) = 1,故R符合要求

所以D(C) = M ≡ km1 (mod n)

 

Reference

https://en.wikipedia.org/wiki/Paillier_cryptosystem


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Givenasinglylinkedlist,returnarandomnode'svaluefromthelinkedlist.Eachnodemusthavethe s ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
author-avatar
mobiledu2502912907
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有