RSA学习笔记

最近
的CTF比赛里面总是会遇到RSA加密解密的问题

在这里对做的RSA题目进行一个笔记的记录

首先介绍一点RSA加密解密的基本套路:

1,选择两个大的参数,计算出模数 N = p * q

2,计算欧拉函数 φ = (p-1) * (q-1),然后选择一个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题目在这里

你可能感兴趣的:(参赛,RSA解密)