柵欄密碼的變種WWW型

柵欄密碼:

  所謂柵欄密碼,就是把要加密的明文分成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

新創建的網絡安全公衆號,歡迎各位朋友們的關注,一起學習

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章