密码学—Vigenere加密Python程序

news2024/11/24 4:29:04

文章目录

  • 维吉尼亚加密
    • 加密算法
    • 解密算法
  • 注意事项

维吉尼亚加密

古典密码,属于多表加密。

  • 怎么就是多表了?
    维吉尼亚密码的加密算法实质是凯撒密码,因为他是先分好小组,然后用密钥串对应着分好组的每一个字母进行加密(因为一个凯撒表用密钥串的一个字母加密),当然是遵循下标相同的,比如秘钥为:abc,明文为qwer,然后明文可分组为qwe, r
    然后加密就是不断迭代密钥和明文组,q对应密钥a,然后w对应密钥b,然后明文e对应密钥c,然后第一组遍历完了继续第二组,r对应密钥a,然后加密完成。注意这里即使不够分组也是照样加密,每组加密完成后密钥从头开始遍历 在这里插入图片描述

  • 属于分组加密算法
    按照密钥长度进行分组,但是每组字母都不是来自连续的明文或者密文
    我们在分组之前要按照每一个密钥长度为一组,然后每一组的第一个为密钥第一个字母所加密,也就是凯撒加密。
    如图:
    密钥采用五个的字母: JANET
    很明显就是将给出的信息,首先按照原来的顺序按照密钥长度5个分开,然后再根据每一个组的相同下标的字母给与之对应下标的密钥字母进行凯撒加密,比如每一小组的第一个组成的凯撒加密表就是用J加密的,因为秘钥中的第一个字母就是J,然后我们要在分好的小组里面全部的小组第一个都用J加密

    在这里插入图片描述
    在这里插入图片描述

  • 密钥是一串字母
    加密要将密钥转换为数字,因此就变成了每一组由密钥中每一个字母进行加密,所以就变成了多个凯撒密码加密,由此得来多表加密。
    就好比分好组排好队之后每一个表去密钥串中领取自己对应组好的密钥(组号就是密钥的下标,每一个秘钥字母对应一个凯撒加密表)

加密算法

  • 在这里采用查表的方式加密,事先生成一个26×26的凯撒的加密表,如图。
    声明:其实这里可以采用传统的凯撒加密方式就是一个一个的移动,我这里之所以采用查表的方式首先是因为书本是这么写的,老师是这么教的,为何要查表我的理解是因为维吉尼亚加密算法是用于文本加密,字母很多的那种,如果我们采用一个个移动的话速度会大大减慢,但是我们事先有了这么一个二维表只需要使用下标即可,而且这个表设计的非常巧妙,无论你纵横怎么看都可以进行加密,因为我们凯撒是明文+密钥,所以比如这里的我们看横排a,然后用纵排的c加密,那么我得到的就是c,你也可以只用使用(a,c)进行查表。(同理解密表也用这个)
    在这里插入图片描述
    • 生成加解密表
      • 这里的np是要下载numpy包
    def generate_Dit():
        p = 26
        # 生成Vigenere表
        Cipher_list = []
        for row in range(p):
            for column in range(p):
                Cipher_list.append((row + column) % p)
    
        Cipher_list = np.asarray(Cipher_list)  # 转为矩阵
          # reshape成26*26矩阵,也即Vigenere表
        Cipher_list = Cipher_list.reshape(p, p)
        return Cipher_list  # 返回Vigenere表
    
    • 开始加密
      • 分组打包
      • 加密的时候采用二层循环进行加密
        因为已经分好组了,只需要将每组分别取出,然后采用对应下标与密钥进行对应的凯撒加密即可(这里需要注意的是,我是采用了分好组的下标,所以我只需要取出每组然后再对每组进行循环,而第二层循环的下标我直接给到Key使用,这样保证了不会因为不够一组的数量而导致下标越界,毕竟我遍历的是分好的组,取出该组长度进行遍历,作为key下标,而不是遍历key,因为有的人会采用遍历key的方式给每一个明文加密,我这里用了自己的方法),拿到了密钥与密文就直接到26×26中查表即可,这个表已经写好了一个函数,直接调用即可。
    def enCode():
    	saveMess = []
    	key = 'cipher' #密钥
        n = len(key)
        tempch = [''] * n #用来开辟空间,然后转储给其他变量
        count = 0 #计数器,防止分组出现不够然后需要将最后剩余的一并添加进去
        for ch in mess:
            if ord('A') <= ord(ch) <= ord('Z') \
            or ord('a') <= ord(ch) <= ord('z'):  
            # 确保了只能是字母才能添加进去
                tempch[count % n] = ch  
                # count计数器,但是为了与分组数一致要%每组字母数
                count += 1
                if count % n == 0 and count != 0:
                    saveMess.append(tempch[0:n + 1])  # 使用切片进行
                    tempch = [''] * n
        if count % n != 0:  # 将最后剩下的也打包成一组
            saveMess.append(tempch[0:(count % n)])  
            # 使用切片将最后一部分单开成一组出来添加
    
       
        print(saveMess)
    
        # 加密
        for ch in saveMess:
            for index in range(len(ch)):  # 每一组单独加密
                k = ord(key[index].upper()) - ord('A')  
                # 每一个密钥都对应一个ch明文字母
                s = ord(ch[index].upper()) - ord('A')
                self.cipher.append(Cipher_list[k, s])
    
        # 输出
        for num in self.cipher:
            ch = chr(num + ord('A'))
            self.message += ch
    

