python實現(xiàn)柵欄加解密 支持密鑰加密
柵欄加解密是對較短字符串的一種處理方式,給定行數(shù)Row,根據(jù)字符串長度計算出列數(shù)Column,構(gòu)成一個方陣。
加密過程:就是按列依次從上到下對明文進行排列,然后按照密鑰對各行進行打亂,最后以行順序從左至右進行合并形成密文。
解密過程:將上述過程進行逆推,對每一行根據(jù)密鑰的順序回復(fù)到原始的方陣的順序,并從密文回復(fù)原始的方陣,最后按列的順序從上到下從左至右解密。
具體實現(xiàn)如下:所有實現(xiàn)封裝到一個類RailFence中,初始化時可以指定列數(shù)和密鑰,默認列數(shù)為2,無密鑰。初始化函數(shù)如下:
def __init__(self, row = 2, mask = None): if row < 2: raise ValueError(u'Not acceptable row number or mask value') self.Row = row if mask != None and not isinstance(mask, (types.StringType, types.UnicodeType)): raise ValueError(u'Not acceptable mask value') self.Mask = mask self.Length = 0 self.Column = 0
加密過程,可以選擇是否去除空白字符。首先是類型檢查,列數(shù)計算等工作,核心是通過計算的參數(shù)得到gird這個二維列表表示的方陣,也是柵欄加密的核心。具體實現(xiàn)如下:
def encrypt(self, src, nowhitespace = False): if not isinstance(src, (types.StringType, types.UnicodeType)): raise TypeError(u'Encryption src text is not string') if nowhitespace: self.NoWhiteSpace = '' for i in src: if i in string.whitespace: continue self.NoWhiteSpace += i else: self.NoWhiteSpace = src self.Length = len(self.NoWhiteSpace) self.Column = int(math.ceil(self.Length / self.Row)) try: self.__check() except Exception, msg: print msg #get mask order self.__getOrder() grid = [[] for i in range(self.Row)] for c in range(self.Column): endIndex = (c + 1) * self.Row if endIndex > self.Length: endIndex = self.Length r = self.NoWhiteSpace[c * self.Row : endIndex] for i,j in enumerate(r): if self.Mask != None and len(self.Order) > 0: grid[self.Order[i]].append(j) else: grid[i].append(j) return ''.join([''.join(l) for l in grid])
其中主要的方法是按照列數(shù)遍歷,每次從明文中取列數(shù)個數(shù)的字符串保存在遍歷 r 中,其中需要處理最后一列的結(jié)束下標是否超過字符串長度。然后將這一列字符串依次按照順序加入到方陣grid的各列對應(yīng)位置。
解密過程復(fù)雜一些,因為有密鑰對順序的打亂,需要先恢復(fù)打亂的各行的順序,得到之前的方陣之后,再按照列的順序依次連接字符串得到解密后的字符串。具體實現(xiàn)如下:
def decrypt(self, dst): if not isinstance(dst, (types.StringType, types.UnicodeType)): raise TypeError(u'Decryption dst text is not string') self.Length = len(dst) self.Column = int(math.ceil(self.Length / self.Row)) try: self.__check() except Exception, msg: print msg #get mask order self.__getOrder() grid = [[] for i in range(self.Row)] space = self.Row * self.Column - self.Length ns = self.Row - space prevE = 0 for i in range(self.Row): if self.Mask != None: s = prevE O = 0 for x,y in enumerate(self.Order): if i == y: O = x break if O < ns: e = s + self.Column else: e = s + (self.Column - 1) r = dst[s : e] prevE = e grid[O] = list(r) else: startIndex = 0 endIndex = 0 if i < self.Row - space: startIndex = i * self.Column endIndex = startIndex + self.Column else: startIndex = ns * self.Column + (i - ns) * (self.Column - 1) endIndex = startIndex + (self.Column - 1) r = dst[startIndex:endIndex] grid[i] = list(r) res = '' for c in range(self.Column): for i in range(self.Row): line = grid[i] if len(line) == c: res += ' ' else: res += line[c] return res
實際運行
測試代碼如下,以4行加密,密鑰為bcaf:
rf = RailFence(4, 'bcaf') e = rf.encrypt('the anwser is wctf{C01umnar},if u is a big new,u can help us think more question,tks.') print "Encrypt: ",e print "Decrypt: ", rf.decrypt(e)
結(jié)果如下圖:
說明:這里給出的解密過程是已知加密的列數(shù),如果未知,只需要遍歷列數(shù),重復(fù)調(diào)用解密函數(shù)即可。
完整代碼詳見這里
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于opencv和pillow實現(xiàn)人臉識別系統(tǒng)(附demo)
人臉識別就是一個程序能識別給定圖像或視頻中的人臉,本文主要介紹了opencv和pillow實現(xiàn)人臉識別系統(tǒng),本文不涉及分類器、訓(xùn)練識別器等算法原理,感興趣的可以了解一下2021-11-11Python實現(xiàn)Excel和TXT文本之間相互轉(zhuǎn)換
Excel是一種具有強大的數(shù)據(jù)處理和圖表制作功能的電子表格文件,而TXT則是一種簡單通用、易于編輯的純文本文件,本文將介紹如何使用Python并結(jié)合相關(guān)庫來實現(xiàn) Excel 和 TXT 文本文件之間的相互轉(zhuǎn)換,需要的朋友可以參考下2024-06-06Python3顯示當(dāng)前時間、計算時間差及時間加減法示例代碼
這篇文章主要給大家介紹了關(guān)于Python3顯示當(dāng)前時間、計算時間差及時間加減法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Python3具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09