最近
的CTF比赛里面总是会遇到RSA加密解密的问题
在这里对做的RSA题目进行一个笔记的记录
首先介绍一点RSA加密解密的基本套路:
1,选择两个大的参数,计算出模数 N = p * q
2,计算欧拉函数 φ = (p-1) * (q-1),然后选择一个e(1<e<φ),并且e和φ互质(互质:公约数只有1的两个整数)
f=(p-1)*(q-1)
3,取e的模反数d,计算方法为:e * d ≡ 1 (mod φ) (模反元素:如果两个正整数e和n互质,那么一定可以找到整数d,使得 e * d - 1 被n整除,或者说e * d被n除的余数是1。这时,d就叫做e的“模反元素”。欧拉定理可以用来证明模反元素必然存在。两个整数a,b,它们除以整数M所得的余数相等:a ≡ b(mod m),比如说5除3余数为2,11除3余数也为2,于是可写成11 ≡ 5(mod 3)。)
d=gmpy2.invert(e,模反元素)
对明文m进行加密:c = pow(m, e, N),可以得到密文c。
对密文c进行解密:m = pow(c, d, N),可以得到明文m。
使用gmpy2这个python的扩展库,是对GNU高精度算术运算库的封装,它的前身是gmpy,经过作者的调整和封装,使得gmpy2的使用大大的简化
大整数mpz
初始化一个大整数
import gmpy2
n=gmpy2.mpz(1257787) #初始化
gmpy2.is_prime(n) #概率性素性测试
d=gmpy2.invert(e,phi_n) 求模反元素
有了这些基础知识 我们现在就去做一些题目来练手吧
http://ctf5.shiyanbar.com/crypto/rsarsa/rsa.txt
实验吧的RSA简单题目
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483 q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407 e = 65537 c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034 Use RSA to find the secret message
上gmpy2
python代码:
import gmpy2
p=gmpy2.mpz(9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483)
q=gmpy2.mpz(11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407)
e=gmpy2.mpz(65537)
f=(p-1)*(q-1)
d=gmpy2.invert(e,f)
print "key:"
print d
c=gmpy2.mpz(83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034)
print "text is"
print pow(c,d,p*q)
这个题目没有提示最后是·flag就是输出的那一串数字
后面再添加其他的RSA题目在这里