Bugku:加密 python(N1CTF)

94 篇文章 2 订阅
24 篇文章 0 订阅

这道题的题目就告诉了我们要用python。

这里看到有两个python,第一个打开。

 

用的是N1ES这个什么东西来加密了flag,后面也有一长串的注释,下一个文件也是,

 

不过这个文件的函数让我觉得有点熟悉,发现是Feistel加密!!【对称加密算法噢噢】

 

那就简单了,基本上不用改里面的方法。这时候搬出Feistel加密的流程:

看到了吗,完全一样,只是顺序不一样。

 

那么只需要小小修改python代码就可以了。

这个代码是python2的环境,先调整为python2。然后其中的add_round,permutate等函数完全不用动。

 

只需要修改一个很小的地方。

 

还有challenge.py即可,

 

具体代码:

# -*- coding: utf-8 -*-def round_add(a, b):    f = lambda x, y: x + y - 2 * (x & y)    res = ''    for i in range(len(a)):        res += chr(f(ord(a[i]), ord(b[i])))    return resdef permutate(table, block):    return list(map(lambda x: block[x], table))def string_to_bits(data):    data = [ord(c) for c in data]    l = len(data) * 8    result = [0] * l    pos = 0    for ch in data:        for i in range(0,8):            result[(pos<<3)+i] = (ch>>i) & 1        pos += 1    return results_box = [54, 132, 138, 83, 16, 73, 187, 84, 146, 30, 95, 21, 148, 63, 65, 189, 188, 151, 72, 161, 116, 63, 161, 91, 37, 24, 126, 107, 87, 30, 117, 185, 98, 90, 0, 42, 140, 70, 86, 0, 42, 150, 54, 22, 144, 153, 36, 90, 149, 54, 156, 8, 59, 40, 110, 56,1, 84, 103, 22, 65, 17, 190, 41, 99, 151, 119, 124, 68, 17, 166, 125, 95, 65, 105, 133, 49, 19, 138, 29, 110, 7, 81, 134, 70, 87, 180, 78, 175, 108, 26, 121, 74, 29, 68, 162, 142, 177, 143, 86, 129, 101, 117, 41, 57, 34, 177, 103, 61, 135, 191, 74, 69, 147, 90, 49, 135, 124, 106, 19, 89, 38, 21, 41, 17, 155, 83, 38, 159, 179, 19, 157, 68, 105, 151, 166, 171, 122, 179, 114, 52, 183, 89, 107, 113, 65, 161, 141, 18, 121, 95, 4, 95, 101, 81, 156, 17, 190, 38, 84, 9, 171, 180, 59, 45, 15, 34, 89, 75, 164, 190, 140, 6, 41, 188, 77, 165, 105, 5, 107, 31, 183, 107, 141, 66, 63, 10, 9, 125, 50, 2, 153, 156, 162, 186, 76, 158, 153, 117, 9, 77, 156, 11, 145, 12, 169, 52, 57, 161, 7, 158, 110, 191, 43, 82, 186, 49, 102, 166, 31, 41, 5, 189, 27]def generate(o):    k = permutate(s_box,o)    b = []    for i in range(0, len(k), 7):        b.append(k[i:i+7] + [1])    c = []    for i in range(32):    pos = 0    x = 0    for j in b[i]:      x += (j<<pos)      pos += 1    c.append((0x10001**x) % (0x7f))    return cclass N1ES:    def __init__(self, key):        if (len(key) != 24 or isinstance(key, bytes) == False ):            raise Exception("key must be 24 bytes long")        self.key = key        self.gen_subkey()    def gen_subkey(self):        o = string_to_bits(self.key)        k = []        for i in range(8):          o = generate(o)          k.extend(o)          o = string_to_bits([chr(c) for c in o[0:24]])        self.Kn = []        for i in range(32):            self.Kn.append(map(chr, k[i * 8: i * 8 + 8]))        return    def encrypt(self, plaintext):        if (len(plaintext) % 16 != 0 or isinstance(plaintext, bytes) == False):            raise Exception("plaintext must be a multiple of 16 in length")        res = ''        for i in range(len(plaintext) / 16):            block = plaintext[i * 16:(i + 1) * 16]            L = block[:8]            R = block[8:]            for round_cnt in range(32):                L, R = R, (round_add(L, self.Kn[round_cnt]))            L, R = R, L            res += L + R        return res    def decrypt(self, cipher):        res = ''        for i in range(len(cipher)/16):            block = cipher[i * 16:(i + 1) * 16]            L = block[:8]            R = block[8:]            for round_cnt in range(32):                L,R = R, (round_add(L, self.Kn[31-round_cnt]))            L,R = R,L            res += L + R        return res

challenge.py

from N1ES import N1ESimport base64key = "wxy191iss00000000000cute"n1es = N1ES(key)#flag = "N1CTF{*****************************************}"#cipher = n1es.encrypt(flag)#print(base64.b64encode(cipher))  # HRlgC2ReHW1/WRk2DikfNBo1dl1XZBJrRR9qECMNOjNHDktBJSxcI1hZIz07YjVxflag = base64.b64decode("HRlgC2ReHW1/WRk2DikfNBo1dl1XZBJrRR9qECMNOjNHDktBJSxcI1hZIz07YjVx")flag = n1es.decrypt(flag)print flag

 

 

获得flag

N1CTF{F3istel_n3tw0rk_c4n_b3_ea5i1y_s0lv3d_/--/}

 

【开始营销】

想要学习CTF而没有动力?

想要在CTF领域比别人牛?

想要在网络安全信息安全方向探索而无法坚持?

欢迎关注我的微信公众号!!~~

大家一起学习,用我的毅力给与你力量!!我相信:

我思故我在。

学无止境。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酥酥糖学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值