攻防世界密码学部分:'WWW'型栅栏密码

'WWW’型栅栏密码

题目:
2
密文为:ccehgyaefnpeoobe{lcirg}epriec_ora_g

普通栅栏密码:

假如有一个字符串:123456789
取字符串长度的因数进行分组,假如key=3
1 2 3  \\分组情况,每三个数字一组,分为三组
4 5 6
7 8 9
然后每一组依次取一个数字组成一个新字符串:147258369 \\加密完成的字符串
def decode(s, n):
    f = len(s) // n
    c = ''
    for i in range(f):
        for j in range(0, len(s)):
            if j % f == i:
                c += s[j]
    print('明文为:{}'.format(c))
    return 0
s = input('密文为:')
n = eval(input('栅栏深度:'))
decode(s, n)

运行结果:
5
www型(如本题):

1

可以写程序也可以在网上找破解工具求解,我自己写的程序:

'''
WWW型栅栏密码
'''
def num(s, n):
    f = len(s) // (n - 1)
    g = len(s) % (n - 1)
    return f, g
def _list(s, n):
    x, y = num(s, n)
    if y == 0:
        c = [[] for i in range(x + 1)]
        lie = x
    else:
        c = [[] for i in range(x + 2)]
        lie = x + 1
    jk = 0
    if lie % 2 == 0:
        hk = n - y + 1
    else:
        hk = y
    for i in range(1, n + 1):
        for j in range(1, lie + 1):
            if i == 1:
                if j % 2 != 0:
                    c[j].append(s[jk])
                    jk += 1

            else:

                if lie % 2 == 0:
                    if y == 0:
                        if i != n:
                            c[j].append(s[jk])
                            jk += 1
                        if i == n:
                            if j % 2 == 0:
                                c[j].append(s[jk])
                                jk += 1
                    else:
                        if i != n:
                            if i >= hk:
                                c[j].append(s[jk])
                                jk += 1
                        else:
                            if j % 2 == 0:
                                c[j].append(s[jk])
                                jk += 1
                else:
                    if y == 0:
                        if i != n:
                            c[j].append(s[jk])
                            jk += 1
                        if i == n:
                            if j % 2 == 0:
                                c[j].append(s[jk])
                                jk += 1
                    else:
                        if i <= hk:
                            c[j].append(s[jk])
                            jk += 1
                        else:
                            if j != lie:
                                if i < n:
                                    c[j].append(s[jk])
                                    jk += 1
                                else:
                                    if j % 2 == 0:
                                        c[j].append(s[jk])
                                        jk += 1
    cs = ''
    for i in range(1, len(c)):
        if i % 2 != 0:
            for j in range(0,len(c[i])):
                cs += c[i][j]
        else:
            for j in range(len(c[i]) - 1, -1, -1):
                cs += c[i][j]
    print('明文为:{}'.format(cs))
s = input('请输入密文:')
n = int(input('栅栏深度:'))
_list(s, n)


运行结果:
3


不要说我懒不写代码的详细解释,我是觉得我的思路太复杂,给我时间让我慢慢写!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值