柵欄加解密python實現(支援金鑰加密)

2022-09-15 18:15:10 字數 3801 閱讀 8281

柵欄加解密是對較短字串的一種處理方式。給定行數row,依據字串長度計算出列數column,構成乙個方陣。

加密過程:就是按列依次從上到下對明文進行排列,然後依照金鑰對各行進行打亂。最後以行順序從左至右進行合併形成密文。

解密過程:將上述過程進行逆推,對每一行依據金鑰的順序回覆到原始的方陣的順序,並從密文回覆原始的方陣,最後按列的順序從上到下從左至右解密。

詳細實現例如以下:全部實現封裝到乙個類railfence中,初始化時能夠指定列數和金鑰,預設列數為2,無金鑰。初始化函式例如以下:

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

加密過程,能夠選擇是否去除空白字元。首先是型別檢查,列數計算等工作,核心是通過計算的引數得到gird這個二維列表表示的方陣,也是柵欄加密的核心。詳細實現例如以下:

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:

else:

return ''.join([''.join(l) for l in grid])

當中基本的方法是依照列數遍歷,每次從明文中取列數個數的字串儲存在遍歷 r 中,當中須要處理最後一列的結束下標是否超過字串長度。

然後將這一列字串依次依照順序增加到方陣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 ...