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 = 133 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 = 84 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 math2 3 def main():4 myMessage = "Cenoonommstmme oo snnio. s s c"5 myKey = 86 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,transpositionDecrypt2 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程序名。
测试中,我们生成了一个全英文字母的随机字符串并打乱了顺序,通过测试在将一个字符串加密再解密后是否能得到原来的字符串来判断程序是否正常工作。
相关文章:
python 密码学编程
最近在看一本书。名字是 python密码学编程。在此做一些笔记,同时也为有需要的人提供一些参考。 ******************************************************************** * quote : "http://inventwithpython.com/" …...
【C++ | bug | 运算符重载】定义矩阵(模板)类时,使用 “友元函数” 进行 * 运算符重载时编译报错
作者:非妃是公主 专栏:《C》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐一、类的声明及函数定义二、错误信息三、问题…...
数学小课堂:无穷小(以动态的眼光看待世界,理解无限的世界)
文章目录 引言I 芝诺四个著名的悖论1.1 二分法悖论:从A点到B点是不可能的。1.2 阿喀琉斯悖论:阿喀琉斯追不上乌龟。1.3 飞箭不动悖论:射出去的箭是静止的。1.4 基本空间和相对运动悖论II 回答芝诺的悖论2.1 阿喀琉斯悖论2.2 相对运动悖论III 无穷小3.1 无穷小的定义3.1 无穷…...
leetcode 427. Construct Quad Tree(构建四叉树)
刚看到题的时候是懵的,这也太长了。到底是要表达什么呢。 不妨把这个矩阵看成一个正方形的图片,想象你在处理图片,从整体逐步到局部。 刚开始看一整张图片,如果是全0或全1,这个就是叶子节点,怎么表达叶子节…...
Spring Boot 3.0系列【2】部署篇之使用GraalVM构建原生镜像
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本2.7.0 文章目录概述JIT & AOTJIT (动态编译)AOT(静态编译)GraalVM简介运行模式Native Image(原生镜像)…...
复习知识点十之方法的重载
目录 方法的重载 练习1: 练习1: 数组遍历 练习2: 数组的最大值 练习3: 练习4: 复制数组 基本数据类型和引用数据类型 方法的重载 Java虚拟机会通过参数的不同来区分同名的方法 练习1: public class Test4 {public static void main(String[] args) {//调用方法 // …...
火爆全网的ChatGPT 和AI 可以为项目经理做什么?
作为一款人工智能聊天机器人,ChatGPT因其逼真和人性化的特性而风靡全球,无疑是当今技术的新流行。人工智能 (AI) 有可能彻底改变许多行业,包括项目管理,及时了解最新技术以及它如何影响你的工作至关重要。于是,我们与C…...
前端面试题 —— HTML
目录 一、src 和 href 的区别 二、对 HTML 语义化的理解 三、DOCTYPE(⽂档类型) 的作⽤ 四、script 标签中 defer 和 async 的区别 五、常⽤的 meta 标签有哪些? 六、HTML5 有哪些更新 八、行内元素有哪些?块级元素有哪些? 空(void)元素…...
同为(TOWE)电源线让家用电器随心放置
如今,随着科技水平的不断发展,人们工作、生活中越来越离不开各类电子设备和电器产品。当用电器数量多了以后,由于电器设备原有电线长度的限制,常常需要通过连接接线板来延长电器设备的电能传输线路。电源线虽然看着是一件不起眼的…...
2023上半年数学建模竞赛汇总(报名时间、比赛时间、难易程度、含金量、竞赛官网)
1、美国大学生数学建模竞赛等级:国家级是否可跨校:否竞赛开始时间:2月17日~2月21日综合难度:⭐⭐⭐⭐ 竞赛含金量:⭐⭐⭐⭐⭐竞赛官网:https://www.comap.com/2、MathorCup高校数学建模挑战赛---大数据竞赛…...
RK3568平台开发系列讲解(驱动基础篇)SMP(Symmetrical Multi-Processing)
🚀返回专栏总目录 文章目录 一、linux SMP 和 AMP二、linux SMP的启动流程三、CPU的描述:cpumask四、CPU之间的关系沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 SMP(Symmetrical Multi-Processing)。 一、linux SMP 和 AMP 目前支持多核处理器的实时操…...
HIVE --- zeppelin安装
目录 把zeppelin压缩包拷贝到虚拟机里面 解压 改名 修改配置文件 编辑zeppelin-site.xml—将配置文件的ip地址和端口号进行修改 编辑 zeppelin-env.sh—添加JDK和Hadoop环境 配置环境变量 刷新环境变量 拷贝Hive文件 拷贝外部文件 启动zeppelin 启动Hadoop&Hi…...
数据分析中的变量解释
1.数值变量Numerical Variables 数值型变量(metric variable)是说明事物数字特征的一个名称,其取值是数值型数据。如“产品产量”、“商品销售额”、“零件尺寸”、“年龄”、“时间”等都是数值型变量,这些变量可以取不同的数值…...
django-博客(一)
一、 1、环境:pycharm,python3.6,django3,mysql8.0 2、创建项目 3、把html和css样式那些导入到文件夹中,然后配置这些文件夹的路径,再添加首页视图。 改成反向解析 python manage.py runserv…...
Shell高级——Linux中的文件描述符
以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 前言 Linux中一切接文件,比如 C 源文件、视频文件、Shell脚本、可执行文件等,就连键盘、显示器、鼠标等硬件设备也都是文件。 一个 Linux 进程可以打开成百上…...
洗地机哪个品牌最好用?家用洗地机十大名牌
这几年清洁类的小家电非常热门,无线吸尘器、扫地机器人、扫拖一体机、洗地机和擦窗机器人层出不穷,各个品牌百花齐放。这些清洁电器,确实为家庭卫生清洁带来了很大的便捷。但要把这些产品一次性买齐是一笔不小的开销,而且需要收纳…...
java多线程(十)线程休眠
一、sleep()介绍 sleep() 定义在Thread.java中。 sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由…...
Leetcode20. 有效的括号
一、题目描述: 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确…...
Android 项目必备(四十三)-->Android 开发者的 new 电脑
前言 作为 Android 开发者,当你新入职一家公司,拿到新发的电脑,你会对电脑干点啥? 安装开发环境?装软件?你是否还会铺天盖地到处找之前电脑备份的东西?又或者还想不起来有什么上一台电脑好用的…...
如何水平和垂直居中元素
跳到主内容 我试图将我的选项卡内容垂直居中,但是当我添加 CSS 样式时display:inline-flex,水平文本对齐消失了。 如何为每个选项卡同时对齐文本 x 和 y? * { box-sizing: border-box; } #leftFrame {background-color: green;position: a…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
