小亮学加密解密-----凯撒加密法
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
1.加密原理
所谓的“凯撒加密法”,就是将需要加密的原文,逐个字符转化成其他字符的之后,形成新的密文。
如上图,第一行,是所有可以被转换的字符(为方便显示,只列举了26个小写英文字符),
第二行,为第一行每个字符对应的索引。
接着,从1~X(X为需要加密的字符的最大索引值)中,选取一个数字,作为密钥。
当我们拿到需要加密的字符串时,将字符串中每个字符逐一去上图中寻找,找到其对应的索引,
之后,将得到的索引与密钥相加,得到的新索引对应的字符,就是转换后的新字符;
如果索引与密钥相加后大于索引的最大值,则需要从头寻找对应的新字符。
举个例子:
我们将“helloworld”通过“凯撒加密法”进行加密,密钥为10,
我们从第一个字符“h”开始,在上图中找到h的索引为7,
将h的索引与密钥相加,得到17,从上图找到索引为17的字符为r;
根据上面的步骤,我们将每个字符按照顺序逐个进行转化,最终得到密文:“rovvygybvn”
需要注意的是:
字符“w”的索引22,加上密钥后得到32,大于了加密源字符个数26,于是会从0开始继续寻找,
直到找到索引为6(32 - 26 = 6)的字符“g”
2.解密原理:
由于“凯撒加密法”只是将原文中的每个字符进行转化得到密文;
所以在拿到密文后,只要根据密钥,反推加密过程,即可得到加密前的原文;
举个例子:
密文为“rovvygybvn”,密钥为10,
我们先找到密文的第1个字符r的索引,17;
通过密钥,反推加密过程,我们可以知道密文在加密前的原文字符索引为7 (17 - 10 = 7),
从上图中可知,索引为7的字符为 h;
需要注意:
如果密文字符的索引小于密钥时,
需要将密文字符的索引与加密源字符个数(上图最大索引值为26)相加,在减去密钥,得到原文字符索引,
例如:
在解密密文字符g时,由于g的索引为6,小于密钥10,
为了找到原文字符,我们需要将g的索引与26(加密源字符个数)相加,
再与密钥10相减,即(6 + 26) - 10 = 22,由上图可知,对应原文字符为w
通过上述过程,我们将每个字符逐一解密,得到原文“helloworld”
具体代码实现如下(python实现):
#密文源字符串
#encryptSource = r"abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNPOQRSTUVWXYZ1234567890 ,.\"'!"
encryptSource = r"abcdefghigklmnopqrstuvwxyz"#加密源字符个数
encryptSourceMaxIndex = len(encryptSource)#密钥
key = 10#原文
#source = "Hello,World!"
source = "helloworld"
cryptograph = "rovvygybvn"
#加密方法
def encryptByCaesar(source):#密文newSource = ""#循环原文中的每个字符,#将每个字符在密文源字符串中的索引加上密钥,得到一个新的索引值#如果新索引值大于密文源字符个数,则取新索引与密文源字符个数的差的绝对值#根据新索引值,得到加密后的字符,并加入到密文字符串的末尾for index in range(len(source)):#找到原文字符的索引oldEncryptSourceIndex = encryptSource.find(source[index])#计算转换后字符的索引newEncryptSourceIndex = (oldEncryptSourceIndex + key) if (oldEncryptSourceIndex + key) <= encryptSourceMaxIndex else abs((oldEncryptSourceIndex + key) - encryptSourceMaxIndex)#找到新字符,并拼接密文newSource += encryptSource[newEncryptSourceIndex]return newSource#解密方法
def unencryptByCaesar(cryptograph):#保存原文字符串sourceStr = "";#循环密文中的每个字符,#将每个字符在密文源字符串中的索引减上密钥,得到一个新的索引值#如果密文索引值小于密钥,则将密文索引与密文源最大索引值相加,再减去密钥,得到原文字符索引#根据新索引值,得到加密后的字符,并加入到密文字符串的末尾for index in range(len(cryptograph)):#获取密文字符的索引值cryptographIndex = encryptSource.find(cryptograph[index])#计算原文字符的索引值SourceIndex = (cryptographIndex - key) if cryptographIndex >= key else (cryptographIndex + encryptSourceMaxIndex) - key#得到原文字符,拼接原文字符串sourceStr += encryptSource[SourceIndex]return sourceStrprint("source:" + source + ", new source:" + encryptByCaesar(source))
print("cryptograph:" + cryptograph + ", source:" + unencryptByCaesar(cryptograph))
小亮学加密解密-----凯撒加密法相关推荐
- 什么是替换加密(凯撒密码)?原理是什么?
首先了解一下什么是凯撒密码(Caesar Cipher) 凯撒密码 (英語:Caesar cipher), 或称凯撒加密.凯撒变换.变换加密,是一种最简单且最广为人知的加密技术. 凯撒密码是一种替换加 ...
- 【Python|密码学】凯撒加密法实验报告
一.实验项目名称(实验题目): 凯撒加密法 二.实验目的与要求: 掌握凯撒加密法的原理和步骤,掌握for循环的使用. 三.实验内容: 1.运行凯撒加密法程序. # Caesar Cipher # ht ...
- php凯撒密码解密,凯撒加密解密.py
# -*- coding: utf-8 -*- class CaesarCipher(object): """ 凯撒加密解密 """ def ...
- 【每日一题】| (古典加密)凯撒密码(一)简单的凯撒加密
文章目录 前言 一.凯撒加密是什么 举个例子 扩展:ROT-13(回转13位) 二.密码破解 总结 前言 今天的每日一题,由我向来大家来介绍预备知识.今天就跟大家聊一聊CTF密码学中古典加密的经典加密 ...
- 字符加密(凯撒加密)
在密码学中,恺撒密码是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文.例如,当偏移量是3的时候,所有的字母A ...
- 微信小程序 DES3加密解密
首先引用两个文件: DES3文件下载链接 BASE64文件下载链接 加密: let DES3 = require("DES3.js"); let BASE64 = require( ...
- 微信小程序AES加密解密
微信小程序 其实在调用一些第三方 js的时候 其实没有大家想的那么复杂,无非就是把原生js调用方式 改为微信小程序 js调用方式 废话不多说直接贴代码 其实就是将原生function 或者 对象 ...
- python中凯撒密码加密_凯撒密码加密
您似乎是在交互式提示中输入此代码,而不是将其保存为文件并运行它.如果是这样,那么当您使用input时,窗口将在允许您继续输入代码之前提示您输入.在plainText = input("pyt ...
- python中凯撒密码加密_凯撒密码加密Python
有人能告诉我为什么我只对纯文本信息中的一个字符进行加密?消息是"船在午夜启航",加密密钥是4.我只能让t移到x,剩下的信息无法打印.我错过了什么?在#request the mes ...
最新文章
- Python中的变量作用域
- 用Java模拟multipart形式的Http Post请求
- luogu1975 [国家集训队]排队
- VS2010配置opencv2.4.9
- Java解析HTML
- SpringMVC:学习笔记(5)——数据绑定及表单标签
- DCMTK:DSRTree和DSRTreeNodeCursor类的测试程序
- SAP Spartacus B2B页面的6个tile,url是维护在什么地方的?
- zabbix邮件发不出去
- yolo v4 python_YOLOv4: Darknet 如何于 Ubuntu 编译,及使用 Python 接口
- python使用print不换行
- 数据结构(C++版) 栈的链接存储结构及实现
- 【OSS 最佳实践】JS SDK使用STS方式实现断点续传
- 线上IIS应用程序池自动关闭
- 内核input子系统之input_event数据上报过程
- 在阿里云开源镜像站中下载centOS7
- CSS width中的max-content,min-content,fit-content的区别
- 无线网络部署与规划要点及案例分享
- 如何优雅地重启go程序--endless篇
- CTF之Bugku 秋名山老司机+python脚本代码解析