JavisOJ 密码学解题笔记

文章目录

    • 楔子、前言
    • 一、[xman2019]xgm
      • 1. 简单分析
      • 2. 解密
    • 二、[xman2019]xbk
      • 1. 简单分析
      • 2. 解密
    • 三、[xman2019]xyf
      • 1. 简单分析
      • 2. 解密

楔子、前言

想深入学习一下密码学的相关知识,以及这些密码学的知识在CTF比赛中的应用,所以就有了这一篇刷题笔记。我会将Tag写到每个单独的题的最上面

一、[xman2019]xgm

RSA、共模攻击

1. 简单分析

n1=21660190931013270559487983141966347279666044468572000325628282578595119101840917794617733535995976710097702806131277006786522442555607842485975616689297559583352413160087163656851019769465637856967511819803473940154712516380580146620018921406354668604523723340895843009899397618067679200188650754096242296166060735958270930743173912010852467114047301529983496669250671342730804149428700280401481421735184899965468191802844285699985370238528163505674350380528600143880619512293622576854525700785474101747293316814980311297382429844950643977825771268757304088259531258222093667847468898823367251824316888563269155865061
e1=65537
c1=11623242520063564721509699039034210329314238234068836130756457335142671659158578379060500554276831657322012285562047706736377103534543565179660863796496071187533860896148153856845638989384429658963134915230898572173720454271369543435708994457280819363318783413033774014447450648051500214508699056865320506104733203716242071136228269326451412159760818676814129428252523248822316633339393821052614033884661649376604245744651142959498917235138077366818109892738298251161767344501687113868331134288984466294415889635863660753717476594011236542159800099371872396181448655448842148998667568104710807411358117939831241620315

n2=21660190931013270559487983141966347279666044468572000325628282578595119101840917794617733535995976710097702806131277006786522442555607842485975616689297559583352413160087163656851019769465637856967511819803473940154712516380580146620018921406354668604523723340895843009899397618067679200188650754096242296166060735958270930743173912010852467114047301529983496669250671342730804149428700280401481421735184899965468191802844285699985370238528163505674350380528600143880619512293622576854525700785474101747293316814980311297382429844950643977825771268757304088259531258222093667847468898823367251824316888563269155865061
e2=70001
c2=8180690717251057689732022736872836938270075717486355807317876695012318283159440935866297644561407238807004565510263413544530421072353735781284166685919420305808123063907272925594909852212249704923889776430284878600408776341129645414000647100303326242514023325498519509077311907161849407990649396330146146728447312754091670139159346316264091798623764434932753276554781692238428057951593104821823029665203821775755835076337570281155689527215367647821372680421305939449511621244288104229290161484649056505784641486376741409443450331991557221540050574024894427139331416236263783977068315294198184169154352536388685040531

直接就发现n1=n2了,这里就是一个普通的共模攻击了,直接带入我们的共模攻击的脚本就行了。

2. 解密

普通共模攻击的脚本

import gmpy2
from Crypto.Util.number import long_to_bytes

n1 = 21660190931013270559487983141966347279666044468572000325628282578595119101840917794617733535995976710097702806131277006786522442555607842485975616689297559583352413160087163656851019769465637856967511819803473940154712516380580146620018921406354668604523723340895843009899397618067679200188650754096242296166060735958270930743173912010852467114047301529983496669250671342730804149428700280401481421735184899965468191802844285699985370238528163505674350380528600143880619512293622576854525700785474101747293316814980311297382429844950643977825771268757304088259531258222093667847468898823367251824316888563269155865061
e1 = 65537
c1 = 11623242520063564721509699039034210329314238234068836130756457335142671659158578379060500554276831657322012285562047706736377103534543565179660863796496071187533860896148153856845638989384429658963134915230898572173720454271369543435708994457280819363318783413033774014447450648051500214508699056865320506104733203716242071136228269326451412159760818676814129428252523248822316633339393821052614033884661649376604245744651142959498917235138077366818109892738298251161767344501687113868331134288984466294415889635863660753717476594011236542159800099371872396181448655448842148998667568104710807411358117939831241620315

n2 = 21660190931013270559487983141966347279666044468572000325628282578595119101840917794617733535995976710097702806131277006786522442555607842485975616689297559583352413160087163656851019769465637856967511819803473940154712516380580146620018921406354668604523723340895843009899397618067679200188650754096242296166060735958270930743173912010852467114047301529983496669250671342730804149428700280401481421735184899965468191802844285699985370238528163505674350380528600143880619512293622576854525700785474101747293316814980311297382429844950643977825771268757304088259531258222093667847468898823367251824316888563269155865061
e2 = 70001
c2 = 8180690717251057689732022736872836938270075717486355807317876695012318283159440935866297644561407238807004565510263413544530421072353735781284166685919420305808123063907272925594909852212249704923889776430284878600408776341129645414000647100303326242514023325498519509077311907161849407990649396330146146728447312754091670139159346316264091798623764434932753276554781692238428057951593104821823029665203821775755835076337570281155689527215367647821372680421305939449511621244288104229290161484649056505784641486376741409443450331991557221540050574024894427139331416236263783977068315294198184169154352536388685040531


