NSS刷题心得1(古典+RSA)

古典密码

在线工具:https://ctf.bugku.com/tools.html

一键解码工具库:随波逐流,在github上下载即可

注:古典密码只需做个了解,因为很多都是靠工具实现的,多刷题有个印象,遇到题能看出像什么密码就好。

Base家族

在密码学领域,"base" 通常指的是一种编码方式,用于将二进制数据转换为可打印的ASCII字符集。最常见的两种base编码是Base64和Base32。这些编码方法在密码学中用于安全地传输数据,尤其是在电子邮件和网页中,因为它们可以确保数据在传输过程中不会被破坏或误解。

  以下是Base64和Base32的简要介绍:

1.  **Base64**:
    
    *   Base64是一种编码方式,它使用64个字符(A-Z, a-z, 0-9, +, /)来表示二进制数据。
    *   它通常用于电子邮件和网页中,以确保数据在传输过程中的完整性。
    *   Base64编码不是加密,它只是一种编码方式,任何人都可以解码Base64编码的数据。
    *   在密码学中,Base64常用于编码密钥或证书等敏感信息,以便于传输。
2.  **Base32**:
    
    *   Base32是一种使用32个字符(A-Z, 2-7)的编码方式。
    *   它比Base64更安全,因为它不包含容易被混淆的字符(如+和/)。
    *   Base32编码通常用于需要更高安全性的场合,例如在无线网络中传输密钥。
    *   与Base64一样,Base32也不是加密,它只是一种编码方式。

在密码学中,Base编码通常与加密技术结合使用,以确保数据的安全性。例如,数据在加密后可能会使用Base64编码,以便于在网络上传输。然而,需要注意的是,Base编码本身并不提供任何加密保护,它只是确保数据在传输过程中不会因为特殊字符而出现问题。

总结来说,密码学中的"base"家族指的是一系列用于编码二进制数据的编码方式,其中Base64和Base32是最常见的。这些编码方式在确保数据传输的完整性和可读性方面发挥着重要作用,但它们并不提供加密保护。

MD5爆破

MD5(Message Digest Algorithm 5)是一种广泛使用的密码散列函数,它能够产生一个128位的散列值,通常用于确保信息传输的完整性和一致性。然而,由于MD5算法的安全性在现代已经被广泛质疑,它容易受到碰撞攻击,因此不再推荐用于安全相关的应用。

MD5爆破是指通过尝试所有可能的输入值来找到与给定MD5散列值相匹配的原始消息或密码的过程。这种方法通常用于破解使用MD5加密的密码。由于MD5的输出长度固定为128位,理论上存在无限多的输入可以产生相同的输出,但在实际应用中,由于计算资源的限制,通常只能尝试有限数量的输入。

MD5爆破通常涉及以下几个步骤:

1.  **获取MD5散列值**:首先需要有一个目标MD5散列值,这通常是从数据库或文件中获取的。
    
2.  **构建字典**:为了提高爆破效率,通常会使用预先构建的字典文件,其中包含了大量常见的密码或单词。这些字典文件是根据语言习惯、流行文化、历史数据等构建的。
    
3.  **尝试匹配**:使用专门的工具或脚本,将字典中的每个条目通过MD5算法进行散列,然后与目标散列值进行比较。如果找到匹配的散列值,那么对应的字典条目就是原始消息或密码。
    
4.  **暴力破解**:如果字典攻击不成功,可能会尝试暴力破解,即尝试所有可能的字符组合。这种方法计算量巨大,通常只在密码长度较短或字符集较小时才可行。
    

由于MD5算法的安全性不足,现在许多安全系统已经不再使用MD5作为加密手段。对于需要高安全性的应用,推荐使用更安全的散列函数,如SHA-256或SHA-3。此外,为了防止密码被爆破,建议使用强密码策略,包括使用足够长的密码、包含大小写字母、数字和特殊字符的组合,并定期更换密码。

凯撒密码