解密算法

解密没什么好说的,会了加密解密就是减法的过程,因为维吉尼亚就是查表加密的凯撒密码

  • 分组打包
  • 对应密钥解密
def deCode()
	 # 分组打包
      saveCipher = []
      key = 'cipher' #密钥
      n = len(key)
      tempch = [''] * n
      count = 0
      for ch in cipher:
          if ord('A') <= ord(ch) <= ord('Z') \
          or ord('a') <= ord(ch) <= ord('z'):  
          # 确保了只能是字母才能添加进去
              tempch[count % n] = ch  
              # count计数器,但是为了与分组数一致要%每组字母数
              count += 1
              if count % n == 0 and count != 0:
                  saveCipher.append(tempch[0:n + 1])  # 使用切片进行
                  tempch = [''] * n
      if count % n != 0:  # 将最后剩下的也打包成一组
          saveCipher.append(tempch[0:(count % n)])  
          # 使用切片将最后一部分单开成一组出来添加

      # 解码
      deCipher = []
      for ch in saveCipher:
          for index in range(len(ch)):  # 每一组单独解密
              # 行不用找,密钥对应每一行,应该在每一行中找对应密文的列,该列就是明文对应的字母数字
              for column in range(p):  # 找列
                  if ord(ch[index].upper()) - ord('A') \
                  == Cipher_list[(ord(key[index].upper())\
                   - ord('A')), column]:
                      # print(ch[index].upper(),'key,列:',ord(key[index].upper()) - ord('A'),column)
                      deCipher.append(column)
                      break  
                      # 找到了就退出,继续下一下解密字母而不是再继续next密钥,因为一个密钥对应一个字母
                      
      # 输出
      message  = ''
      for num in deCipher:
          ch = chr(num + ord('A'))
          message += ch
      print(message)

注意事项

维吉尼亚加密中比较容易犯错的就是没有将明文按照密钥长度进行分小组,然后用key对应着小组的下标进行加密(所以是多表加密,每一个表就是凯撒密码)

这里我开始有一个误解,就是以为他分好小组之后还需要将其分成每一个组大组然后给每一个密钥的字母进行对应加密,这里我有点过度理解了。到后面真正实现加密解密的时候发现我这里根本就是多此一举,因为我们分号小组之后不可以打乱原本明文或者密文的排序,这里根据密钥长度分小组的意思就是方便我们使用密钥对小组每个字母对应着密钥字母来加密,不然我们也不会说按照密钥长度来分组 ,之后的操作就是双层遍历分好组的列表,然后用每个小组的下标给到对应的秘钥取出来,然后就加密对应的字母即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用纯CSS和DIV绘制播放按钮样式

