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…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
