BUUCTF 刷题笔记——Crypto 1

摩丝

  • 本题提供一个文本文件,内含如下文本,很明显这是摩斯电码。

    1
    .. .-.. --- ...- . -.-- --- ..-
  • 以下为基本字母数字与其对应的摩斯电码表,对照表逐个解码即可。

    字符电码符号字符电码符号字符电码符号字符电码符号
    A.━B━ ...C━ .━ .D━ ..
    EF..━ .G━ ━ .H....
    I..J.━ ━ ━K━ .━L.━ ..
    M━ ━N━ .O━ ━ ━P.━ ━ .
    Q━ ━ .━R.━ .S...T
    U..━V...━W.━ ━X━ ..━
    Y━ .━ ━Z━ ━ ..
    0━ ━ ━ ━ ━1.━ ━ ━ ━2..━ ━ ━3...━ ━
    4....━5.....6━ ....7━ ━ ...
    8━ ━ ━ ..9━ ━ ━ ━ .

    解码结果为 ILOVEYOU

password

  • 本题提供的文本内容如下,需要我们根据已有信息猜密码。

    1
    2
    3
    4
    姓名:张三 
    生日:19900315

    key格式为key{xxxxxxxxxx}
  • 密码共十位,已有信息可作为密码的有 zhangsan 以及生日数字序列 19900315,因此对该信息的全部或者部分提取并排列组合便可得出密码,当然本题较为简单,密码为 zs19900315