凯撒密码(Caesar Cipher)是一种古老的替换加密技术,由罗马共和国的军事统帅尤利乌斯·凯撒(Julius Caesar)所使用,因此得名。这种加密方法的基本原理是通过将明文中的每个字母按照一个固定的数目进行移位来生成密文。

**凯撒密码的工作原理**:

1.  **移位规则**:在凯撒密码中,每个字母都向右移动固定的位置数(称为“移位数”或“密钥”)。例如,如果移位数为3,那么明文中的每个字母都会向右移动3个位置。
    
2.  **字母表循环**:由于字母表是循环的,当字母移动到字母表的末尾时,它会“环绕”回到字母表的开头。例如,字母Z向右移动3个位置后,将变为C。
    
3.  **加密过程**:加密时,将明文中的每个字母按照移位规则进行替换。例如,明文“HELLO”使用移位数3加密后,将变为“KHOOR”。
    
4.  **解密过程**:解密时,将密文中的每个字母按照移位规则的逆向进行替换。例如,密文“KHOOR”使用移位数3解密后,将变为“HELLO”。
    

**凯撒密码的示例**:

*   明文:HELLO
*   移位数:3
*   加密后的密文:KHOOR

**凯撒密码的局限性**:

凯撒密码的安全性非常低,因为它只有25种可能的移位数(从1到25,因为移位数为0时没有变化)。这种加密方法很容易被破解,尤其是通过频率分析,即分析密文中字母出现的频率来猜测移位数。在现代,凯撒密码已经不再被用作安全的加密手段,但它作为加密技术的历史起点,对于理解密码学的基础原理仍然具有重要意义。

ROT

ROT(Rotation)是一种简单的替换密码,它是凯撒密码的一种变体,其中最常见的是ROT13。ROT13是一种对称加密算法,它将字母表中的每个字母向前或向后移动13个位置。由于英文字母表有26个字母,因此ROT13实际上是自己的逆过程,即加密和解密使用相同的步骤。

**ROT13的工作原理**:

1.  **移位规则**:在ROT13中,每个字母都向右移动13个位置。例如,字母A会变为N,字母B会变为O,以此类推。
    
2.  **字母表循环**:与凯撒密码类似,字母表是循环的,所以当字母移动到字母表的末尾时,它会“环绕”回到字母表的开头。例如,字母Z向右移动13个位置后,将变为M。
    
3.  **加密过程**:加密时,将明文中的每个字母按照移位规则进行替换。例如,明文“HELLO”使用ROT13加密后,将变为“URYYB”。
    
4.  **解密过程**:解密时,将密文中的每个字母按照移位规则的逆向进行替换。由于ROT13是自己的逆过程,所以解密步骤与加密步骤相同。例如,密文“URYYB”使用ROT13解密后,将变为“HELLO”。
    

**ROT13的示例**:

*   明文:HELLO
*   加密后的密文:URYYB

**ROT13的应用**:

ROT13最初用于Usenet新闻组,以隐藏可能被认为是剧透或不适当的内容。由于其简单性,ROT13并不提供实际的安全性,但它可以作为一种简单的文本隐藏方法。在现代,ROT13主要用于教育和娱乐目的,展示基本的密码学概念。

**ROT13的局限性**:

ROT13的安全性非常低,因为它只有一种可能的移位数(13),并且加密和解密过程相同。这种加密方法很容易被破解,尤其是通过直接应用ROT13算法或使用频率分析。在实际应用中,ROT13不提供任何有意义的安全保护,但它作为密码学的一个简单示例,有助于理解更复杂的加密技术。

栅栏密码

栅栏密码(Fence cipher),也称为栅格密码或折线密码,是一种古老的古典加密技术,它属于替换密码的一种,但与简单的替换(如凯撒密码)不同,栅栏密码使用了字母的排列方式来加密,而不是简单的字母替换。

**栅栏密码的工作原理**:

