首页 > 编程语言 >密码学:凯撒密码(移位密码)原理、加密与解密(Python代码示例)

密码学:凯撒密码(移位密码)原理、加密与解密(Python代码示例)

时间:2023-06-23 10:57:49浏览次数:46  
标签:shifted ciphertext 加密 示例 shift char 密码 密文 密码学

原理

凯撒密码(移位密码):是一种替换加密,明文中的所有字母都在字母表上向后或向前按照一个固定数目进行偏移后被替换成密文。

例如,偏移量为3位的时候:A对应D,B对应E,C对应F等

当偏移量为13位的时候,凯撒密码又叫回转密码ROT13):明文加密得到密文,密文再加密就会得到明文(因为偏移量为13位,一共26个字母,加密两次就会回到明文了),在CTF中题目关键字眼会有回转、回旋、十三踢等字眼。

题目:阿哒,看我回旋十三踢!
密文:Nusynt
明文:AHflag

加密

def caesar_cipher(plaintext, shift):
    ciphertext = ""
    for char in plaintext:
        if char.isalpha():
            # 将字母转换为0-25之间的数字,a为0,b为1,依此类推
            char_num = ord(char.lower()) - ord('a')
            # 将数字加上偏移量,并对26取模
            shifted_num = (char_num + shift) % 26
            # 将数字转换回字母
            shifted_char = chr(shifted_num + ord('a'))
            # 如果原来的字母是大写,就将加密后的字母也变成大写
            if char.isupper():
                shifted_char = shifted_char.upper()
            ciphertext += shifted_char
        else:
            # 如果不是字母,就不进行加密
            ciphertext += char
    return ciphertext

# 获取用户输入的明文和偏移量
plaintext = input("请输入明文:")
shift = int(input("请输入偏移量:"))

# 调用函数进行加密
ciphertext = caesar_cipher(plaintext, shift)

# 输出加密后的密文
print("加密后的密文为:", ciphertext)

解密(枚举法)

def caesar_cipher_decrypt(ciphertext, max_shift):
    """
    用凯撒密码解密密文,展示所有可能的解密结果

    参数:
    ciphertext -- 密文字符串
    max_shift -- 最大位移量

    返回值:
    无返回值,直接打印所有解密结果
    """
    for shift in range(max_shift + 1):
        plaintext = ""
        for char in ciphertext:
            if char.isalpha():
                # 将字母转换为0-25之间的数字,a为0,b为1,依此类推
                char_num = ord(char.lower()) - ord('a')
                # 将数字加上偏移量,并对26取模
                shifted_num = (char_num - shift) % 26
                # 将数字转换回字母
                shifted_char = chr(shifted_num + ord('a'))
                # 如果原来的字母是大写,就将加密后的字母也变成大写
                if char.isupper():
                    shifted_char = shifted_char.upper()
                plaintext += shifted_char
            else:
                # 如果不是字母,就不进行解密
                plaintext += char
        # 打印解密结果
        print(f"Shift = {shift}: {plaintext}")

ciphertext = input("请输入密文:")
max_shift = 25
caesar_cipher_decrypt(ciphertext, max_shift)

标签:shifted,ciphertext,加密,示例,shift,char,密码,密文,密码学
From: https://www.cnblogs.com/stonechen/p/caesar_cipher.html

相关文章

  • 前端Vue自定义支付密码输入键盘Keyboard和支付设置输入框Input
    前端Vue自定义支付密码输入键盘Keyboard和支付设置输入框Input,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13166效果图如下:cc-defineKeyboard使用方法<!--ref:唯一ref passwrdType:密码样式paykeyInfo:密码输入监测事件--><cc-def......
  • 宝塔面板 mongodb设置账号,密码,数据库,并配置远程连接
    宝塔面板安装 mongo4.0后需要设置账号密码可数据库才能使用安装后 authorization:disabled  默认配置时才可以使用这个功能,如果没有admin需要先手动创建一个admin库,然后在创建一个  yourdatabaseSSH终端1、进入mongodb安装目录,下面是宝塔面板的默认目录cd/www/......
  • 关于使用rsync命令小技巧-交互式输入密码后-再置于后台运行的方法
    在linux系统中,rsync命令常用于在两台linux主机之间同步数据rsync关于认证可以同ssh的用户密码认证一样,我们执行rsync命令后,会要求输入认证的密码,但很多时候数据特别大时,我们是希望执行过程放在后台运行笔者尝试,在执行rsync命令,如 rsync-az/aa/bb/cc/--exclude"dir01/"--ex......
  • 使用 Vim 给文件设置密码保护
    Vim 是一种流行的、功能丰富的和高度可扩展的 Linux文本编辑器,它的一个特殊功能便是支持用带密码各种的加密方法来加密文本文件。本文中,我们将向你介绍一种简单的Vim使用技巧:在 Linux 中使用Vim对文件进行密码保护。我们将向你展示如何让一个文件在它创建的时侯以及为了修......
  • 人工智能在智能家居控制器中的应用,打造智慧家居控制器的100篇热门博客文章标题示例
    目录引言随着人工智能技术的不断发展,智能家居控制器作为人工智能在家居领域的一个重要应用,其重要性日益凸显。智能家居控制器不仅可以实现智能化的家居控制,还可以提高家居安全性、便利性和舒适性。本文将介绍人工智能在智能家居控制器中的应用,以及打造智慧家居控制器的100篇热......
  • gitlab忘记root密码解决方法
    #切换到git用户[root@gitlab_3_45~]#su-git#查看gitlab-rails的目录-sh-4.2$ls-lgitlab-railstotal40drwx------2gitroot4096Feb252020etc-rw-r--r--1rootroot8Feb252020REVISION-rw-r--r--1rootroot58Feb252020RUB......
  • mysql 密码插件 validate_password
    MySQL密码增强插件2016-07-0110:02pursuer.chen阅读(668)评论(0)编辑[收藏](javascript:void(0))介绍以前没有太注意MySQL密码安全策略的配置方法,只是人为了将密码设为复杂密码,但是没有找到配置的方法,今天姜承尧的微信公众号正好发布了一篇关于这个的文章,所以在这里也顺......
  • Subversion 1.8.9 ( SVN Client ) 安装最新版本的svn客户端 - svn 账户 密码
    http://www.fulingjiang.cn/linux/62.htmlForCentOS7Users: 1.[WandiscoSVN]2.name=WandiscoSVNRepo3.baseurl=http://opensource.wandisco.com/centos/5/svn-1.8/RPMS/$basearch/4.enabled=15.gpgcheck=06.yumcleanall7.......
  • 修改复制用户密码
    修改复制用户密码在备库查询当前配置的主库密码select*frommysql.slave_master_info\[email protected]:(none)>select*frommysql.slave_master_info\G***************************1.row***************************Number_of_lines:25Master_lo......
  • 从linux免密码ssh登录到另外一个计算机
    一、从本地Linux做如下操作:  其中192.168.xx.xxx是远端的被登录的计算机1.进入.ssh目录: cd~/.ssh2.生成一对密钥: ssh-keygen-trsa3.发送公钥:    ssh-copy-id192.168.xx.xxx4.免密登录测试: ssh 192.168.xx.xxx 二、windows免密等Linux......