• 攻防世界题目练习——Crypto密码新手+引导模式(二)(持续更新)


    上一篇:攻防世界题目练习——Crypto密码新手+引导模式(一)(持续更新)
    2023.10.26更————————————-—————————————————
    这段时间在做Web,暂时不更密码学

    1. 转轮机加密

    首先了解一下轮转机加密吧。
    传统密码学(三)——转轮密码机

    题目内容如下:

    1:  < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
    2:  < KPBELNACZDTRXMJQOYHGVSFUWI <
    3:  < BDMAIZVRNSJUWFHTEQGYXPLOCK <
    4:  < RPLNDVHGFCUKTEBSXQYIZMJWAO <
    5:  < IHFRLABEUOTSGJVDKCPMNZQWXY <
    6:  < AMKGHIWPNYCJBFZDRUSLOQXVET <
    7:  < GWTHSPYBXIZULVKMRAFDCEONJQ <
    8:  < NOZUTWDCVRJLXKISEFAPMYGHBQ <
    9:  < XPLTDSRFHENYVUBMCQWAOIKZGJ <
    10: < UDNAJFBOWTGVRSCZQKELMXYIHP <
    11< MNBVCXZQWERTPOIUYALSKDJFHG <
    12< LVNCMXZPQOWEIURYTASBKJDFHG <
    13< JZQAWSXCDERFVBGTYHNUMKILOP <
    #可以看出,上面13行应该就是13个轮子了,每行有26个字母
    密钥为:2,3,7,5,13,12,9,1,8,10,4,11,6
    #上面密钥应该就是13个轮子的排列顺序
    密文为:NFQKSEVOQOFNP
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    我们把它重新按照密钥顺序排列一下:

    2:  < KPBELNACZDTRXMJQOYHGVSFUWI <
    3:  < BDMAIZVRNSJUWFHTEQGYXPLOCK <
    7:  < GWTHSPYBXIZULVKMRAFDCEONJQ <
    5:  < IHFRLABEUOTSGJVDKCPMNZQWXY <
    13< JZQAWSXCDERFVBGTYHNUMKILOP <
    12< LVNCMXZPQOWEIURYTASBKJDFHG <
    9:  < XPLTDSRFHENYVUBMCQWAOIKZGJ <
    1:  < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
    8:  < NOZUTWDCVRJLXKISEFAPMYGHBQ <
    10: < UDNAJFBOWTGVRSCZQKELMXYIHP <
    4:  < RPLNDVHGFCUKTEBSXQYIZMJWAO <
    11< MNBVCXZQWERTPOIUYALSKDJFHG <
    6:  < AMKGHIWPNYCJBFZDRUSLOQXVET <
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    根据转轮密码机的定义,应该是第一个轮转一圈,第2个轮就会转一个字母,但是转的不到一圈的话第二个轮子也不会转,这样的周期下来,其实就和普通的密码锁随便转出来的结果是一样的我感觉。
    还是有点搞不懂,但别人都是把每个轮的第一个字母转到和密码的排列一样的,然后再看哪一列是有意义的字母组合。
    搞不懂,不想搞懂了,就这样记着吧:)。
    脚本:

    r = [
        "KPBELNACZDTRXMJQOYHGVSFUWI", "BDMAIZVRNSJUWFHTEQGYXPLOCK",
        "GWTHSPYBXIZULVKMRAFDCEONJQ", "IHFRLABEUOTSGJVDKCPMNZQWXY",
        "JZQAWSXCDERFVBGTYHNUMKILOP", "LVNCMXZPQOWEIURYTASBKJDFHG",
        "XPLTDSRFHENYVUBMCQWAOIKZGJ", "ZWAXJGDLUBVIQHKYPNTCRMOSFE",
        "NOZUTWDCVRJLXKISEFAPMYGHBQ", "UDNAJFBOWTGVRSCZQKELMXYIHP",
        "RPLNDVHGFCUKTEBSXQYIZMJWAO", "MNBVCXZQWERTPOIUYALSKDJFHG",
        "AMKGHIWPNYCJBFZDRUSLOQXVET"
    ]
    
    m = "NFQKSEVOQOFNP"
    r2 = []
    for i in range(13):
        index = r[i].index(m[i])
        #index()返回某个字符或字符串在所属字符串中第一次出现的位置
        r[i] = r[i][index:] + r[i][:index]
    #print(r)
    for i in range(26):
        s = ""
        for j in range(13):
            s += r[j][i]
        print(s.lower() + "\n")
        #s.lower()将所有的大写字母转成小写字母
    #输出结果:
    #nfqksevoqofnp
    #ahgcxiusnwcbn
    #ctwpcubfotuvy
    #zetmdrmezgkcc
    #dqhneyczuvtxj
    #tgszrtqwtrezb
    #rypqfawawsbqf
    #xxywvsaxdcswz
    #mpbxbbojczxed
    #jlxygkigvqqrr
    #qoiitjkdrkytu
    #oczhydzljeips
    #ykufhfgullzol
    #hblrnhjbxmmio
    #gdvlugxvkxjuq
    #vmkamlpiiywyx
    #sambkvlqsiaav
    ##fireinthehole##
    ##唯一一行有意义的字母##
    #uzaulcdkfprst
    #wvfoomsyaupka
    #irdtpxrppdldm
    #kncsjzfnmnnjk
    #psegzphtyadfg
    #bjojqqecgjvhh
    #eunvaonrhfhgi
    #lwjdwwymbbgmw
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    2. easychallenge

    下载附件拿到了一个pyc文件,记得之前在MISC杂项里见过,总之这是一个python类的文件,需要再反编译为py文件,可以在线网站解密:
    python反编译 - 在线工具
    这个网站下面的提示里提到,python文件在被import运行的时候会在同目录下编译一个pyc的文件(为了下次快速加载),这个文件可以和py文件一样使用,但无法阅读和修改。所以,再结合题目内容,我们要将它反编译为py文件再进行修改才能获得flag。
    反编译后的py文件如下:

    #!/usr/bin/env python
    # visit https://tool.lu/pyc/ for more information
    # Version: Python 2.7
    
    import base64
    
    def encode1(ans):
        s = ''
        for i in ans:
            x = ord(i) ^ 36
            x = x + 25
            s += chr(x)
        
        return s
    
    
    def encode2(ans):
        s = ''
        for i in ans:
            x = ord(i) + 36
            x = x ^ 36
            s += chr(x)
        
        return s
    
    
    def encode3(ans):
        return base64.b32encode(ans)
    
    flag = ' '
    print 'Please Input your flag:'
    flag = raw_input()
    final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
    if encode3(encode2(encode1(flag))) == final:
        print 'correct'
    else:
        print 'wrong'
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    代码里可以看到有3个encode加密函数,这几个加密函数都挺简单的,加密过程也很简单,在原来的代码基础上把过程或者运算操作反过来就好了。
    解码脚本:

    import base64
    
    def decode1(ans):
        s = ''
        for i in ans:
            x = ord(i) - 25
            x = x ^ 36
            s += chr(x)
    
        return s
    
    def decode2(ans):
        s = ''
        for i in ans:
            x = i ^ 36
            x = x - 36
            s += chr(x)
    
        return s
    
    def decode3(ans):
        return base64.b32decode(ans)
    
    flag = ' '
    #print 'Please Input your flag:'
    #flag = raw_input()
    final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
    #s1=decode3(final)
    #print(s1)
    print(decode1(decode2(decode3(final))))
    #输出结果:
    #cyberpeace{interestinghhhhh}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    decode2函数本来第一步按照原来encode2函数的写法应该是x=ord(i)^36,但是这样会报错:
    在这里插入图片描述
    说是ord() expected string of length 1, but int found。于是我们单独输出decode3之后的结果看看:
    在这里插入图片描述
    其实我并不理解输出的结果是什么类型,看到 \x 感觉是十六进制,但是又出现了字母Z,报错也说是int类型。
    decode2处理的就是decode3之后的内容,既然decode3之后的内容是int类型,我们在decode2处就不需要进行ord()转整型了。

  • 相关阅读:
    C++ 并发编程实战 第十章 并行算法函数
    【 干货】前端开发 需要注意的事项❗️Be Careful❗️
    通过leangoo建立你的清单管理系统
    辽宁2022农民丰收节 国稻种芯:4个主会场31个分会场同步
    【前端逆向】社会主义核心价值观加密方法解析+python版复现
    k8s强制删除一个 Pod
    mysql面试题33:Blob和text有什么区别
    MySQL:表所在库及注释信息查找
    【Linux】网络原理
    Docker容器技术
  • 原文地址:https://blog.csdn.net/qq_48550824/article/details/133793970