1.  **创建栅栏**:首先,将明文按照一定的行数和列数(通常是奇数)排列成一个网格,形成一个“栅栏”或“阶梯”形状。例如,如果使用3x3的网格,那么每行和每列会有3个字符。
    
2.  **加密过程**:从左上角开始,按照栅栏的走向逐行读取字符,然后将这些字符按照字母顺序替换为另一个字母表中的字符。如果遇到行的末尾,就从下一行的开头开始读取,直到读完整个网格。这个过程可能会导致字符在加密后的文本中交错出现。
    
3.  **解密过程**:解密时,遵循同样的规则,但需要知道加密时的栅栏布局,以知道每个字符的原始位置。
    

**栅栏密码的示例**:

假设明文是 "MATHEMATICS",使用3x3的栅栏密码,可能的布局和加密结果如下:

    M   A   T
    H   E   M
    A   T   I
    C   S   (空格)
    

加密后可能得到 "BZPQVJZQUB",解密时需要知道原来的栅栏布局才能还原。

**栅栏密码的局限性**:

*   **复杂性**:对于小的栅栏(如3x3),加密和解密相对容易,因为字符分布相对固定。但随着栅栏尺寸的增加,解密会变得更加困难,因为它需要记忆更多的字符位置。
*   **安全性**:由于栅栏密码依赖于特定的栅栏布局,它对简单的频率分析攻击比较敏感,但现代密码学已经远远超过了它的安全级别。
*   **实用性**:在现代通信中,栅栏密码并不实用,因为它容易被破解,特别是在没有保密栅栏布局的情况下。

栅栏密码主要用于教学和历史研究,展示了密码学的早期发展和基本概念。

HASH算法

密码学哈希函数(Hash Algorithm),也称为散列函数或哈希函数,是一种用于数据完整性检查、密码存储、消息认证码(MAC)生成等重要安全操作的算法。它的核心特性包括:

1.  **单向性(One-wayness)**:哈希函数是单向的,即给定输入(明文)无法从输出(散列值)反向推导出原始输入。这是为了保护密码,例如存储在数据库中的用户密码,即使被泄露,也无法直接解密。
    
2.  **确定性(Determinism)**:对于相同的输入,哈希函数总是产生相同的输出,即输入相同,输出也相同。这是为了保证数据的一致性。
    
3.  **碰撞(Collision Resistance)**:虽然理论上存在两个不同的输入产生相同输出的可能,但在实际应用中,优质的哈希函数应该尽可能地减少这种碰撞的可能性。理想的哈希函数应该有无限大的输出空间,远大于可能的输入空间。
    
4.  **效率(Efficiency)**:哈希函数通常需要快速执行,以便在实时应用中使用,如在线交易验证。
    

常见的哈希算法有:

*   **MD5(Message-Digest Algorithm 5)**:早期的哈希算法,已被发现存在碰撞,不适用于安全性要求高的场景。
*   **SHA-1(Secure Hash Algorithm 1)**:对MD5的改进,但同样存在碰撞风险,现在也不推荐用于安全应用。
*   **SHA-2(Secure Hash Algorithm 2)系列**:包括SHA-224、SHA-256、SHA-384和SHA-512,安全性更高,SHA-384和SHA-512常用于存储密码。
*   **SHA-3(Secure Hash Algorithm 3)**:由NIST推荐的下一代哈希函数,提供更好的安全性和抵抗碰撞的能力。

在密码学中,哈希函数广泛用于密码存储(通过散列和盐值混合避免彩虹表攻击)、消息认证码(如HMAC,结合密钥和哈希),以及数据完整性检查(如文件校验和)。但需要注意的是,哈希函数不应该用于加密,因为它们是不可逆的,不适合提供保密性。

RSA

就用题来记录叭~

[LitCTF 2023]家人们!谁懂啊,RSA签到都不会 (初级)

附件: 

from Crypto.Util.number import *
from secret import flag

