python 密码学编程

最近在看一本书。名字是 python密码学编程。在此做一些笔记,同时也为有需要的人提供一些参考。

********************************************************************

*        quote : "http://inventwithpython.com/"              *

*        python-version : 2.7.11                      *

********************************************************************

1.第一种加密方法。反转加密法。

即通过反向输出消息来进行加密。例如将“Hello World” 加密成 “dlroW olleH”

这是一种非常弱的加密方式。么什了说它清弄以可然仍你,密加被已息信条这使即

1 message = "Three can keep a secret,if two of them are dead."
2 translated = ‘‘
3
4 i = len(message) - 1
5 while i >= 0:
6     translated = translated + message[i]
7     i = i - 1
8 print translated

实现思路也非常简单。就是把一个String从后到前拼接到另一个String上。

至于解密。可以使message 为加密后的密文,打印出来的即为明文。

2.凯撒加密法

凯撒加密(Caesar cipher)是一种简单的消息编码方式:它根据字母表将消息中的每个字母移动常量位k。举个例子如果k等于3,则在编码后的消息中,每个字母都会向前移动3位:a会被替换为d;b会被替换成e;依此类推。字母表末尾将回卷到字母表开头。于是,w会被替换为z,x会被替换为a

 1 message = "this is my secret message"
 2 key = 13
 3
 4 mode = "encrypt"
 5 LETTERS = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ‘
 6 translated = ‘‘
 7 message = message.upper()
 8
 9 for symbol in message:
10     if symbol in LETTERS:
11         num = LETTERS.find(symbol)
12         if mode == "encrypt":
13             num = num + key
14         elif mode == "decrypt":
15             num = num - key
16
17         if num >= len(LETTERS):
18             num = num - len(LETTERS)
19         elif num < 0:
20             num = num + len(LETTERS)
21
22         translated = translated + LETTERS[num]
23
24     else:
25         translated = translated + symbol
26
27 print translated

首先。message 保存了要加密的消息。key 保存了秘钥。mode 表示模式,encrypt为加密,decrypt为解密。translated 为加密后的字符串。.upper()方法用来忽略大小写。

具体实现。遍历message 中的每一个字符。

如果该字符属于26个英文字母。

  当模式为加密时,就把这个字符在字母表中的位置加上秘钥 key。用新的位置的字符来替换。如果加上秘钥之后的值超过了字母表的长度,我们需要回滚,即减去一个字母表的长度来确定它的新位置。

  当模式为解密时,就减去key。注意位置小于0时要加上一个字母表的长度。

字符不是英文字母时不用替换,直接拼接到新字符串上即可。

3.暴力破解凯撒加密法

对于我们上面那种情况的凯撒加密法,我们可以发现可能的秘钥最多只有26个。于是我们可以尝试暴力破解,即尝试每一个可能的秘钥。

 1 message = "GUVF VF ZL FRPERG ZRFFNTR"
 2 LETTERS = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ‘
 3
 4 for key in range(len(LETTERS)):
 5     translated = ‘‘
 6     for symbol in message:
 7         if symbol in LETTERS:
 8             num = LETTERS.find(symbol)
 9             num = num - key
10             if num < 0:
11                 num += len(LETTERS)
12             translated += LETTERS[num]
13         else:
14             translated += symbol
15     print "Key %s : %s"%(key , translated)

这段代码和上面的代码有很多相似。

message 存储了密文。其余代码对应了上面的 decrypt 模式。

我们打印出了26中可能的解密。

4.换位加密法

换位加密法不是替换字符,而是搞乱消息符号的顺序。

例如消息 Common sense is not so common.

假设使用数字 8 作为秘钥。也就是我们将在每一行放最多8个字符。(包含空格和标点)

对于上面这条消息,我们可以画出这样一个方格图

C o m m o n   s
e n s e   i s  
n o t   s o   c
o m m o n .    

最后一行的两个格子涂黑忽略它们。

正常的阅读方式应该是横向去读。如果我们把消息用列向表示出来,它的混乱程度足以让别人看不清原来的消息

密文是   Cenoonommstmme oo snnio. s s c    (表中的空格需要表示,黑色方格直接忽略)

 1 def main():
 2     myMessage = "Common sense is not so common."
 3     myKey = 8
 4
 5     ciphertext = encryptMessage(myKey , myMessage)
 6
 7     print ciphertext + "|"
 8
 9 def encryptMessage(key , message):
10     ciphertext = [‘‘]*key
11
12     for col in range(key):
13         pointer = col
14
15         while pointer < len(message):
16             ciphertext[col] += message[pointer]
17             pointer += key
18     return ‘‘.join(ciphertext)
19
20 if __name__ == "__main__":
21     main()

具体到 encryptMessage 函数。我们首先创建了一个 list ,其中包含了 8(key)个空元素。这对应了上面表格中的8 (key) 列。

我们遍历这 8 列。

在第一列,我们依次拼接 原 message 中的 第 0,8,16,24......个字符。直到超出了 message 的长度。

在第二列,我们依次拼接 原 message 中的 第 1,9,17,25......个字符。直到超出了 message 的长度。

以此类推。

.join 方法将 list 转换为字符串然后 return。

换位加密法的解密过程:

当我们收到密文和秘钥之后。我们需要画一个表格。表格行数等于秘钥,列数等于 密文长度除以秘钥然后向上取整。

例如 密文 “Cenoonommstmme oo snnio. s s c”长度30,秘钥key = 8,我们需要画8行4列的表格

