python3解密栅栏密码的正确方法
python3解密柵欄密碼的正確方法
今天在做ctf時想找一個柵欄密碼的解密腳本,在網上搜過了下,發現竟然沒找到一個正確的腳本(也可能是自己的搜索水平太差),倒不是說大家的腳本都有問題,只是在解決特殊情況時會出錯。
比如這個帖子里的:
https://blog.csdn.net/weixin_42109012/article/details/97535995
如果加密abcdef 每組字數為4,那么加密后應該是aebfcd,但是按上面的那個貼子里的代碼去解密會得到acedbf
再比如這個里面的:
https://blog.csdn.net/abc_12366/article/details/87197344
這個代碼也算不出我給的情況,并且里面用的參數是分多少欄,這個我覺得也是不合適的,因為假如字符串有長度為7,分為2欄的話,就會幾種情況:
- 每組字數為4,那么第一組為4,第二組為3
- 每組字數為5,那么第一組為5,第二組為2
- ……
而這幾種情況加密后的結果是不一樣的,所以必須規定每組字數,才更為準確。
為了解決這種不字符長度不能被每組字符數整除的情況,我考慮了好一會,開始想人為的分組,或者分不同余數情況來分別處理,最后效果都不好。
最終我想出來一個比較合適的算法就是補位。
例如上面的例子:aebfcd, 每組字符數為4
字符串長度為6,不能被4整除,那么就補位,因為4*2=8, 那么需要補2位
如果用-代替補位,那么就是aebfc-d-,再進行解碼就很好解了,用前面兩個文章里的代碼都能解出來。其實程序不難,關鍵是想到怎么樣才能解決不能整除的特殊情況。
完整的代碼如下:
# _*_ encoding:utf-8 _*_ import mathdef buwei(encrypted_str,fence_length): # 比如 14,4str_len = len(encrypted_str)fence_count = math.ceil(str_len/ fence_length) # 得出4target_length = fence_count*fence_lengthjiequ = []while str_len<target_length:encrypted_str = encrypted_str + '*'jiequ.append(encrypted_str[-fence_count :])encrypted_str = encrypted_str[:-fence_count]str_len += 1jiequ.reverse()s = ''for i in jiequ:s = s + iresult = encrypted_str + sreturn resultdef decrypt_fence(encrypted_str,fence_length):encrypted_str = buwei(encrypted_str,fence_length)if fence_length>=len(encrypted_str) or fence_length<1:print("柵欄長度太大或者太小,無需解密")returnfence_count = math.ceil(len(encrypted_str)/fence_length)elen=len(encrypted_str)# b = elen // f # 用字符串實際長度除以上面計算出能整出的數字fresult = {x: '' for x in range(fence_count)}for i in range(elen): # 字符串有多少位,就循環多少次a = i % fence_countresult.update({a: result[a] + encrypted_str[i]}) # 字符串截斷,并更新數據d = ''for i in range(len(result)):d += result[i]d = d.replace("*", '')print(f'假設每欄字數為:{fence_length},解密結果為:ze8trgl8bvbq') # 輸出結果,并開始下一個循環decrypt_fence('adbecf', 4)經測試,可以正確的處理各種不被整除的情況,本人業余編程愛好者,如果有代碼有錯誤或者要改進的地方,歡迎大家評論,另外如果有更好的算法,也請告知我下,謝謝啦。
總結
以上是生活随笔為你收集整理的python3解密栅栏密码的正确方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性代数矩阵秩的8大性质、重要定理以及关
- 下一篇: C#,数独游戏(Sudoku Game)