m = bytes_to_long(flag)
p = getPrime(512)
q = getPrime(512)
e = 65537
n = p*q
c = pow(m,e,n)
print(f'p = {p}')
print(f'q = {q}')
print(f'c = {c}')
'''
p = 12567387145159119014524309071236701639759988903138784984758783651292440613056150667165602473478042486784826835732833001151645545259394365039352263846276073
q = 12716692565364681652614824033831497167911028027478195947187437474380470205859949692107216740030921664273595734808349540612759651241456765149114895216695451
c = 108691165922055382844520116328228845767222921196922506468663428855093343772017986225285637996980678749662049989519029385165514816621011058462841314243727826941569954125384522233795629521155389745713798246071907492365062512521474965012924607857440577856404307124237116387085337087671914959900909379028727767057
'''

思路:

最简单的RSA,p,q是两个素数,n = p*q,所以n的欧拉值phi = (p-1)*(q-1),给定p,q,c,直接求密钥d = inverse(e,phi),m = pow(c,d,n),最后解出flag

exp:

p = 12567387145159119014524309071236701639759988903138784984758783651292440613056150667165602473478042486784826835732833001151645545259394365039352263846276073
q = 12716692565364681652614824033831497167911028027478195947187437474380470205859949692107216740030921664273595734808349540612759651241456765149114895216695451
c = 108691165922055382844520116328228845767222921196922506468663428855093343772017986225285637996980678749662049989519029385165514816621011058462841314243727826941569954125384522233795629521155389745713798246071907492365062512521474965012924607857440577856404307124237116387085337087671914959900909379028727767057
e = 65537

from Crypto.Util.number import *
import gmpy2

n = p*q

phi = (p-1)*(q-1)

d = inverse(e, phi)

m = pow(c,d,n)


print(long_to_bytes(m))

 [羊城杯 2021]Bigrsa

附件:

from Crypto.Util.number import *
from flag import *

n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061
n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073
e = 65537
m = bytes_to_long(flag)
c = pow(m, e, n1)
c = pow(c, e, n2)

print("c = %d" % c)

# output
# c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264

思路:

有两个模数,是个素数共享问题,去求p,q。求p = gcd(n1,n2),再分别求对应的q1,q2,最后正常RSA就行。

exp:


c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264
n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061
n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073
e = 65537

from Crypto.Util.number import *
from gmpy2 import invert

q = GCD(n1, n2)
p1 = n1 // q
p2 = n2 // q
d1 = invert(e, (q - 1) * (p1 - 1))
d2 = invert(e, (q - 1) * (p2 - 1))

t = pow(c,d2,n2)
m = pow(t,d1,n1)

print(long_to_bytes(m))

[SWPU 2020]happy

附件:

('c=', '0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9eL')
('e=', '0x872a335')
#q + q*p^3 =1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
#qp + q *p^2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594

思路:

c,e是用十六进制给出的,先转化成10进制,c最后的'L'是表示长整型,不在16进制内。直接解方程解出p,q再正常RSA就行。

exp:

# ('c=', '0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9eL')
# ('e=', '0x872a335')
#q + q*p^3 =1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
#qp + q *p^2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594

c = '0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e'
c = int(c,16)
e = '0x872a335'
e = int(e,16)

t1 = 1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
t2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594


from gmpy2 import *
from Crypto.Util.number import *
from sympy import *

# p,q = symbols('p,q')

# a = solve([t1 - q - p*p*p*q, t2 - p*p*q-q*p], [p,q])
q = 827089796345539312201480770649
p = 1158310153629932205401500375817


#q = 1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586

phi = (p-1)*(q-1)

n = p*q


d = gmpy2.invert(e,phi) 

m = pow(c,d,n)

print(long_to_bytes(m))

[SWPUCTF 2021 新生赛]crypto2

附件:

from gmpy2 import *
from Crypto.Util.number import *



flag  = '***************'

p = getPrime(512)
q = getPrime(512)
m1 = bytes_to_long(bytes(flag.encode()))


n = p*q
e1 = getPrime(32)
e2 = getPrime(32)
print()