最近在做前端的视屏监控播放对接&#xff0c;前端弄了个播放按钮&#xff0c;记录下&#xff0c;效果如图所示&#xff1a; HTML代码&#xff1a; <div className"box"><div className"one" ><div className"two"><div cl…

1.1、Java初级认识Java、jdk、 idea

前言 1.1 软件开发之 Java 开发 Java现在已经占有主流市场 企业级应用领域&#xff08;JavaEE 后台&#xff09;&#xff1a;用来开发企业级的应用程序&#xff0c;大型网站如淘宝、京 东、12306&#xff0c;以及各大物流、银行、金融、社交、医疗、交通、各种 OA 系统等都…

Centos7下root安装Elasticsearchhe和IK分词器

安装Elasticsearchhe和IK分词器 1. 安装前准备 安装Elasticsearch之前&#xff0c;需要安装Java8或Java8以上的Java环境&#xff0c;linux安装jdk百度一下。 2. 下载Elasticsearchhe 创建安装目录 mkdir -p /usr/local/elasticsearch如果主机联网,可以选择在线下载&#…

Matlab可调用MODTRAN5封装器之Mod5

目录 Mod5介绍安装Mod5Mod5文件位置注意事项 运行Mod5创建实例设置MODTRAN参数运行MODTRAN结果绘制示例图 Mod5介绍 MODTRAN 是一个计算地球大气中电磁辐射传输的软件代码。MODTRAN是通过使用具有严格格式的输入文本文件来控制的。这个文件被称为“tape5”&#xff0c;扩展名为…

华硕ROG幻14 2023原装Windows11系统工厂模式带ASUS RECOVERY功能恢复

第一步&#xff1a;下载原装系统文件&#xff08;工厂包&#xff09; 第二步&#xff1a;华硕天选冰刃魔霸枪神灵耀等 需要自备16g空u盘安装 第三步&#xff1a;创建u盘分区&#xff0c;第一个分区格式为FAT32(存放TLK引导文件)&#xff0c;第二个分区大小为NTFS&#xff08…

利用Jetpack Compose进行导航(Navigation)

引言 Jetpack Compose是一个现代化的&#xff0c;声明式的UI工具包&#xff0c;它让我们可以更快、更简便地构建Android的界面。今天&#xff0c;我们要讨论如何使用Jetpack Compose和它的导航库&#xff08;Navigation Compose&#xff09;来进行应用导航。 初步了解Navigati…

单片机学习 15-ds1302时钟实验

DS1302 时钟实验 ​ 在前面章节&#xff0c;我们介绍了如何使用单片机 IO 口模拟 IIC 总线、单总线时序。这一章我们来学习 DS1302 时钟芯片&#xff0c;该芯片是 3 线 SPI 接口&#xff0c;所以需要使用 51单片机的 3 个 IO 口模拟 SPI 时序与 DS1302 时钟芯片通信&#xff0…

maven打包本地jar到项目中

在maven项目中&#xff0c;我们的项目依赖一般取自local的repository或者远程的repository&#xff0c;比如下面这个配置&#xff1a; maven <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> &l…

蓝桥杯专题-试题版-【矩阵乘法】【连号区间数】【闰年判断】【时间转换】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

爱普生L3515打印不出东西,打印后机器工作进纸后出来空白纸张

环境&#xff1a; 爱普生L3515彩色喷墨打印机 问题描述&#xff1a; 爱普生L3515突然打印不出东西&#xff0c;打印后机器工作进纸&#xff0c;出来空白纸张 解决方案&#xff1a; 1.检查是否没有墨水了&#xff0c;开始以为没了&#xff0c;加了满了 2.测试打印机还是打不…

