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)

结果如下图:

说明:这里给出的解密过程是已知加密的列数,如果未知,只需要遍历列数,重复调用解密函数即可。

完整代码详见这里

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python下实现的RSA加密/解密及签名/验证功能示例

    本文实例讲述了Python下实现的RSA加密/解密及签名/验证功能.分享给大家供大家参考,具体如下: 原文是py2环境,而我的环境是py3,所以对原代码做了修改:decode(), encode() import rsa # 生成密钥 (pubkey, privkey) = rsa.newkeys(1024) # 保存密钥 with open('public.pem','w+') as f: f.write(pubkey.save_pkcs1().decode()) with open('pri

  • python有证书的加密解密实现方法

    本文实例讲述了python有证书的加密解密实现方法.分享给大家供大家参考.具体实现方法如下: 最近在做python的加解密工作,同时加完密的串能在php上能解出来,网上也找了一些靠谱的资料,刚好也有时间我就总结了一下python在加密与解密这块的代码,今后可能还能用的上.相对于php而言python这块加解密组件较多的,分别是: python-crypto - 这个组件是基本组件,使用的函式相对比较复杂. ezPyCrypto - 相对简单,但他作出来的公私钥无法与其他程序相兼容     SSL

  • Python实现对字符串的加密解密方法示例

    本文实例讲述了Python实现对字符串的加密解密方法.分享给大家供大家参考,具体如下: 需求是是要将密码存在数据库里,所以要加密解密是可逆的,在数据库里不要有特殊字符,防止数据库备份和恢复中出错. 安装PyCrypto,可以用AES和DES.我使用DES加解密.加密后将密文转为16进制,在入库.测试代码如下. ; html-script: false ]#!/bin/python #-*- coding:utf-8 -*- # Filename: # Revision: # Date: 2013

  • python字符串加密解密的三种方法分享(base64 win32com)

    1. 最简单的方法是用base64: 复制代码 代码如下: import base64 s1 = base64.encodestring('hello world')s2 = base64.decodestring(s1)print s1,s2 # aGVsbG8gd29ybGQ=\n# hello world Note: 这是最简单的方法了,但是不够保险,因为如果别人拿到你的密文,也可以自己解密来得到明文 2. 第二种方法是使用win32com.client 复制代码 代码如下: import

  • 使用Python进行AES加密和解密的示例代码

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.---百度百科 本科的时候弄过DES

  • python实现RSA加密(解密)算法

    RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. 今天只有短的RSA钥匙才可能被强力方式解破.到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式.只要其密钥的长度足够长,用RSA加密的信息实际上是不能被解破的.但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战. RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥.

  • Python脚本暴力破解栅栏密码

    今天遇到一个要破解的栅栏密码,先给大家介绍通用的脚本. 方法一(通用脚本): #!/usr/bin/env python # -*- coding: gbk -*- # -*- coding: utf_ -*- e = raw_input('请输入要解密的字符串\n') elen = len(e) field=[] for i in range(,elen): if(elen%i==): field.append(i) for f in field: b = elen / f result =

  • python实现DES加密解密方法实例详解

    本文实例讲述了python实现DES加密解密方法.分享给大家供大家参考.具体分析如下: 实现功能:加密中文等字符串 密钥与明文可以不等长 这里只贴代码,加密过程可以自己百度,此处python代码没有优化 1. desstruct.py DES加密中要使用的结构体 ip= (58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32,

  • Python基于DES算法加密解密实例

    本文实例讲述了Python基于DES算法加密解密实现方法.分享给大家供大家参考.具体实现方法如下: #coding=utf-8 from functools import partial import base64 class DES(object): """ DES加密算法 interface: input_key(s, base=10), encode(s), decode(s) """ __ip = [ 58,50,42,34,26,18,

  • python中base64加密解密方法实例分析

    本文实例讲述了python中base64加密解密方法.分享给大家供大家参考.具体分析如下: 一.base64 Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符.三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示.它可用来作为电子邮件的传输编码.在Base64中的可打印字符包括字母A-Z.a-z.数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同.编码后的

随机推荐