flag1 = pow(m1,e1,n)
flag2 = pow(m1,e2,n)
print('flag1= '+str(flag1))
print('flag2= '+str(flag2))
print('e1= ' +str(e1))
print('e2= '+str(e2))
print('n= '+str(n))


#flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
#flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
#e1= 3247473589
#e2= 3698409173
#n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

思路:

共模攻击,有两个e只有一个模数,x*e1 + y*e2  = gcd(e1,e2),则m = pow(flag1,x,n) * pow(flag2,y,n) % n

exp:

flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
e1= 3247473589
e2= 3698409173
n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

from gmpy2 import *
from Crypto.Util.number import *

s,x,y = gmpy2.gcdext(e1,e2)

m = pow(flag1,x,n) * pow(flag2,y,n) % n

print(long_to_bytes(m))

[鹤城杯 2021]Crazy_Rsa_Tech

附件:

  代码:

from Crypto.Util.number import *
from Crypto.Util.Padding import *

FLAG = bytes_to_long(pad(b"flag{??????}",64))
def init_key():
    p, q = getPrime(512), getPrime(512)
    n = p*q
    e = 9
    while(GCD((p-1)*(q-1),e)!=1):
        p, q = getPrime(512), getPrime(512)
        n = p*q
    d = inverse(e,(p-1)*(q-1))
    return n,e,d

n_list=list()
c_list=list()
for i in range(9):
    N,e,d=init_key()
    n_list.append(N)
    c=pow(FLAG,e,N)
    c_list.append(pow(FLAG,e,N))
    assert(pow(c,d,N)==FLAG)
print("n_list:",n_list)
print("c_list:",c_list)

  output:

         n_list: [71189786319102608575263218254922479901008514616376166401353025325668690465852130559783959409002115897148828732231478529655075366072137059589917001875303598680931962384468363842379833044123189276199264340224973914079447846845897807085694711541719515881377391200011269924562049643835131619086349617062034608799, 92503831027754984321994282254005318198418454777812045042619263533423066848097985191386666241913483806726751133691867010696758828674382946375162423033994046273252417389169779506788545647848951018539441971140081528915876529645525880324658212147388232683347292192795975558548712504744297104487514691170935149949, 100993952830138414466948640139083231443558390127247779484027818354177479632421980458019929149817002579508423291678953554090956334137167905685261724759487245658147039684536216616744746196651390112540237050493468689520465897258378216693418610879245129435268327315158194612110422630337395790254881602124839071919, 59138293747457431012165762343997972673625934330232909935732464725128776212729547237438509546925172847581735769773563840639187946741161318153031173864953372796950422229629824699580131369991913883136821374596762214064774480548532035315344368010507644630655604478651898097886873485265848973185431559958627423847, 66827868958054485359731420968595906328820823695638132426084478524423658597714990545142120448668257273436546456116147999073797943388584861050133103137697812149742551913704341990467090049650721713913812069904136198912314243175309387952328961054617877059134151915723594900209641163321839502908705301293546584147, 120940513339890268554625391482989102665030083707530690312336379356969219966820079510946652021721814016286307318930536030308296265425674637215009052078834615196224917417698019787514831973471113022781129000531459800329018133248426080717653298100515701379374786486337920294380753805825328119757649844054966712377, 72186594495190221129349814154999705524005203343018940547856004977368023856950836974465616291478257156860734574686154136925776069045232149725101769594505766718123155028300703627531567850035682448632166309129911061492630709698934310123778699316856399909549674138453085885820110724923723830686564968967391721281, 69105037583161467265649176715175579387938714721653281201847973223975467813529036844308693237404592381480367515044829190066606146105800243199497182114398931410844901178842049915914390117503986044951461783780327749665912369177733246873697481544777183820939967036346862056795919812693669387731294595126647751951, 76194219445824867986050004226602973283400885106636660263597964027139613163638212828932901192009131346530898961165310615466747046710743013409318156266326090650584190382130795884514074647833949281109675170830565650006906028402714868781834693473191228256626654011772428115359653448111208831188721505467497494581]
