凯撒密码来源

古典密码,且属于单表加密
凯撒密码又称恺撒变换、变换加密,凯撒是当时罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。(当然只限于26个字母的加密解密)
我觉得叫带有’变换’俩字的好,因为这个算法就是将信息移动替换的过程。

加密算法

  • 凯撒密码是对单个字母加密,因此加密的时候会采用循环加密

  • 解释
    将26个字母按照横排顺序排好,然后密钥就是将26个字母向右移动的位数,这里的移动位数遵循模运算,比如原本的26个字母表中z右移一位就变成了a,原本的26个字母表中a左移一位就变成了z。
    算法就是加上加密算法和一些自己定义的细节比如全部大写或者全部小写,追求精益求精的还可以记住用户输入的内容的大小写然后根据他的内容进行加密。
    下面的代码就是不管用户是否大小写,最后出来的结果我全部转为大写了。

  • 最主要的步骤还是将其移动后的字母的数字要模26,因为凯撒的明文空间就是26个,密文空间也是26个。所以key即使你写得再大,最后在加密步骤中模26后仍旧回到26个信息空间。
    下面代码最重要一步就是 (ord(ch.upper()) - ord(‘A’) + int(key)) % p
    先让字母转为凯撒明文空间中的对应数字,然后再加上密钥移动位数再模26.

# 加密
message=input('请输入加密内容')
p = 26
key = input('请输入密钥')
# 首先将所有信息转化为大写字母, 非字母的不进入存储
for ch in message:
# 这里的\单纯只是将代码换行,因为太长了
if ord('A') <= ord(ch) <= ord('Z') \
or ord('a') <= ord(ch) <= ord('z'):
temp_num = (ord(ch.upper()) - ord('A') + int(key)) % p
cipher.append(temp_num) #首先打印其Cipher数字
print(cipher) #将其ASCII数字转化为大写字母
message=''
for i in cipher: # 将列表转化为字符串输出
message += chr(i + ord('A')) #打印输出密文
print(message)

解密算法

  • 解释
    与加密算法反过来,转为对应凯撒明文空间中对应的数字之后用密钥数字将其左移回去再模26,在模运算的世界里不用担心出现负数,因为负数最后模出来的还在模数的范围内。
  • 注意:解密密钥必须和加密密钥相同,或者你的密钥模26后是与原密钥相同(因为模运算世界中只要超过模数的就能将其模回来对应的数字,所以即使你数字给的再大不过也是你模数的空间内)
cipher=input('请输入明文')
p = 26
key = input('请输入密钥') #密钥必须与你加密的密钥相同
# 解码
p = 26
#存放解密密文的数字
deCipher = []
for ch in cipher:
if ord('A') <= ord(ch) <= ord('Z') or ord('a') <= ord(ch) <= ord('z'):
temp = (ord(ch.upper()) - int(key) - ord('A')) % p
deCipher.append(temp) # 输出
message = ''
for i in deCipher:
message += chr(i + ord('A')) #转为ASCII输出
#输出明文
print(message)