【AUTOSAR】BMS开发实际项目讲解(十五)----电池管理系统架构与系统组件定义

系统架构 /System Architecture 系统结构框图 / System Structure Diagram 系统安全架构图 系统组件定义 / System Components Definition 系统组件定义表 组件需求定义/system components requirement definition系统组件需求定义表 ID 名称 ASIL 描述 SPFM LFM PMHF …

将英文版的Visual Studio 2019 切换为简体中文显示

一、需求说明 在使用Visual Studio 2019集成IDE环境下进行开发工作时;需要将IDE的环境修改为中文环境进行开发工作,中文界面对于不太熟悉Visual Studio 2019 环境的人来说是十分友好的。 二、需求分析 目前安装的Visual Studio 2019集成IDE环境是全英文的界面,需要切换为简…

hash冲突是什么?

哈希&#xff08;散列&#xff09;原理及使用 哈希&#xff08;散列&#xff09;原理及避免哈希冲突 哈希&#xff08;散列&#xff09;原理及使用哈希冲突常见哈希函数解决哈希冲突方案实现一个开散列哈希表 当我们在一堆数据中查找一个元素时&#xff0c;使用普通方法得到的时…

ChatGPT: 交互式AI助手为互联网用户带来全新体验

目录 概述&#xff1a; 优势&#xff1a; 挑战&#xff1a; 未来发展方向&#xff1a; 概述&#xff1a; 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正以惊人的速度改变着我们的生活方式和体验方式。AI 的应用范围越来越广泛&#xff0c;从语音助手到…

Linux 内存详解,即top、free、vmstat、meminfo、Buffer和Cache的介绍

Linux 内存详解&#xff0c;即top、free、vmstat、meminfo、Buffer和Cache的介绍_用作内核缓存的内存量_zzhongcy的博客-CSDN博客 1、top linux下的任务管理器 top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Win…

C#项目练习系列--1.倒计时器

C#项目练习系列--1.倒计时器 实操感想代码 实操 总体实现功能&#xff1a;选定计时时间—点击开始计时—进度条和剩余时间显示—提示时间到。 软件版本&#xff1a;VS2019 1.新建工程 选择c#&#xff0c;windows窗体应用&#xff0c;.NET Framework版本选择4或4以下时最后…

SpringBoot+WebSocket+Session共享

前言 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端 一、为什么需要WebSocket HTTP 是基于请求响应式的&#xff0c;即通信只能由客户端发起&#xff0c;服务端做出响应&#xff0c;无状态&…

Spring Boot 中的 PropertySource 是什么,原理,如何使用

Spring Boot 中的 PropertySource 是什么&#xff0c;原理&#xff0c;如何使用 介绍 在 Spring Boot 中&#xff0c;PropertySource 是一个非常重要的概念。它允许您在应用程序中定义属性&#xff0c;并将这些属性注入到 Spring 环境中。在本文中&#xff0c;我们将介绍 Spr…

GO富集绘图绘制方法,零基础教程,替换数据直接作图,完成版R语言脚本

速绘 丨 GO富集气泡图 本期分享一个快速绘制GO富集结果图的方法&#xff0c;主要使用R语言tidyverse包&#xff0c;只需导入数据即可一步出图&#xff0c;可以自定义显示的数目、颜色、筛选参数&#xff0c;从此以后绘制GO富集图只需1秒。 前言介绍 下面是一个GO富集分析的结果…

Python 控制 AWG70001

0. 实验准备 泰克 AWG70001 一台电脑 一根网线 使用网线连接 AWG70001 和电脑&#xff0c;并且配置 IP 在同一网段下 1. 环境要求 vxi11 numpy struct matplotlib 没有的库可以使用下面的命令安装 pip install vxi11 pip install numpy pip install struct pip install matp…