变异凯撒

  • 本题提供的文本内容如下,并提示这是变异凯撒。

    1
    2
    加密密文:afZ_r9VYfScOeO_UL^RWUc
    格式:flag{ }
  • 凯撒密码只是进行简单的操作操作,但是上述密文出现了数字以及 _^ 等特殊字符,因此很可能是依照 ASCII 码表的移位操作。由于格式固定,即前五位为 flag{ 五个字符,可借此找出规律。

    明文字符(码值)密文字符(码值)差值
    f(102)a(97)5
    l(108)f(102)6
    a(97)Z(90)7
    g(103)_(95)8
    {(123)r(114)9

    由上述表格中的数据可确认加密方式为按 ASCII 码表进行位移且位移大小逐个递增。

  • 那写个脚本反推一下就行了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    str = "afZ_r9VYfScOeO_UL^RWUc"
    n = 5
    flag = ""

    for i in str:
    flag += chr(ord(i) + n)
    n += 1

    print(flag)

    得出 flagflag{Caesar_variation}

Quoted-printable

  • 本题提供的文本内容如下,提示为 Quoted-printable 编码。

    1
    =E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6
  • Quoted-printable 编码每三位表示一字节的数据,等号后即为两位十六进制数,可直接对应于该字节的数据。由于大部分用于非 ASCII 码表中的可打印字符,因此手算不现实,直接工具解码即可。

    解码出的结果为 那你也很棒哦

Rabbit

  • 本题提供的文本内容如下,提示为 Rabbit 加密。

    1
    U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI
  • 有意思的加密方法,了解密文特征即前缀 U2FsdGVkX1 即可。剩下的直接丢进 解密网站 就行。

    解密的结果为 Cute_Rabbit

篱笆墙的影子

  • 本题提供的文本如下,提示篱笆墙的影子,根据密文样式及 flag 的默认前缀 flag{ 合理推测标题暗示栅栏密码。

    1
    felhaagv{ewtehtehfilnakgw}
  • 所谓栅栏密码,就是把要加密的明文分成 N 个一组,然后循环把每组的首个字符取出来,形成一段无规律的话。观察可知 N2 即可提取出 flag,也就是取一个字符后隔一个字符再取,然后循环直至取完所有字符。因此 falgflag{wethinkwehavetheflag}

RSA

  • 本题提供的文本如下,要求解密 RSA

    1
    2
    在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
    求解出d作为flga提交
  • 有了ppqq 值就可以求φ(n)=(p1)(q1)φ(n)=(p-1)(q-1),值为21357330822162684002135733082216268400。由于dd 满足(de)modφ(n)=1(d*e)modφ(n)=1,其他条件都已知,所以pp 值就可以很容易求了吧?写个脚本来算。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import gmpy2

    p = 473398607161
    q = 4511491
    e = 17

    phi_n = (p - 1) * (q - 1)
    d = gmpy2.invert(e, phi_n)

    print(d)

    解出dd 值为125631357777427553125631357777427553

丢失的MD5

  • 本题提供一段 Python 代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import hashlib   
    for i in range(32,127):
    for j in range(32,127):
    for k in range(32,127):
    m=hashlib.md5()
    m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM')
    des=m.hexdigest()
    if 'e9032' in des and 'da' in des and '911513' in des:
    print des
  • 由于是 Python2 代码,换成 Python3 环境运行需要为 print() 函数加上括号。尝试执行程序,发现报错了。

    提示在计算哈希值之前需要对数据进行编码,因此将待加密的明文字符串加上编码操作即可,修改代码如下,建议指定编码为 utf-8,以免出现默认编码的问题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import hashlib
    for i in range(32,127):
    for j in range(32,127):
    for k in range(32,127):
    m=hashlib.md5()
    #m.update(('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM').encode())
    m.update(('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM').encode("utf8"))
    des=m.hexdigest()
    if 'e9032' in des and 'da' in des and '911513' in des:
    print(des)

    计算结果为 e9032994dabac08080091151380478a2,实测该值即为 flag,所以本题考的是编程。

Alice与Bob

  • 本题考查对9855479976798554799767​ 的质数分解,分解出后组合进行 md5 加密即可。质数分解使用 yafu 工具完成即可,分解结果为966233101999966233*101999

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    命令行>yafu-x64.exe factor(98554799767)


    fac: factoring 98554799767
    fac: using pretesting plan: normal
    fac: no tune info: using qs/gnfs crossover of 95 digits
    div: primes less than 10000
    fmt: 1000000 iterations
    Total factoring time = 0.0089 seconds


    ***factors found***

    P6 = 966233
    P6 = 101999

    ans = 1
  • 101999966233101999966233 进行 md5 加密即可,加密结果为 d450209323a847c8d01c6be47c81811a

大帝的密码武器

  • 本题提供一个 zip 文件,由于没有后缀名,因此无法打开,按提示修改后缀为 zip 即可。包含两个文本文件,其内容如下。

    1
    2
    3
    4
    5
    6
    7
    题目:
    公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。
    以下密文被解开后可以获得一个有意义的单词:FRPHEVGL
    你可以用这个相同的加密向量加密附件中的密文,作为答案进行提交。

    密文:
    ComeChina
  • 即使用凯撒密码加密,但是偏移值需要自行求出,依据为 FRPHEVGL 解密后为有意义的单词。部分不同偏移值对应的明文如下表,但偏移为 13 时解密后为单词 security,因此偏移为 13

    偏移值明文
    2DPNFCTEJ
    3COMEBSDI
    4BNLDARCH
    5AMKCZQBG
    6ZLJBYPAF
    7YKIAXOZE
    8XJHZWNYD
    9WIGYVMXC
    10VHFXULWB
    11UGEWTKVA
    12TFDVSJUZ
    13SECURITY
  • 使用测算出来的偏移量 13 对题给密文进行解密操作后可得 PbzrPuvan,即本题答案。

rsarsa

  • 本题提供文本如下,给出pqecp、q、e、c 的值让我们求明文。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
  • 由已给值直接写个脚本进行计算即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import gmpy2

    p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
    q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
    e = 65537
    c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

    phi_n = (p - 1) * (q - 1)
    n = p * q
    d = gmpy2.invert(e, phi_n)
    m = gmpy2.powmod(c, d, n)

    print(m)

    计算结果为55774466335544665777688799885577446633554466577768879988

Windows系统密码

  • 题目给了一个 pass.hash 文件,其内容如下,文件名暗示均为哈希值。

    1
    2
    3
    4
    Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
    Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::
  • 由于这些值均使用冒号分割为了八段 32 位的序列,大概率为 md5 算法,因此逐个进行解密,第四段成功解出 flaggood-luck

信息化时代的步伐

  • 本题提供文本内容如下,提示为清后数十年一位伟人说的话,且为一串中文。

    1
    606046152623600817831216121621196386
  • 纯数字序列,合理猜测为中文电码,利用在线工具直接加密结果为计算机要从娃娃抓起。邓小平说的。

凯撒?替换?呵呵!

  • 题目提供一串类似 flag 形式的字符串,标题提示应该又是凯撒?

    1
    MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}
  • 测试了所有偏移值后仍无对应 flag 的值出现,因此应该为进阶款的凯撒,使用 在线工具 进行爆破。参考条件为 mthj 解密后为 flag,结果如下,其中仅第一条为可读明文。

    因此解密明文如下:

    1
    flag{substitutioncipherdecryptionisalwayseasyjustlikeapieceofcake}

萌萌哒的八戒

  • 本题提供一张图片如下,包含一串奇怪的密文,由猪元素推测为猪圈密码。

  • 猪圈密码就很有意思了,原理如下图所示,不同符号对应不同字符,参考字符表进行解密即可。

    解密后的明文为 whenthepigwanttoeat

传统知识+古典密码

  • 本题含有两个文本文件,内容如下。

    1
    2
    3
    4
    5
    小明某一天收到一封密信,信中写了几个不同的年份
    辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。
    信的背面还写有“+甲子”,请解出这段密文。

    key值:CTF{XXX}
  • 首先解决传统知识的问题,在六十甲子中辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳分别对应序号为 2830230817101630,加一甲子就是加 60,则数字序列又变成了 8890836877707690。对应于 ASCII 码表中也就是字符串 XZSDMFLZ

  • 至于古典密码主要就是凯撒与栅栏了,由于对此没有任何提示,因此只能挨个试。这也太过分了。最终经过栅栏密码的 4 栏加密以及凯撒密码的 5 偏移得到的稍微顺眼的字符串 shuangyu 即为答案。

总结

  尝试接触这么些个密码学的题目,总体来说并没有接触到特别复杂的考题,但是却了解到了相当多的加密算法。又多又杂的算法,虽然大多都有工具来帮助完成,但是光是识别算法类型就够呛了。很开心自己并不需要去研究去开发加密算法,仅仅只需要用好别人的工具就能完成大部分工作。

  BUU 上的练习题到这各个方向我就都路过了一遍了,虽然对个人技术并无多少提升,但总归是对整体有了更深入的认识。各方向的试水刷题就到此为止了,不过,这也才刚刚开始,接下来就是日常刷题学习了。