密码学—凯撒密码Python程序的更多相关文章

  1. Python的一个解释凯撒密码的程序

    #!/usr/bin/env python # -*- coding: utf-8 -*- ''' { Title:CaserCode Author:naiquan Type:crypto Detai ...

  2. Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作

    # -*- coding: gb2312 -*- #用户名密码登录系统(MD5加密并存入文件)及对字符串进行凯撒密码加解密操作 #作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.co ...

  3. 凯撒密码移位python

    #!/usr/bin/python'''凯撒密码'''a="gmbhqwertghjkcvbzn"s=[""]*len(a)for j in range(26) ...

  4. Python凯撒密码和括号匹配

    1.凯撒密码: 除了特殊字符不转化,其余的按照规定经行转译,以下以a~z和A~Z的字符都进行转译. plaincode = input("")print(len(plaincode ...

  5. Python凯撒密码加解密

    #凯撒密码第一个版本 #加密 pxpt=input("请输入明文文本:") for p in pxpt: if 'a'<=p<='z': print(chr(ord(' ...

  6. JAVA第一次实验 ——凯撒密码的实现

    JAVA实验一   编写程序实现凯撒密码 201352330 潘俊洋 一.实验说明 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加 ...

  7. java:凯撒密码及String的应用

    一,凯撒密码 古罗马皇帝凯撒在打仗时曾使用过以下方法加密军事情报 现在用java实现 程序设计思想: 1,字符串首先要转化为字符数组,才能依次加密 2,当原来的字符为X,Y,Z时,加密后要转化为A,B ...

  8. 凯撒密码加密解密--JAVA实现(基础)

    凯撒密码一种代换密码,据说凯撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码.凯撒密码的基本思想是:通过把字母移动一定的位数来实现加密和解密.明文中的所有字母都在字母表上向后(或向前) ...

  9. JAVA第一次实验 ——凯撒密码

    课程:Java程序设计 班级:1352 姓名:黄伟业 学号:20135215 成绩:            指导教师:娄嘉鹏  实验日期:2015.4.15 实验密级: 预习程度:  实验时间:19: ...

  10. 凯撒密码(Caesar cipher) 详解

    ------------恢复内容开始------------ 最近训练CTF的时候,发现密码学这块的知识不太系统,所以自己接下来会陆陆续续整理出来 就先从古典密码中的凯撒密码说起吧 凯撒密码内容比较简 ...

随机推荐

  1. #平衡树#洛谷 2611 [ZJOI2012]小蓝的好友

    题目 在 \(R\times C\) 的矩形中,问有多少个子矩形使得存在一个给定点在其中, 保证点随机,\(R,C\leq 4\times 10^4,n\leq 10^5\) 分析 考虑容斥,用总方案 ...

  2. #树形dp#洛谷 3687 [ZJOI2017]仙人掌

    题目 给定一个简单无向连通图,问有多少种加边方案使得这个图变成简单仙人掌. 分析 首先找到一棵生成树,考虑其它非树边所对应的树的路径上的边最多只能用一次, 这可以用树上差分做,如果一个点到其父节点的边 ...

  3. 实战:如何优雅的从 Skywalking 切换到 OpenTelemetry

    背景 最近公司将我们之前使用的链路工具切换为了 OpenTelemetry. 我们的技术栈是: OTLP Client──────────►Collect────────►StartRocks (Ag ...

  4. 分析即服务(AaaS)是什么?终于有人讲清楚了

    随着世界数据领域的地位和规模的不断扩大,大数据.人工智能和云计算正在结合起来,以分析即服务的形式为企业提供急需的喘息机会 . 让我们简要回顾一下 2010 年以来发生的事情. 这十年来我们见证了许多技 ...

  5. redis 简单整理——内存的管理[二十六]

    前言 redis 是一个内存型数据库,那么就需要重点关注一下内存了. 正文 理解Redis内存,首先需要掌握Redis内存消耗在哪些方面.有些内存消 耗是必不可少的,而有些可以通过参数调整和合理使用来 ...

  6. VulnHub-ical打靶记录

    这绝对是最简单的一个题目了. 目标发现 netdiscover -r 192.168.0.10/24 根据靶场和本地系统的网段进行扫描. 信息收集 nmap -sV -Pn -sT -sC -A 19 ...

  7. MMDeploy部署实战系列【第四章】:onnx,tensorrt模型推理

    MMDeploy部署实战系列[第四章]:onnx,tensorrt模型推理 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善.如果有那个地方没看懂,评论区问就可以,我给补充. 目录: 0️⃣ ...

  8. React中受控组件和非受控组件

    一.受控组件 受控组件,简单来讲,就是受我们控制的组件,组件的状态全程响应外部数据 举个简单的例子: class TestComponent extends React.Component { con ...

  9. js判断元素内文字是否超出元素宽度,溢出隐藏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 力扣485(java)-最大连续数1的个数(简单)

    题目: 给定一个二进制数组, 计算其中最大连续 1 的个数. 示例: 输入:[1,1,0,1,1,1]输出:3解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 提示: 输入 ...