RSA
题目
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flag提交
解题思路
在密码学相关计算中,可利用python的gmpy2库,非常方便
附上代码:
import gmpy2
p =9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
d = gmpy2.invert(e, (q-1)*(p-1))
print(d)
flag
flag{125631357777427553}
知识点
RSA加密
参数pqde,公开n,e,秘密保存d
- 1.n=pq,fai(n)=(p-1)(q-1),fai()指欧拉函数
- 2.(de)mod(fai(n)) = 1,即de = k(fai(n))+1
加密
c = m^e mod n
解密
m = c^d mod n
gmpy2库的常用函数
- gmpy2.mpz(n)#初始化一个大整数
- gmpy2.mpfr(x)# 初始化一个高精度浮点数x
- d = gmpy2.invert(e,n) # 求逆元,de = 1 mod n
- C = gmpy2.powmod(M,e,n)# 幂取模,结果是 C = (M^e) mod n
- gmpy2.is_prime(n) #素性检测
- gmpy2.gcd(a,b) #return r 其中,r为a和b的最大公约数
- gmpy2.gcdext(a,b) #扩展欧几里得算法,return (r,x,y) 其中,r为a和b的最大公约数,满足ax + by = 1
- gmpy2.iroot(x,n) #x开n次根
rsarsa
题目
Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
Use RSA to find the secret message
解题思路
这道题是最基础的RSA题,p,q,e,c全部给出,直接计算出私钥d,再进行解密即可
其中,d为e(mod φ(n))的逆元,即d * e = 1 + k * φ(n)
gmpy2库中的gmpy2.invert()可以计算逆元
附上代码:
import gmpy2
p =96484230290105156765905517400104265349457376392357398006439893520398525072