柵欄密碼:
所謂柵欄密碼,就是把要加密的明文分成N個一組,然後把每組的第1個字連起來,形成一段無規律的話。 不過柵欄密碼本身有一個潛規則,就是組成柵欄的字母一般不會太多。
傳統型:
假如有一個字符串:123456789
取字符串長度的因數進行分組,假如key=3
1 2 3 \\分組情況,每三個數字一組,分爲三組
4 5 6
7 8 9
然後每一組依次取一個數字組成一個新字符串:147258369 \\加密完成的字符串
解密方法:
遇到這種的柵欄加密的密文,解密的key值就是字符串的長度除以加密的key值 (de_key = len / key)再用de_key將密文字符串加密就可以得到原文字符串。
加密解密網站:http://www.zjslove.com/3.decode/zhalan/index.html
WWW型:
同樣一個字符串:123456789
key=3
1----5----9 \\讓數字以W型組織,同樣是三組,但每組的數量不一定相同
-2--4-6--8
--3----7--
加密密文:159246837
加密腳本
def encode(string, key):#需要加密的字符串以及加密欄數
i = 0
enlist = []
for j in range(0, key):
enlist.append('')#添加分組,列表的一個元素相當於一個分組
while i < len(string):#分組重排進行加密
for k in range(0, key):
if i >= len(string):
break
enlist[k] += string[i]
i += 1
for k in range(1, key-1):
if i >= len(string):
break
enlist[key-1-k] += string[i]
i += 1
enstr = ''
for i in range(key):
enstr += enlist[i]
return enstr
解密方法:
WWW型的加密密鑰就不只能是字符串長度的因子,小於其長度的任何一個數都可能是其key值,所以第一步也是確定密鑰。
字符串:159246837
假設 key = 3 \\具體情況下可以遍歷key值,每個值都算一次
確定key值之後就可以確定字符串的排部方法,即:
分組1:1---2---3 \\ 將第一個行第一個數到第一行的下一個數看作爲一部分(相同數字), 其長度爲這部分長度len = 2key-2
分組2:-1-1-2-2 \\確定長度的排布之後將密文帶入解密即可
分組3:--1---2-
原文:123456789
解密腳本
def decode(string, key):#解密字符串以及解密欄數
de_key = 2*key - 2#一個部分的長度
length = len(string)//de_key#確定有多少個完整部分
r = len(string)%de_key#最後不完整部分的長度
delist = []
for i in range(key):
delist.append('')#重新排布分組
#確定第一個分組
if r == 0:
delist[0] += string[0:length]
s = length
else:
delist[0] += string[0:length+1]
s = length+1
#確定第二個到第key-1個分組
for i in range(1, key-1):
l = length*2#這幾個分組長度至少是完整部分數量的兩倍
#最後一個不完整部分對應當前分組有幾個元素
if r > i:
l += 1
if r > de_key-i:
l += 1
delist[i] += string[s:s+l]
s = s+l
#確定最後一個分組
delist[key-1] += string[s:]
#排布分組確定原文字符串
destr = ''
j = 0
for i in range(0, len(string)):
destr += delist[j][0]
delist[j] = delist[j][1:]
if j == key-1:
flag = 0
if j == 0:
flag = 1
if flag:
j += 1
else:
j -= 1
return destr
加密解密網站:http://www.atoolbox.net/Tool.php?Id=777