# 扩展欧几里得(贝祖等式)
def ext_euclid(a, b):
    if b == 0:
        return 1, 0, a
    else:
        x, y, q = ext_euclid(b, a % b)  # q = gcd(a, b) = gcd(b, a%b)
        x, y = y, (x - (a // b) * y)
        return x, y, q


def same_mod(n, e1, e2, c1, c2):
    s, t, q = ext_euclid(e1, e2)
    m = (gmpy2.powmod(c1, s, n) * gmpy2.powmod(c2, t, n)) % n  # powmod进行大数运算
    flag = long_to_bytes(m)
    print(flag)
    return flag


if __name__ == '__main__':
    same_mod(n1, e1, e2, c1, c2)
# b'flag{gongmogongji}'

二、[xman2019]xbk

RSA、低加密指数攻击

1. 简单分析

低加密指数攻击是因为加密时使用的指数太小了,所造成的的后果是m ^ e mod nm ^ e非常接近,可以直接使用脚本爆破,这个比共模攻击要稍微简单一些。

2. 解密

import gmpy2
from Crypto.Util.number import long_to_bytes

n = 47966708183289639962501363163761864399454241691014467172805658518368423135168025285144721028476297179341434450931955275325060173656301959484440112740411109153032840150659
e = 3
c = 10968126341413081941567552025256642365567988931403833266852196599058668508079150528128483441934584299102782386592369069626088211004467782012298322278772376088171342152839

while True:
    ans = gmpy2.iroot(c, e)[0]
    res = gmpy2.iroot(c, e)[1]
    if res:
        print(ans)
        print(long_to_bytes(ans))  # b'flag{let_me_do_sth_good}'
        break
    else:
        c += n

三、[xman2019]xyf

RSA、p与q太接近

1. 简单分析

给出的数据为

n=3161262255255421133292506694323988711204792818702640666084331634444148712428915950639954540974469931426618702044672318134908678730641981414037034058320359158246813987154679178159391832232990193738454116371045928434239936027006539348488316754611586659587677659791620481200732564068367148541242426533823626586574915275209508300120574819113851895932912208783915652764568319771482309338434364094681579135086703127977870534715039005822312878739611630155714313119545610939253355808742646891815442758660278514976431521933763272615653261044607041876212998883732724662410197038419721773290601109065965674129599626151139566369
e=65537
c=631583911592660652215412683088688785438938386403323323131247534561958531288570612134139288090533619548876156447498627938626419617968918299212863936839701943643735437264304062828205809984533592547599060829451668240569384130130080928292082888526567902695707215660020201392640388518379063244487204881439591813398495285025704285781072987024698133147354238702861803146548057736756003294248791827782280722670457157385205787259979804892966529536902959813675537028879407802365439024711942091123058305460856676910458268097798532901040050506906141547909766093323197363034959926900440420805768716029052885452560625308314284406

而在RSA中,有一种获取p、q的方式是非常不安全的,那就是p、q非常接近的时候,由于n是暴露出去的,p、q又非常接近,那直接对n操作就很容易获得p和q的值,可以直接先对n进行开方,然后在开方后的数值附近进行爆破即可
参考素数分布定理
大约可以在3000以内的范围进行爆破,下面对理论进行验证,如果p、q相差太近的话,有n如何爆破获得p、q。

2. 解密

"""
Author: 抒情诗、
Site: https://m4xlmum.github.io
"""

import gmpy2
from Crypto.Util.number import long_to_bytes

n = 3161262255255421133292506694323988711204792818702640666084331634444148712428915950639954540974469931426618702044672318134908678730641981414037034058320359158246813987154679178159391832232990193738454116371045928434239936027006539348488316754611586659587677659791620481200732564068367148541242426533823626586574915275209508300120574819113851895932912208783915652764568319771482309338434364094681579135086703127977870534715039005822312878739611630155714313119545610939253355808742646891815442758660278514976431521933763272615653261044607041876212998883732724662410197038419721773290601109065965674129599626151139566369
e = 65537
c = 631583911592660652215412683088688785438938386403323323131247534561958531288570612134139288090533619548876156447498627938626419617968918299212863936839701943643735437264304062828205809984533592547599060829451668240569384130130080928292082888526567902695707215660020201392640388518379063244487204881439591813398495285025704285781072987024698133147354238702861803146548057736756003294248791827782280722670457157385205787259979804892966529536902959813675537028879407802365439024711942091123058305460856676910458268097798532901040050506906141547909766093323197363034959926900440420805768716029052885452560625308314284406


def rushPQ(n):
    midval = gmpy2.isqrt(n)  # p、q的数值分别分布在这个中间值的左右,范围应该是不到1000
    # 这里我们对较大的数进行爆破
    for i in range(1000):
        q = midval + i
        p = n // q
        if p * q == n:
            return p, q


def getMessage(n, p, q, e, c):
    phin = (p - 1) * (q - 1)
    d = gmpy2.invert(e, phin)
    m = pow(c, d, n)
    print(long_to_bytes(m))


if __name__ == '__main__':
    p, q = rushPQ(n)
    getMessage(n, p, q, e, c)
# b'flag{yafu_is_great_2}'

其实这种情况用工具yafu同样极易分解…

你可能感兴趣的:(CTF,密码学,密码学)