【愚公系列】2022年04月 编码解码-栅栏密码介绍
【摘要】 一、栅栏密码介绍 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)