理论——加密法

news2024/11/16 17:58:15

前言

写C++写多了,给大伙换换口味,这篇文章将会给大家带来几种加密法,以后写情书有素材了吧?还不快谢谢我~

正文

凯撒加密法

简介

在密码学中,恺撒密码是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。 恺撒密码通常被作为其他更复杂的加密方法中的一个步骤。恺撒密码还在现代的ROT13系统中被应用。但是和所有的利用字母表进行替换的加密技术一样,恺撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。

加密方式

很明显,这种密码的密度是很低的,只需简单地统计字频就可以破译。于是人们在单一恺撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。它是由16世纪法国亨利三世王朝的布莱瑟·维吉尼亚发明的,其特点是将26个恺撒密表合成一个,见下表:

原: 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

A :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

B :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 A

C: C D E F G H I J K L M N O P Q R S T U V W X Y Z A B

D: D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

以下如此类推。

维吉尼亚密码引入了“秘钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:

TO BE OR NOT TO BE THAT IS THE QUESTION

当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:

密钥:RELAT IONSR ELATI ONSRE LATIO NSREL

明文:TOBEO RNOTT OBETH ATIST HEQUE STION

密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY

维吉尼亚加密法

简介

维吉尼亚密码(又称维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。

维吉尼亚密码曾多次被发明。该方法最早记录在吉奥万·巴蒂斯塔·贝拉索( Giovan Battista Bellaso)于1553年所著的书《吉奥万·巴蒂斯塔·贝拉索先生的密码》(意大利语:La cifra del. Sig. Giovan Battista Bellaso)中。然而,后来在19世纪时被误传为是法国外交官布莱斯·德·维吉尼亚(Blaise De Vigenère)所创造,因此现在被称为“维吉尼亚密码”。

维吉尼亚密码以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”(法语:le chiffre indéchiffrable)。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。

密码破译

对包括维吉尼亚密码在内的所有多表密码的破译都是以字母频率为基础的,但直接的频率分析却并不适用。例如,如果P是密文中出现次数最多的字母,则P很有可能对应E(前提是明文的语言为英语)。原因在于E是英语中使用频率最高的字母。然而,由于在维吉尼亚密码中,E可以被加密成不同的密文,因而简单的频率分析在这里并没有用。

破译维吉尼亚密码的关键在于它的密钥是循环重复的。如果我们知道了密钥的长度,那密文就可以被看作是交织在一起的凯撒密码,而其中每一个都可以单独破解。使用卡西斯基试验和弗里德曼试验来得到密钥的长度。

卡西斯基试验

弗里德里希·卡西斯基于1863年首先发表了完整的维吉尼亚密码的破译方法,称为卡西斯基试验(Kasiski examination)。早先的一些破译都是基于对于明文的认识、或者使用可识别的词语作为密钥。而卡西斯基的方法则没有这些限制。然而,在此之前,已经有人意识到了这一方法。1854年,查尔斯·巴贝奇受到斯维提斯(John Hall Brock Thwaites)在《艺术协会杂志》(Journal of the Society of the Arts)上声称发明了“新密码”的激励,从而破译了维吉尼亚密码。巴贝奇发现斯维提斯的密码只不过是维吉尼亚密码的一个变种而已,而斯维提斯则向其挑战,让他尝试破译用两个不同长度的密钥加密的密文。巴贝奇成功地进行了破译,得到的明文是丁尼生所写的诗《罪恶的想象》(The Vision of Sin),使用的密钥则是丁尼生妻子的名字Emily(艾米莉)。巴贝奇从未对他的方法进行过解释 。在对巴贝奇生前笔记的研究中发现,早在1846年巴贝奇就使用了这一方法,与后来卡西斯基发表的方法相同。

卡西斯基试验是基于类似the这样的常用单词有可能被同样的密钥字母进行加密,从而在密文中重复出现。例如,明文中不同的CRYPTO可能被密钥ABCDEF加密成不同的密文:

密钥:ABCDEF AB CDEFA BCD EFABCDEFABCD

明文:CRYPTO IS SHORT FOR CRYPTOGRAPHY

密文:CSASXT IT UKSWT GQU GWYQVRKWAQJB

此时明文中重复的元素在密文中并不重复。然而,如果密钥相同的话,结果可能便为(使用密钥ABCD):

密钥:ABCDAB CD ABCDA BCD ABCDABCDABCD

明文:CRYPTO IS SHORT FOR CRYPTOGRAPHY

密文:CSASTP KV SIQUT GQU CSASTPIUAQJB

此时卡西斯基试验就能产生效果。对于更长的段落此方法更为有效,因为通常密文中重复的片段会更多。如通过下面的密文就能破译出密钥的长度:

密文:DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD

其中,两个DYDUXRMH的出现相隔了18个字母。因此,可以假定密钥的长度是18的约数,即长度为18、9、6、3或2。而两个NQD则相距20个字母,意味着密钥长度应为20、10、5、4或2。取两者的交集,则可以基本确定密钥长度为2。

弗里德曼试验

弗里德曼试验由威廉·F·弗里德曼(William F. Friedman)于1920年代发明。他使用了重合指数(index of coincidence)来描述密文字母频率的不匀性,从而破译密码。

指目标语言中两个任意字母相同的概率(英文中为0.067),

指字母表中这种情况出现的概率(英文中为1/26=0.0385),从而密钥长度可以估计为:

其中,观察概率为:

其中,c是指字母表的长度(英文为26),N指文本的长度,n1到nc是指密文的字母频率,为整数。

此方法只是一种估计,会随着文本长度的增加而更为精确。在实践中,会尝试接近此估计的多个密钥长度。一种更好的方法是将密文写成矩阵形式,其中列数与假定的密钥长度一致,将每一列的重合指数单独计算,并求得平均重合指数。对于所有可能的密钥长度,平均重合指数最高的最有可能是真正的密钥长度。这样的试验可以作为卡西斯基试验的补充。 [3]

频率分析

一旦能够确定密钥的长度,密文就能重新写成多列,列数与密钥长度对应。这样每一列其实就是一个凯撒密码,而此密码的密钥(偏移量)则对应于维吉尼亚密码密钥的相应字母。与破译凯撒密码类似的方法,就能将密文破译。

柯克霍夫方法作为卡西斯基试验的改进,由奥古斯特·柯克霍夫(Auguste Kerckhoffs)提出。它将每一列的字母频率与转换后的明文频率相对应而得出每一列的密钥字母。一旦密钥中每一个字母都能确定,就能很简单地破译密文,从而得到明文。如果维吉尼亚字母表表格本身是杂乱而非按通常字母表顺序的话,那柯克霍夫方法就会无效,但卡西斯基试验和重复指数对于决定密钥长度仍旧是有效的。

总结

这两个加密法其实并不难,如果想看看自己掌握没就去看看《怪诞小镇》吧~

记得三连

参考:维吉尼亚密码_百度百科 (baidu.com)

参考:凯撒加密法_百度百科 (baidu.com)

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

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

相关文章

因果推断6--多任务学习(个人笔记)

目录 1多任务学习 1.1问题描述 1.2数据集 1.3网络结构 1.4结果 2因果推断使用多任务方式 2.1DRNet 2.2Dragonet 2.3Deep counterfactual networks with propensity-dropout 2.4VCNet 3思考 1多任务学习 keras-mmoe/census_income_demo.py at master drawbridge/ke…

一种穷人式的内存泄露检测方式

对于检测程序代码中的资源泄露问题,市面上已经有很多工具了,但是今天我再来介绍一种新的方式,这种方式不需要安装任何工具或者特定的编译器开关,也不需要第三方库。 那就是:一直保持程序运行,直到泄露的原因…

【牛客网】HJ99 自守数、OR86 返回小于 N 的质数个数

作者:一个喜欢猫咪的的程序员 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 HJ99 自守数 OR86 返回小于 N 的质数个数 HJ99 自守数 自守数_牛客…

Linux系统之安装Linux管理工具inpanel

Linux系统之安装Linux管理工具inpanel一、inpanel介绍1.inpanel简介2.inpanel特点二、检查本地系统环境1.检查系统版本2.检查系统内核版本三、下载inpanel软件包1.创建下载目录2.下载inpanel软件3.查看源码inpanel文件四、部署inpanel应用1.一键安装inpanel2.查看服务端口五、关…

【双U-Net残差网络:超分】

Dual U-Net residual networks for cardiac magnetic resonance images super-resolution (心脏磁共振图像超分辨率的双U-Net残差网络) 目前,心脏磁共振(CMR)成像能够提供心脏全方位的结构和功能信息,已成…

难道你也不能放烟花嘛?那就来看看这个吧!

又到了一年一度的春节时期啦!昨天呢是北方的小年,今天是南方的小年,看到大家可以愉快的放烟花,过大年很是羡慕呀!辞旧岁,贺新春,今年我呀要放烟花,过春节!🧨。…

农产品商城简单demo-Android

项目概述 随着科学技术的不断提高和社会经济的不断发展,一些农产品的销售逐渐的落后于社会信息化的潮流之中,尤其是一些年龄较大的中老年人来说是极为不便的,国家大力倡导并十分重视三农问题,倡导推动农村农业的发展,为…

第二章 搜索求解

人工智能中的搜索&#xff1a; 搜索算法的形式化描述&#xff1a;<状态、动作、状态转移、路径、测试目标> 状态&#xff1a;从原问题转化出的问题描述。 动作&#xff1a;从当前时刻所处状态转移到下一时刻所处状态。 状态转移&#xff1a;对某一时刻对应状态进行某一…

泛型的学习

这里写目录标题一、泛型的使用自定义泛型类泛型方法说明泛型在继承方面的体现通配符的使用有限制条件的通配符的的使用每日一考一、泛型的使用 1、jdk5.0新增特性 2、在集合中使用泛型 ①集合接口或集合类在jdk5.0时都修改为带泛型的结构 ②实例化集合时&#xff0c;可以指明具…

是Spring啊!

一.概念spring概念一个包含了众多工具方法的 IoC 容器okk~~分析一下这句话意思,众多方法,IoC 是形容词,容器是名词 -> 众多方法:比如一个类里有许多方法, 容器:存储的东西 重点就是IoC是什么?Ioc2.1解释IoC -> Inversion of Control 控制反转 -> 对象的生命周期 ->…

Git版本控制工具详解

1、版本控制 1.1、认识版本控制&#xff08;版本控制&#xff09; 什么是版本控制&#xff1f; 版本控制的英文是Version control&#xff1b;是维护工程蓝图的标准作法&#xff0c;能追踪工程蓝图从诞生一直到定案的过程&#xff1b;版本控制也是一种软件工程技巧&#xff…

红米 12C earth 秒解锁 跳过168小时 红米note12 note12pro note12pro+系列机型解锁bl root教程步骤Fastboot

最近上手体验了Redmi 12C/红米12C&#xff0c;这是红米新推出的百元机&#xff0c;起售价699元&#xff0c;464G版本&#xff0c;具有不错的性能&#xff0c;具有5000mAh大电池&#xff0c;具有双频wifi&#xff0c;支持双卡双待&#xff0c;支持SD卡扩展等。 如果你近期想要给…

UTF-8和Unicode

文章目录Unicode与网络传输Unicode网络传输UTF&#xff1a;Unicode Transformation Format UTF-8是在网络上传输Unicode的一个转换标准&#xff0c;发送时将字符串Unicode转为UTF-8&#xff0c;接收时将字节转为Unicode&#xff0c;就完成来字符串的传输 Unicode与网络传输 U…

移动端 - 搜索组件(search-list篇)

移动端 - 搜索组件(search-input篇) 移动端 - 搜索组件(suggest篇) 这里我们需要去封装搜索历史组件 这一个组件还是很简单的, 但是逻辑部分需要根据实际的需求来进行书写; 所以这里我不太好去写实际的代码, 不过可以提供我的思路(主要的就是去实现增, 删, 改, 查) 第一步: 首…

【STL】string的常见接口使用

目录 1、string类的基础概念 2、string类的常见接口说明及应用 2.1、string类的成员函数 constructor&#xff08;构造函数&#xff09; destructor&#xff08;析构函数&#xff09; operator&#xff08;赋值&#xff09; string类对象的容量操作 迭代器 string类…

【vue2】组件基础与组件传值(父子组件传值)

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;组件基础概念与全局|局部组件的写法、组件之间传值&#xff08;父传子、子传父&#xff…

rcfile和orcfile

一、数据存储要考虑哪些方面 数据加载时间 Facebook数仓每天存储的数据量超过20TB&#xff0c;数据加载既有磁盘I/O又有网络传输&#xff0c;时间占用大 快速的数据查询 低的空间占用 数据压缩/数据编码 适合多种查询模式 如果所有人都查相同的字段&#xff0c;那么就可以针…

QT添加使用图片与UI资源

QT添加使用图片与UI资源1 QT添加使用图片资源1.1 添加新文件1.2 添加QT - QT Resources File 【UI资源文件】1.3 命名资源包名称 并 添加到项目文件1.4 .pro 文件发生变化 art.qrc1.5 点击qrc文件&#xff0c;添加现有文件 - 添加进去的图片文件可以进行正常引用。1.6 修改样式…

分布式任务处理xxljob

7.1 分布式任务处理 7.1.1 什么是分布式任务调度 视频上传成功需要对视频的格式进行处理&#xff0c;如何用Java程序对视频进行处理呢&#xff1f;这里有一个关键的需求就是当视频比较多的时候我们如何可以高效处理。 如何去高效处理一批任务呢&#xff1f; 1、多线程 多线…

通过Docker启动DB2,并在Spring Boot整合DB2

1 简介 DB2是IBM的一款优秀的关系型数据库&#xff0c;简单学习一下。 2 Docker安装DB2 为了快速启动&#xff0c;直接使用Docker来安装DB2。先下载镜像如下&#xff1a; docker pull ibmcom/db2:11.5.0.0 启动数据库如下&#xff1a; docker run -itd \--name mydb2 \--…