攻防世界-baigeiRSA

1.下载附件,得到压缩包,解压得到两个文件。

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

size = 128
e = 65537
p = number.getPrime(size)
q = number.getPrime(size)
n = p*q

m = libnum.s2n(flag)
c = pow(m, e, n)

print('n = %d' % n)
print('c = %d' % c)

 

n = 88503001447845031603457048661635807319447136634748350130947825183012205093541
c = 40876621398366534035989065383910105526025410999058860023908252093679681817257

 2.分析过程。

根据题目得到是RSA算法。

RSA是一种常用的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。它的安全性建立在大质数分解的困难性上,可以用来实现数据的加密和数字签名。RSA算法的基本原理是将明文分成若干整数,然后用一个大质数的模来加密这些整数。具体来说,假设要加密的明文为M,那么RSA算法会用两个大质数p和q来计算出n=pq,并计算出φ(n)=(p-1)(q-1),然后选择一个大于1小于φ(n)的整数e来作为公钥,并计算出一个整数d,使得ed=1 mod φ(n),即d为e的模φ(n)的逆元,最后用公钥(n, e)来加密M。要解密,则需要用私钥(n, d)来对加密后的结果进行解密。

具体来说,加密过程如下所示:

  1. 选择两个大质数p和q,计算出n=pq,并计算出φ(n)=(p-1)(q-1)。

  2. 选择一个大于1小于φ(n)的整数e,计算出d,使得ed=1 mod φ(n)。

  3. 根据明文M,计算出密文C=Me mod n。
  4. 解密过程则可以使用私钥(n, d)来计算出原文M,具体来说:

  5. 输入密文C,以及私钥(n, d)。

  6. 计算出原文M=Cd mod n。

  7. 请注意,由于RSA算法依赖于大质数的分解难度,所以它的安全性并不是十分稳定。目前,对于小规模的RSA密钥,已经有多种针对性的分解方法可以破解RSA密钥,但是对于大规模的RSA密钥,还没有有效的分解方法。所以,如果要使用RSA算法,需要选择更大的密钥来保证安全性。另外,由于RSA算法的计算复杂度较高,它不太适合用于加密大量数据。通常情况下,RSA算法更多的用于数字签名的场景。

通过白给的文件中的出,以知的为n,c,e。

n=p*q,使用yafu工具。

yafu用于自动整数因式分解,在RSA中,当p、q的取值差异过大或过于相近的时候,使用yafu可以快速的把n值分解出p、q值,原理是使用Fermat方法与Pollard rho方法等。

 攻防世界-baigeiRSA_第1张图片

得出p和q是分别是其中的一个:

P39 = 274539690398523616505159415195049044439
P39 = 322368694010594584041053487661458382819

 3.代码介绍

libnum库 是一个关于各种数学运算的函数库。

libnum.s2n:数字转化为字符串。

number.getPrime:产生二进制数。

pow() :pow(x, y[, z])函数是计算 x 的 y 次方,如果 z 在存在,则再对结果进行取模,其结果等效于 pow(x,y) %z。

 4.解题

p=274539690398523616505159415195049044439
q=322368694010594584041053487661458382819

oula=(p-1)*(q-1)
print(oula)

 得出结果为:

 欧拉fein=88503001447845031603457048661635807318850228250339231930401612280155697666284

然后,计算d的值:

from Crypto.Util.number import *
print(inverse(65537,88503001447845031603457048661635807318850228250339231930401612280155697666284))

 逆元结果:

7662328611548784798175310040223409230315031128864989272824492242208270573241

 验证是否为逆元,结果为1,则是,否则反之:

 所以最终为:攻防世界-baigeiRSA_第2张图片

 最终的flag值是:

HSCTF{@Zh3n_Ba1_G3i!@}

你可能感兴趣的:(CTF,安全)