【愚公系列】2022年04月 编码解码-栅栏密码介绍

举报
愚公搬代码 发表于 2022/04/30 21:54:03 2022/04/30
【摘要】 一、栅栏密码介绍 1.栅栏密码 1.1 栅栏密码的概念所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)也就是说栅栏密码是移位密码的一种。 1.2 栅栏密码的应用其实栅栏密码在现实生活中的应用很少,基于它爆破破解的难度低就不太可能用来保存什么重要...

一、栅栏密码介绍

1.栅栏密码

1.1 栅栏密码的概念

所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)也就是说栅栏密码是移位密码的一种。

1.2 栅栏密码的应用

其实栅栏密码在现实生活中的应用很少,基于它爆破破解的难度低就不太可能用来保存什么重要的数据,出现的场合主要是一些ctf竞赛题,作为古典密码中算是运用最广的一种,在密码学的题目中一般都会对最终的结果进行栅栏加密。

1.3 栅栏密码的脚本

'''
遍历所有可能的栏数,并得到加/解密结果
'''
s = 'KYsd3js2E{a2jda}'
factors = [fac for fac in range(2, len(s)) if len(s)%fac == 0] #取得密文长度的所有因数
for fac in factors:
    flag = ''
    for i in range(fac): #按一定的步长取几组字符,并连接起来,这里组数就等于步长数
        flag += s[i::fac]
    print(str(fac)+'栏:'+flag)

2.W型栅栏密码

2.1 W型栅栏密码的概念

W型栅栏密码是栅栏密码的变种,将明文按w型排列,然后将每一行的字母依次连起来组成密文,行数就是密钥。

解密则同样画出这个w型图案,将每一列的字母依次连接起来组成明文。

W型栅栏密码的密钥不只是密文长度的因数,任何小于密文长度大于1的整数都有可能。

2.2 W型栅栏密码的应用

W型栅栏原理也和栅栏密码差不多只不过时形式不一样。

2.3 W型栅栏密码的脚本

'''
若知道栏数,则使用decode解密,若不知道,则使用crack_cipher遍历所有可能性
'''
def generate_w(string, n): 
    '''将字符排列成w型'''
    array = [['.']*len(string) for i in range(n)] #生成初始矩阵
    row = 0
    upflag = False
    for col in range(len(string)): #在矩阵上按w型画出string
        array[row][col] = string[col]
        if row == n-1:
            upflag = True
        if row == 0:
            upflag = False
        if upflag:
            row -= 1
        else:
            row += 1
    return array

def encode(string, n):
    '''加密'''
    array = generate_w(string, n)
    msg = []
    for row in range(n): #将每行的字符连起来
        for col in range(len(string)):
            if array[row][col] != '.':
                msg.append(array[row][col])
    return array, msg

def decode(string, n):
    '''解密'''
    array = generate_w(string, n)
    sub = 0
    for row in range(n): #将w型字符按行的顺序依次替换为string
        for col in range(len(string)):
            if array[row][col] != '.':
                array[row][col] = string[sub]
                sub += 1
    msg = []
    for col in range(len(string)): #以列的顺序依次连接各字符
        for row in range(n):
            if array[row][col] != '.':
                msg.append(array[row][col])
    return array, msg

def crack_cipher(string):
    '''破解密码'''
    for n in range(2,len(string)): #遍历所有可能的栏数
        print(str(n)+'栏:'+''.join(decode(string, n)[1]))

if __name__ == "__main__":
    string = "ccehgyaefnpeoobe{lcirg}epriec_ora_g"
    n = 5 #栏数

    #若不知道栏数,则遍历所有可能
    # crack_cipher(string)

    #若知道栏数
    array,msg = decode(string, n)
    # array,msg = encode(string, n)
    for i in array: print(i)
    print(''.join(msg))
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。