从左上角开始向右填。那么从上往下阅读时我们会看到明文(其实这两个表格的关系就类似于矩阵的倒置)

C e n o
o n o m
m s t m
m e   o
o   s n
n i o .
  s    
s   c  
 1 import math
 2
 3 def main():
 4     myMessage = "Cenoonommstmme oo snnio. s s c"
 5     myKey = 8
 6
 7     ciphertext = decryptMessage(myKey , myMessage)
 8
 9     print ciphertext + "|"
10
11 def decryptMessage(key , message):
12     numOfColumns = int(math.ceil(len(message) / float(key)))
13     numOfRows = key
14     numOfShadeBoxes = (numOfColumns * numOfRows) - len(message)
15     plaintext = [‘‘] * numOfColumns
16
17     col = 0
18     row = 0
19     for symbol in message:
20         plaintext[col] += symbol
21         col += 1
22
23         if col == numOfColumns or col == numOfColumns - 1 and row >= numOfRows - numOfShadeBoxes:
24             col = 0
25             row += 1
26     return ‘‘.join(plaintext)
27
28 if __name__ == "__main__":
29     main()

这个程序完全按照和前面填表格的方式进行。

先从第0行开始,依次填第零列,第一列,第二列,第三列

然后跳到下一行,依次进行

其中。numOfShadedboxes 表示的是黑方格数,也就是默认不填字符的位置。程序会跳过这些地方填字符。

好的。现在让我们来写一个测试程序证明前面的加密和解密程序在对应不同的 message 和 key 时确实能正常工作。

 1 import random,sys,transpositionEncrypt,transpositionDecrypt
 2
 3 def main():
 4     random.seed(42)
 5     for i in xrange(20):
 6         message = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" * random.randint(4,40)
 7         message = list(message)
 8         random.shuffle(message)
 9         message = ‘‘.join(message)
10         print "Test #%s : %s..."%(i+1,message[:50])
11
12         for key in xrange(1,len(message)):
13             if message != transpositionDecrypt.decryptMessage(key , transpositionEncrypt.encryptMessage(key, message)):
14                 print "Mismatch with key %s and message %s"%(key , message)
15                 sys.exit()
16     print "Transposition cipher test passed."
17
18 if __name__ == "__main__":
19     main()

其中。import 语句中。transpositionEncrypt , transpositionDecrypt 为我们之前写的换位法 加密 和 解密 的py程序名。

测试中,我们生成了一个全英文字母的随机字符串并打乱了顺序,通过测试在将一个字符串加密再解密后是否能得到原来的字符串来判断程序是否正常工作。

时间: 2024-11-10 01:29:12

python 密码学编程的相关文章

【python密码学编程】5.反转加密法

1 #Reverse Cipher 2 message = 'there can keep a secret,if two of them are dead.' 3 translated = '' 4 i = len(message)-1 5 while i >= 0: 6 translated = translated + message[i] 7 i = i-1 8 print translated >>>C:\Python27\python.exe E:/Python/密码学

python 密码学编程 -- 2

接上一篇随笔 ******************************************************************** * quote : "http://inventwithpython.com/" * * python-version : 2.7.11 * ******************************************************************** 1.通过编程来检测英文 计算机无法理解英文.但是和乱码相比

Python Socket 编程——聊天室演示样例程序

上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的样例,就是同意多个人同一时候一起聊天.每一个人发送的消息全部人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.例如以下图: 图来自:http://www.ibm.com/developerworks/linux/tu

python面向对象编程

java和c#只支持面向对象编程,python即可支持面向对象也可以支持函数式编程. 面向对象两个重要的概念:  1.类 2.对象 函数式 def sendemail(email,msg):            函数 print("8888") 面向对象 class Myclass: def sendmail(self,email,msg):      函数定义在类中第一个参数必须是self print("8888")              函数在类中定义叫方

python高级编程之(类级):子类内建类型

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #类级 #在2.2中,提出了类型(type0与类(class)统一(请访问:https://www.python.org/download/releases/2.2.3/descintro(可能已经不存在了))-这使内建类型的子类化成为可能,并且添加一个新内建类型object #用于所有内建类的公共祖先 #展示一个名为distinctdict类的代码,与平常的dic

Python IO编程——StringIO & BytesIO

1.1   StringIO & BytesIO 1.1.1   StringIO StringIO顾名思义就是在内存中读写str. 写StringIO >>> fromio import StringIO >>> f = StringIO() >>> f.write('hello') 5 >>> f.write(' ') 1 >>> f.write('world!') 6 >>> f.ge

python核心编程--笔记

python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后

Python高级编程之生成器(Generator)与coroutine(一):Generator

这是一系列的文章,会从基础开始一步步的介绍Python中的Generator以及coroutine(协程)(主要是介绍coroutine),并且详细的讲述了Python中coroutine的各种高级用法,最后会用coroutine实现一个简单的多任务的操作系统. 其实也是看完这篇文章的学习笔记吧!O(∩_∩)O 生成器(Generator) 什么是生成器?在Python中,生成器(Generator)是一个带有yield关键字的函数 1 def gene(): 2 a = 1 3 print "

【python核心编程】第六章 序列

1.操作符 (1)成员关系操作符:in .not in >>> string ='abcdefg'>>> 'a' in stringTrue>>> 'h' in stringFalse>>> 'h' not in stringTrue *补充知识*:string模块 >>> import string>>> string.uppercase        #大写字母'ABCDEFGHIJKLMNOP