BUUCTF 每日打卡 2021-4-16

引言

今天是个值得纪念的日子
12-4 出货了
瞬间感觉心情舒畅

古典密码知多少

附件如下:
在这里插入图片描述
其中,蓝色部分为猪圈密码:
在这里插入图片描述

橙色部分为圣堂武士密码:
在这里插入图片描述
黑色部分为银河密码
在这里插入图片描述
解密结果如下:
在这里插入图片描述
下方还有一段话,提示我们要进行栅栏解密,而且结果均为大写字母
代码如下:

s = 'FGCPFLIRTUASYON'
factors = [fac for fac in range(2, len(s)) if len(s)%fac == 0] #取得密文长度的所有因数
for fac in factors:
    flag = ''
    for i in range(fac): #按一定的步长取几组字符,并连接起来,这里组数就等于步长数
        flag += s[i::fac]
    print(str(fac)+'栏:'+flag)

参考博客:https://www.cnblogs.com/lnjoy/p/railfence.html
结果为:FLAGISCRYPTOFUN
最后应该提交 flag{CRYPTOFUN}

RSA

加密代码如下:

from Crypto.Util.number import getPrime,bytes_to_long

flag=open("flag","rb").read()

p=getPrime(1024)
q=getPrime(1024)
assert(e<100000)
n=p*q
m=bytes_to_long(flag)
c=pow(m,e,n)
print c,n
print pow(294,e,n)

p=getPrime(1024)
n=p*q
m=bytes_to_long("BJD"*32)
c=pow(m,e,n)
print c,n

将上半部分的输出记为 n1, c1,pow(294,e,n) 记为 k;将下半部分的输出记为 n2, c2
容易看出 ( n 1 , n 2 ) = q (n1, n2) = q (n1,n2)=q ,据此可以求出 p,q
由于 e<100000 并且知道 pow(294,e,n) 和 pow(bytes_to_long(“BJD”*32),e,n2),所以可以遍历 e 来求出 e
剩下就是 RSA 的常规操作了
解密代码如下:

from Crypto.Util.number import *
import math

c1 = 12641635617803746150332232646354596292707861480200207537199141183624438303757120570096741248020236666965755798009656547738616399025300123043766255518596149348930444599820675230046423373053051631932557230849083426859490183732303751744004874183062594856870318614289991675980063548316499486908923209627563871554875612702079100567018698992935818206109087568166097392314105717555482926141030505639571708876213167112187962584484065321545727594135175369233925922507794999607323536976824183162923385005669930403448853465141405846835919842908469787547341752365471892495204307644586161393228776042015534147913888338316244169120
n1 = 13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
c2 = 979153370552535153498477459720877329811204688208387543826122582132404214848454954722487086658061408795223805022202997613522014736983452121073860054851302343517756732701026667062765906277626879215457936330799698812755973057557620930172778859116538571207100424990838508255127616637334499680058645411786925302368790414768248611809358160197554369255458675450109457987698749584630551177577492043403656419968285163536823819817573531356497236154342689914525321673807925458651854768512396355389740863270148775362744448115581639629326362342160548500035000156097215446881251055505465713854173913142040976382500435185442521721
n2 = 12806210903061368369054309575159360374022344774547459345216907128193957592938071815865954073287532545947370671838372144806539753829484356064919357285623305209600680570975224639214396805124350862772159272362778768036844634760917612708721787320159318432456050806227784435091161119982613987303255995543165395426658059462110056431392517548717447898084915167661172362984251201688639469652283452307712821398857016487590794996544468826705600332208535201443322267298747117528882985955375246424812616478327182399461709978893464093245135530135430007842223389360212803439850867615121148050034887767584693608776323252233254261047
k = 381631268825806469518166370387352035475775677163615730759454343913563615970881967332407709901235637718936184198930226303761876517101208677107311006065728014220477966000620964056616058676999878976943319063836649085085377577273214792371548775204594097887078898598463892440141577974544939268247818937936607013100808169758675042264568547764031628431414727922168580998494695800403043312406643527637667466318473669542326169218665366423043579003388486634167642663495896607282155808331902351188500197960905672207046579647052764579411814305689137519860880916467272056778641442758940135016400808740387144508156358067955215018

m = bytes(("BJD"*32).encode())
for e in range(1, 100000):
    if pow(294, e, n1) == k and pow(bytes_to_long(m), e, n2) == c2:
        break
print(e)

q = math.gcd(n1, n2)
p1 = n1 // q
phi = (p1-1)*(q-1)
d = inverse(e, phi)
m = pow(c1, d, n1)
print(long_to_bytes(m))

结果为:BJD{p_is_common_divisor}

结语

希望继续坚持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值