7.21 密码

本文深入探讨了两种非对称密码系统——Schmidt-Samoa密码系统和Paillier同态加密。在Schmidt-Samoa中,通过分解大合数n来找到质因数p和q,进而进行解密。而在Paillier加密中,详细介绍了密钥生成、加密和解密过程,强调了其在数据隐私保护中的应用。通过实例展示了如何使用这两个密码系统进行实际操作,包括密钥生成、加密、解密以及分解大数等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[GUET-CTF2019]Uncle Sam

考点是Schmidt-Samoa密码系统

c=pow(m,n,n)
n=p^2*q 
d=invert(n,phi(pq) 
m=pow(c,d,pq) 
pq=gcd(pow(2,n*d)-2,n)

这道题p、q通过分解n得到

from Crypto.Util.number import *
import gmpy2
privkey = 1430375790065574721602196196929651174572674429040725535698217207301881161695296519567051246290199551982286327831985649037584885137134580625982555634409225551121712376849579015320947279716204424716566222721338735256648873164510429206991141648646869378141312253135997851908862030990576004173514556541317395106924370019574216894560447817319669690140544728277302043783163888037836675290468320723215759693903569878293475447370766682477726453262771004872749335257953507469109966448126634101604029506006038527612917418016783711729800719387298398848370079742790126047329182349899824258355003200173612567191747851669220766603
pubkey =  2188967977749378274223515689363599801320698247938997135947965550196681836543275429767581633044354412195352229175764784503562989045268075431206876726265968368605210824232207290410773979606662689866265612797103853982014198455433380266671856355564273196151136025319624636805659505233975208570409914054916955097594873702395812044506205943671404203774360656553350987491558491176962018842708476009578127303566834534914605109859995649555122751891647040448980718882755855420324482466559223748065037520788159654436293431470164057490350841209872489538460060216015196875136927502162027562546316560342464968237957692873588796640619530455268367136243313422579857823529592167101260779382665832380054690727358197646512896661216090677033395209196007249594394515130315041760988292009930675192749010228592156047159029095406021812884258810889225617544404799863903982758961208187042972047819358256866346758337277473016068375206319837317222523597
enc = 1491421391364871767357931639710394622399451019824572362288458431186299231664459957755422474433520889084351841298056066100216440853409346006657723086501921816381226292526490195810903459483318275931326433052468863850690793659405367902593999395060606972100169925074005992478583035226026829214443008941631771292291305226470216430735050944285543542354459162474346521327649934512511202470099020668235115245819634762067338432916012664452035696422865651002305445711778476072004708256200872226475346448360491248823843688268126341094612981308791499434770936360676087490303951728563482686307164877000300082742316368597958297217061375140696272398140310043942637287763946305961019518639745426370821124559939597559475362769382796386720030343305889701616194279058139516811941262747298761646317383112470923295543635754747288259324745583689440061956478083777663996487389553238481759103908588004219390662578446313004404784835263543083088327198

p=128194403049680759730417456073484146647356572995921713843464320871713147845377732806963342042934962454134027743097600387979308508723555742581738982465486376489529245549008462953454385367577100489297368340937113649234808638010260771764118502798523641102975042512421309736174582209335248607849222488552635035711
q=133199096697970395010360601752123884484750642911271667153329616708900276095359262125870755605084831227824337829042027891279415798701328111263867626754073487492338827458300240653837593442381578663683707324178792275270673229517518047914128590838435632554611499345291692417044388509949314333019317417383181850957
pq=gmpy2.gcd(pow(2,pubkey*privkey,pubkey)-2,pubkey)
m=pow(enc,privkey,pq)
print(long_to_bytes(m))

Paillier同态加密(La佬博客)

密钥生成 
随机选择两个大质数 p,q 满足 gcd(pq,(p−1)(q−1))=1。此属性保证两个质数长度相等;  
计算 n=pq 和λ=lcm(p−1,q−1);   
选择随机整数 g(g∈Z∗n2),使得满足 n 整除 g 的阶(0<g<n2);   
定义 L(x)=(x−1)/n; 
计算 μ=(L(g^λ mod n^2))^−1 mod n; 
公钥为 (n,g),私钥为 (λ,μ)。  

简化版 g=n+1 λ=φ(n)=(p−1)(q−1) μ=φ(n)^−1 mod n  
加密 m 为原文(0≤m<n);  
选择随机数 r(0<r<n,r∈Z∗n2),且 gcd(r,n)=1;

加密: c=(g^m)*(r^n) mod n^2。

解密

解密:m=L(c^λ mod n^2)⋅μ mod n。
from Crypto.Util.number import getPrime as getprime ,long_to_bytes,bytes_to_long,inverse
from vanish import flag
from sympy import isprime,nextprime
import random

m=bytes_to_long(flag)
p=getprime(512)
q=nextprime(512)
n=p*q

r=random.randint(1,n)
g=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)
print "g=%d"%(g)

'''
c=14643617840485727260687883789514337554960495078025159182484344940901600090810578182116617501128323641882943106663241094886209190199404002314247096613925999812837877843566116787148411743428714726661042213165729562285577768043368385746666607442372252641495230532588344276427261824205414379772728577442269620217619275
n=5650215343715484415924649393302012617620686312875699289646188186788806118580423414401283971780836312947326343790326120926819026727018136169739576760024802083
g=786539430846729749998127835613552594423101498023741082894370020014675937062722533682541592019332908209917194089077366019472368764411032602494945304850258108
'''

分解n得到

p=521
q=10844943078148722487379365438199640340922622481527253914867923583087919613398125555472713957352852807960319277908495433640727498516349589577235272092178123
import gmpy2
from Crypto.Util.number import *
p=521
q=10844943078148722487379365438199640340922622481527253914867923583087919613398125555472713957352852807960319277908495433640727498516349589577235272092178123
c=14643617840485727260687883789514337554960495078025159182484344940901600090810578182116617501128323641882943106663241094886209190199404002314247096613925999812837877843566116787148411743428714726661042213165729562285577768043368385746666607442372252641495230532588344276427261824205414379772728577442269620217619275
n=5650215343715484415924649393302012617620686312875699289646188186788806118580423414401283971780836312947326343790326120926819026727018136169739576760024802083
g=786539430846729749998127835613552594423101498023741082894370020014675937062722533682541592019332908209917194089077366019472368764411032602494945304850258108

λ=gmpy2.lcm(p-1,q-1)
def L(x):
    return (x-1)//n
μ=gmpy2.invert(L(pow(g,λ,n**2)),n)
m=L(pow(c,λ , n**2))*μ%n
print(long_to_bytes(m))

shanghai 攻防世界

签到题~
提示维吉尼亚
压缩包里是一篇乱码的文章
添加链接描述
用这个解密
得到文章 找到flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值