zoukankan      html  css  js  c++  java
  • 攻防世界-crypto-cr3-what-is-this-encryption(RSA解密)

    题目来源: 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安装后,找到Python36Libsite-packages路径,下面有一个文件夹叫做crypto,将小写c改成大写C就ok了

    参考:https://blog.csdn.net/qq_46927150/article/details/105907955

  • 相关阅读:
    sublime的ctags安装
    微信授权
    [读码时间] 图片列表:鼠标移入/移出改变图片透明度
    [读码时间] 提示框效果
    [读码时间] 鼠标移入移出改变样式
    [读码时间] 数组求和
    [读码时间] 简易选项卡
    [读码时间] 简易JS年历
    [读码时间] 记住密码提示框
    [读码时间] 函数传参,改变Div任意属性的值
  • 原文地址:https://www.cnblogs.com/zhengna/p/13501563.html
Copyright © 2011-2022 走看看