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))

小亮学加密解密-----凯撒加密法相关推荐

  1. 什么是替换加密(凯撒密码)?原理是什么?

    首先了解一下什么是凯撒密码(Caesar Cipher) 凯撒密码 (英語:Caesar cipher), 或称凯撒加密.凯撒变换.变换加密,是一种最简单且最广为人知的加密技术. 凯撒密码是一种替换加 ...

  2. 【Python|密码学】凯撒加密法实验报告

    一.实验项目名称(实验题目): 凯撒加密法 二.实验目的与要求: 掌握凯撒加密法的原理和步骤,掌握for循环的使用. 三.实验内容: 1.运行凯撒加密法程序. # Caesar Cipher # ht ...

  3. php凯撒密码解密,凯撒加密解密.py

    # -*- coding: utf-8 -*- class CaesarCipher(object): """ 凯撒加密解密 """ def ...

  4. 【每日一题】| (古典加密)凯撒密码(一)简单的凯撒加密

    文章目录 前言 一.凯撒加密是什么 举个例子 扩展:ROT-13(回转13位) 二.密码破解 总结 前言 今天的每日一题,由我向来大家来介绍预备知识.今天就跟大家聊一聊CTF密码学中古典加密的经典加密 ...

  5. 字符加密(凯撒加密)

    在密码学中,恺撒密码是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文.例如,当偏移量是3的时候,所有的字母A ...

  6. 微信小程序 DES3加密解密

    首先引用两个文件: DES3文件下载链接 BASE64文件下载链接 加密: let DES3 = require("DES3.js"); let BASE64 = require( ...

  7. 微信小程序AES加密解密

    微信小程序  其实在调用一些第三方 js的时候 其实没有大家想的那么复杂,无非就是把原生js调用方式   改为微信小程序 js调用方式 废话不多说直接贴代码 其实就是将原生function 或者 对象 ...

  8. python中凯撒密码加密_凯撒密码加密

    您似乎是在交互式提示中输入此代码,而不是将其保存为文件并运行它.如果是这样,那么当您使用input时,窗口将在允许您继续输入代码之前提示您输入.在plainText = input("pyt ...

  9. python中凯撒密码加密_凯撒密码加密Python

    有人能告诉我为什么我只对纯文本信息中的一个字符进行加密?消息是"船在午夜启航",加密密钥是4.我只能让t移到x,剩下的信息无法打印.我错过了什么?在#request the mes ...

最新文章

  1. Python中的变量作用域
  2. 用Java模拟multipart形式的Http Post请求
  3. luogu1975 [国家集训队]排队
  4. VS2010配置opencv2.4.9
  5. Java解析HTML
  6. SpringMVC:学习笔记(5)——数据绑定及表单标签
  7. DCMTK:DSRTree和DSRTreeNodeCursor类的测试程序
  8. SAP Spartacus B2B页面的6个tile,url是维护在什么地方的?
  9. zabbix邮件发不出去
  10. yolo v4 python_YOLOv4: Darknet 如何于 Ubuntu 编译,及使用 Python 接口
  11. python使用print不换行
  12. 数据结构(C++版) 栈的链接存储结构及实现
  13. 【OSS 最佳实践】JS SDK使用STS方式实现断点续传
  14. 线上IIS应用程序池自动关闭
  15. 内核input子系统之input_event数据上报过程
  16. 在阿里云开源镜像站中下载centOS7
  17. CSS width中的max-content,min-content,fit-content的区别
  18. 无线网络部署与规划要点及案例分享
  19. 如何优雅地重启go程序--endless篇
  20. CTF之Bugku 秋名山老司机+python脚本代码解析

热门文章

  1. 影视剪辑,什么是蒙太奇,蒙太奇的含义
  2. 【2020年天梯赛—校内选拔赛】7-4手机话费
  3. 859-细谈安全的 HTTPS 协议
  4. Centos7制作Openstack下win7 镜像
  5. 怎么做能打印发票的软件?
  6. 20 个 JavaScript 单行代码杀手锏
  7. 湖北大学知行学院考研计算机,湖北大学知行学院考研怎么样
  8. Android AccountManager 账户同步管理简单介绍
  9. 数据通信系统的性能指标
  10. [深度学习] OpenVINO开发:Win 10 安装及卸载