柵欄密碼定義如下:
柵欄密碼是將明文分成多個組,取每組第乙個字元連成一段,每組第二個字元連成一段……最後將各段連線起來得到密文。同時也可看成是按一定的步長取幾組字元,再將這幾組字元連起來得到密文。解密同理。
這裡的步長就是金鑰(欄數)。
傳統柵欄密碼的金鑰是密文長度的因數。
如密文長度為n,加密金鑰為x,則有n%x==0。且解密金鑰即為n/x。
**:
'''
遍歷所有可能的欄數,並得到加/解密結果
'''s = 'kysd3js2e'
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)
w型柵欄密碼是柵欄密碼的變種,
將明文按w型排列,然後將每一行的字母依次連起來組成密文,行數就是金鑰。
解密則同樣畫出這個w型圖案,將每一列的字母依次連線起來組成明文。
w型柵欄密碼的金鑰不只是密文長度的因數,任何小於密文長度大於1的整數都有可能。
**:
'''
若知道欄數,則使用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] != '.':
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] != '.':
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 = "ccehgyaefnpeoobeepriec_ora_g"
n = 5 #欄數
#若不知道欄數,則遍歷所有可能
# crack_cipher(string)
#若知道欄數
W型柵欄密碼
coding utf8 helloworldgoodmorning x 5 h l r x e r d o n x l o g m i x l w o d n x o o g hlrnerdonilogmiqlwodnxoog 75 1 3 31 5 7helloworldgoodmorning x...
密碼學 柵欄密碼
使用的時候通過設定解密的偏移量不一樣的話,會得出不同的解碼內容 一直設定不同的偏移位數 直到找到帶有cyberpeace 開頭的解碼內容 偏移量也就是分組的數字長度 一般就是flag了 有時候它也會全部的解碼都沒有flag的標誌,這時候一定仔細看題目給出的條件 還有的情況就是在題目裡面它會提示給你數...
柵欄密碼加密與解密以及特徵
原理描述 所謂柵欄密碼,就是把要加密的明文分成n個一組,然後把每組的第1個字連起來,形成一段無規律的話。不過柵欄密碼本身有乙個潛規則,就是組成柵欄的字母一般不會太多。一般不超過30個,也就是 一 兩句話 加密特徵 總體來說字母內容不變,僅是字母順序被 打亂 加密的時候要選擇組數,所以解密的話只能逆推...