2016 h4ckit-ctf ninja-scheme Feistel结构

代码如下:

#!/usr/bin/env python
# coding=utf-8

def slice(s,size):
    return [s[i:i+size] for i in range(0,len(s),size)]
#print slice("abcdefghijklmnop",4)
#['abcd'.'efgh','ijkl','mnop']

def xor(a,b):
    return "".join([chr(ord(a[i]) ^ ord(b[i%len(b)])) for i in xrange(len(a))])
#print xor('AAAABBBB','11112222')
#pppppppp

def f(L,n):
    ans = ""
    for i in range(len(L)):
        ans += chr((ord(L[i]) + n) % 256)
    return ans

def decrypt(cipher,rounds):
    assert len(cipher) == 8
    r = cipher[4:]
    l = cipher[:4]
    tmp = l
    l = r
    r = tmp
    for n in reversed(range(1,rounds + 1)):
        tmp = l
        l = r
        r = xor(tmp,f(r,n))
    return l + r

cipher = "dd67ca82d358f0c8479e118addcec2f8ce086c0f6f239f9b66d7226a38c68198dbd777f366fb9fd83b60d11109be174759c75ea56a4866c2"
cipher = slice(cipher.decode("hex"),8)

for i in range(1000):
    plain = decrypt(cipher[0],i)
    if plain.find("h4ck1t") >= 0:
        print "rounds = ",i
        rounds = i

flag = ""
for c in cipher:
    flag += decrypt(c,rounds)
print flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值