題目來源: alexctf-2017
題目描述:Fady同學以為你是菜鳥,不怕你看到他發的東西。他以明文形式將下面這些東西發給了他的朋友 p=0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c66393a061324aa2e6a8d8fc2a910cbee1ed9 q=0xfa0f9463ea0a93b929c099320d31c277e0b0dbc65b189ed76124f5a1218f5d91fd0102a4c8de11f28be5e4d0ae91ab319f4537e97ed74bc663e972a4a9119307 e=0x6d1fdab4ce3217b3fc32c9ed480a31d067fd57d93a9ab52b472dc393ab7852fbcb11abbebfd6aaae8032db1316dc22d3f7c3d631e24df13ef23d3b381a1c3e04abcc745d402ee3a031ac2718fae63b240837b4f657f29ca4702da9af22a3a019d68904a969ddb01bcf941df70af042f4fae5cbeb9c2151b324f387e525094c41 c=0x7fe1a4f743675d1987d25d38111fae0f78bbea6852cba5beda47db76d119a3efe24cb04b9449f53becd43b0b46e269826a983f832abb53b7a7e24a43ad15378344ed5c20f51e268186d24c76050c1e73647523bd5f91d9b6ad3e86bbf9126588b1dee21e6997372e36c3e74284734748891829665086e0dc523ed23c386bb520 他嚴重低估了我們的解密能力。
看到題目中的p,q,e,就想到了RSA加加解密
RSA的密鑰對生成算法
選取兩個大素數p和q(兩個數長度接近,一般在256比特長),而且p和q保密
計算n=p*q, 將n公開
計算ψ(n)=(p-1)(q-1),對ψ(n)保密
隨機選取一個正整數e,1<e< ψ(n)滿足gcd(e, ψ(n))=1將e公開
根據ed=1modψ(n),求出d,並對d保密
RSA的加解密過程
消息:m < n
加密算法:C=E(M)=M^e(mod n)
解密算法:M=D(C)=C^d(mod n)
RSA密碼的公開加密密鑰Ke=<n,e>而保密的解密密鑰Kd=<d, n>
大致思路:
先把p,q,e轉成十進制,再根據公式求出n,d,m
n=p*q
φ(N) = (p-1)(q-1)
e * d % φ(N) = 1(d是私鑰,e是公鑰)
m=c^ d mod n (m是明文)
借鑒大佬的代碼:
import libnum from Crypto.Util.number import long_to_bytes q = int( "0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c66393a061324aa2e6a8d8fc2a910cbee1ed9", 16) p = int( "0xfa0f9463ea0a93b929c099320d31c277e0b0dbc65b189ed76124f5a1218f5d91fd0102a4c8de11f28be5e4d0ae91ab319f4537e97ed74bc663e972a4a9119307", 16) e = int( "0x6d1fdab4ce3217b3fc32c9ed480a31d067fd57d93a9ab52b472dc393ab7852fbcb11abbebfd6aaae8032db1316dc22d3f7c3d631e24df13ef23d3b381a1c3e04abcc745d402ee3a031ac2718fae63b240837b4f657f29ca4702da9af22a3a019d68904a969ddb01bcf941df70af042f4fae5cbeb9c2151b324f387e525094c41", 16) c = 0x7fe1a4f743675d1987d25d38111fae0f78bbea6852cba5beda47db76d119a3efe24cb04b9449f53becd43b0b46e269826a983f832abb53b7a7e24a43ad15378344ed5c20f51e268186d24c76050c1e73647523bd5f91d9b6ad3e86bbf9126588b1dee21e6997372e36c3e74284734748891829665086e0dc523ed23c386bb520 n = q * p d = libnum.invmod(e, (p - 1) * (q - 1)) #invmod(a, n) - 求a對於n的模逆 m = pow(c, d, n) # pow(x, y[, z])--函數是計算 x 的 y 次方,如果 z 在存在,則再對結果進行取模,其結果等效於 pow(x,y) %z # print(m) #明文的十進制格式 string = long_to_bytes(m) # m明文 print(string.decode())
flag為:ALEXCTF{RS4_I5_E55ENT1AL_T0_D0_BY_H4ND}
附No module named 'Crypto' 解決方案:
1.命令:python3 -m pip install pycryptodome
2.windows下python3.6安裝后,找到\Python36\Lib\site-packages\路徑,下面有一個文件夾叫做crypto,將小寫c改成大寫C就ok了
參考:https://blog.csdn.net/qq_46927150/article/details/105907955