柵欄加解密是對較短字串的一種處理方式。給定行數row,依據字串長度計算出列數column,構成乙個方陣。
加密過程:就是按列依次從上到下對明文進行排列,然後依照金鑰對各行進行打亂。最後以行順序從左至右進行合併形成密文。
解密過程:將上述過程進行逆推,對每一行依據金鑰的順序回覆到原始的方陣的順序,並從密文回覆原始的方陣,最後按列的順序從上到下從左至右解密。
詳細實現例如以下:全部實現封裝到乙個類railfence中,初始化時能夠指定列數和金鑰,預設列數為2,無金鑰。初始化函式例如以下:
def __init__(self, row = 2, mask = none):加密過程,能夠選擇是否去除空白字元。首先是型別檢查,列數計算等工作,核心是通過計算的引數得到gird這個二維列表表示的方陣,也是柵欄加密的核心。詳細實現例如以下: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
def encrypt(self, src, nowhitespace = false):當中基本的方法是依照列數遍歷,每次從明文中取列數個數的字串儲存在遍歷 r 中,當中須要處理最後一列的結束下標是否超過字串長度。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:
else:
return ''.join([''.join(l) for l in grid])
然後將這一列字串依次依照順序增加到方陣grid的各列相應位置。
解密過程複雜一些,由於有金鑰對順序的打亂。須要先恢復打亂的各行的順序。得到之前的方陣之後,再依照列的順序依次連線字串得到解密後的字串。詳細實現例如以下:
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,if u is a big new,u can help us think more question,tks.')
print "encrypt: ",e
print "decrypt: ", rf.decrypt(e)
說明:這裡給出的解密過程是已知加密的列數。假設未知,僅僅須要遍歷列數,反覆呼叫解密函式就可以。
完整**詳見這裡:
柵欄密碼 W型柵欄密碼 加解密(python實現)
柵欄密碼定義如下 柵欄密碼是將明文分成多個組,取每組第乙個字元連成一段,每組第二個字元連成一段 最後將各段連線起來得到密文。同時也可看成是按一定的步長取幾組字元,再將這幾組字元連起來得到密文。解密同理。這裡的步長就是金鑰 欄數 傳統柵欄密碼的金鑰是密文長度的因數。如密文長度為n,加密金鑰為x,則有n...
python 實現DES加解密
from pydes import import base64 class des3 object def init self,key,iv 這裡金鑰key長度必須為16 24,偏移量ivs self.key key self.mode cbc self.iv iv 加密函式,如果text不是16的...
仿射密碼加解密(python實現)
仿射密碼是一種替換密碼。它是利用加密函式乙個字母對乙個字母的加密。加密函式是e x ax b mod m 其中,a和m互質,m是字符集的大小。例如,26即是以26個字母作為編碼,當m是26時,a必須是1,3,5,7,9,11,15,17,19,21,23,25其中之一 解密函式為d x a 1 x ...