c_list: [62580922178008480377006528793506649089253164524883696044759651305970802215270721223149734532870729533611357047595181907404222690394917605617029675103788705320032707977225447998111744887898039756375876685711148857676502670812333076878964148863713993853526715855758799502735753454247721711366497722251078739585, 46186240819076690248235492196228128599822002268014359444368898414937734806009161030424589993541799877081745454934484263188270879142125136786221625234555265815513136730416539407710862948861531339065039071959576035606192732936477944770308784472646015244527805057990939765708793705044236665364664490419874206900, 85756449024868529058704599481168414715291172247059370174556127800630896693021701121075838517372920466708826412897794900729896389468152213884232173410022054605870785910461728567377769960823103334874807744107855490558726013068890632637193410610478514663078901021307258078678427928255699031215654693270240640198, 14388767329946097216670270960679686032536707277732968784379505904021622612991917314721678940833050736745004078559116326396233622519356703639737886289595860359630019239654690312132039876082685046329079266785042428947147658321799501605837784127004536996628492065409017175037161261039765340032473048737319069656, 1143736792108232890306863524988028098730927600066491485326214420279375304665896453544100447027809433141790331191324806205845009336228331138326163746853197990596700523328423791764843694671580875538251166864957646807184041817863314204516355683663859246677105132100377322669627893863885482167305919925159944839, 2978800921927631161807562509445310353414810029862911925227583943849942080514132963605492727604495513988707849133045851539412276254555228149742924149242124724864770049898278052042163392380895275970574317984638058768854065506927848951716677514095183559625442889028813635385408810698294574175092159389388091981, 16200944263352278316040095503540249310705602580329203494665614035841657418101517016718103326928336623132935178377208651067093136976383774189554806135146237406248538919915426183225265103769259990252162411307338473817114996409705345401251435268136647166395894099897737607312110866874944619080871831772376466376, 31551601425575677138046998360378916515711528548963089502535903329268089950335615563205720969393649713416910860593823506545030969355111753902391336139384464585775439245735448030993755229554555004154084649002801255396359097917380427525820249562148313977941413268787799534165652742114031759562268691233834820996, 25288164985739570635307839193110091356864302148147148153228604718807817833935053919412276187989509493755136905193728864674684139319708358686431424793278248263545370628718355096523088238513079652226028236137381367215156975121794485995030822902933639803569133458328681148758392333073624280222354763268512333515]

思路:

低指数加密广播攻击,e很小且有多组n,c,掌握中国剩余定理即可,可以直接用crt,然后开e次方即可。

exp:

from Crypto.Util.number import *
from Crypto.Util.Padding import *
import gmpy2
import libnum
from sympy.ntheory.modular import crt

