91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用python實現柵欄加解密

發布時間:2021-04-07 10:52:17 來源:億速云 閱讀:305 作者:小新 欄目:開發技術

小編給大家分享一下如何使用python實現柵欄加解密,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

柵欄加解密是對較短字符串的一種處理方式,給定行數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:
     grid[self.Order[i]].append(j)
    else:
     grid[i].append(j)
  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{C01umnar},if u is a big new,u can help us think more question,tks.')
print "Encrypt: ",e
print "Decrypt: ", rf.decrypt(e)

結果如下圖:

如何使用python實現柵欄加解密

說明:這里給出的解密過程是已知加密的列數,如果未知,只需要遍歷列數,重復調用解密函數即可。

看完了這篇文章,相信你對“如何使用python實現柵欄加解密”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

郯城县| 祁连县| 康保县| 林芝县| 健康| 永福县| 宁远县| 祁东县| 兰溪市| 通河县| 于田县| 年辖:市辖区| 洱源县| 启东市| 武山县| 阳朔县| 宣武区| 扶绥县| 家居| 阿鲁科尔沁旗| 敖汉旗| 金寨县| 宣化县| 宁化县| 句容市| 青阳县| 海门市| 肇源县| 靖安县| 衡阳市| 沛县| 宜川县| 酉阳| 公安县| 金寨县| 屏东县| 湟源县| 涟水县| 重庆市| 海林市| 兴安县|