n_list = [71189786319102608575263218254922479901008514616376166401353025325668690465852130559783959409002115897148828732231478529655075366072137059589917001875303598680931962384468363842379833044123189276199264340224973914079447846845897807085694711541719515881377391200011269924562049643835131619086349617062034608799, 92503831027754984321994282254005318198418454777812045042619263533423066848097985191386666241913483806726751133691867010696758828674382946375162423033994046273252417389169779506788545647848951018539441971140081528915876529645525880324658212147388232683347292192795975558548712504744297104487514691170935149949, 100993952830138414466948640139083231443558390127247779484027818354177479632421980458019929149817002579508423291678953554090956334137167905685261724759487245658147039684536216616744746196651390112540237050493468689520465897258378216693418610879245129435268327315158194612110422630337395790254881602124839071919, 59138293747457431012165762343997972673625934330232909935732464725128776212729547237438509546925172847581735769773563840639187946741161318153031173864953372796950422229629824699580131369991913883136821374596762214064774480548532035315344368010507644630655604478651898097886873485265848973185431559958627423847, 66827868958054485359731420968595906328820823695638132426084478524423658597714990545142120448668257273436546456116147999073797943388584861050133103137697812149742551913704341990467090049650721713913812069904136198912314243175309387952328961054617877059134151915723594900209641163321839502908705301293546584147, 120940513339890268554625391482989102665030083707530690312336379356969219966820079510946652021721814016286307318930536030308296265425674637215009052078834615196224917417698019787514831973471113022781129000531459800329018133248426080717653298100515701379374786486337920294380753805825328119757649844054966712377, 72186594495190221129349814154999705524005203343018940547856004977368023856950836974465616291478257156860734574686154136925776069045232149725101769594505766718123155028300703627531567850035682448632166309129911061492630709698934310123778699316856399909549674138453085885820110724923723830686564968967391721281, 69105037583161467265649176715175579387938714721653281201847973223975467813529036844308693237404592381480367515044829190066606146105800243199497182114398931410844901178842049915914390117503986044951461783780327749665912369177733246873697481544777183820939967036346862056795919812693669387731294595126647751951, 76194219445824867986050004226602973283400885106636660263597964027139613163638212828932901192009131346530898961165310615466747046710743013409318156266326090650584190382130795884514074647833949281109675170830565650006906028402714868781834693473191228256626654011772428115359653448111208831188721505467497494581]
c_list = [62580922178008480377006528793506649089253164524883696044759651305970802215270721223149734532870729533611357047595181907404222690394917605617029675103788705320032707977225447998111744887898039756375876685711148857676502670812333076878964148863713993853526715855758799502735753454247721711366497722251078739585, 46186240819076690248235492196228128599822002268014359444368898414937734806009161030424589993541799877081745454934484263188270879142125136786221625234555265815513136730416539407710862948861531339065039071959576035606192732936477944770308784472646015244527805057990939765708793705044236665364664490419874206900, 85756449024868529058704599481168414715291172247059370174556127800630896693021701121075838517372920466708826412897794900729896389468152213884232173410022054605870785910461728567377769960823103334874807744107855490558726013068890632637193410610478514663078901021307258078678427928255699031215654693270240640198, 14388767329946097216670270960679686032536707277732968784379505904021622612991917314721678940833050736745004078559116326396233622519356703639737886289595860359630019239654690312132039876082685046329079266785042428947147658321799501605837784127004536996628492065409017175037161261039765340032473048737319069656, 1143736792108232890306863524988028098730927600066491485326214420279375304665896453544100447027809433141790331191324806205845009336228331138326163746853197990596700523328423791764843694671580875538251166864957646807184041817863314204516355683663859246677105132100377322669627893863885482167305919925159944839, 2978800921927631161807562509445310353414810029862911925227583943849942080514132963605492727604495513988707849133045851539412276254555228149742924149242124724864770049898278052042163392380895275970574317984638058768854065506927848951716677514095183559625442889028813635385408810698294574175092159389388091981, 16200944263352278316040095503540249310705602580329203494665614035841657418101517016718103326928336623132935178377208651067093136976383774189554806135146237406248538919915426183225265103769259990252162411307338473817114996409705345401251435268136647166395894099897737607312110866874944619080871831772376466376, 31551601425575677138046998360378916515711528548963089502535903329268089950335615563205720969393649713416910860593823506545030969355111753902391336139384464585775439245735448030993755229554555004154084649002801255396359097917380427525820249562148313977941413268787799534165652742114031759562268691233834820996, 25288164985739570635307839193110091356864302148147148153228604718807817833935053919412276187989509493755136905193728864674684139319708358686431424793278248263545370628718355096523088238513079652226028236137381367215156975121794485995030822902933639803569133458328681148758392333073624280222354763268512333515]
e = 9

x = crt(n_list,c_list)[0]

print(x)

x = gmpy2.iroot(x,e)[0]

print(long_to_bytes(x))

 结语

多刷题多总结~(共联攻击什么的后面再写写)

  • 44
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值