【密码学】面向小白的古典密码基础入门笔记
目录
Mindmap
前言
破译方法
三类古典密码
替换密码
分类
单表替换密码
凯撒密码
简单替换密码
仿射密码
普莱费尔密码
培根密码
猪圈密码
摩斯密码
多表替换密码
维吉尼亚密码
移位密码
滚筒密码
栅栏密码
Mindmap
前言
1.所有古典密码都已不安全
2.密钥空间应该尽量大
3.密文应该扰乱统计规律
4.效率和安全是矛盾的
破译方法
1.穷举法:尝试所有密钥
2.分析法:确定性分析(数学公式);统计分析
三类古典密码
古典密码学中的替换密码,移位密码和机械密码是三种基本的加密技术,它们在实现原理和加密方法上有所不同:
-
替换密码:
- 定义:替换密码是一种通过将明文中的每个字符替换为另一个字符或符号来进行加密的技术。
- 特点:最简单的替换密码是凯撒密码,其中明文字母按照一个固定的偏移量进行替换。其他替换密码可能使用更复杂的置换表,例如维吉尼亚密码就是使用多个凯撒密码表组成的多表替换密码。
-
移位密码:
- 定义:移位密码是一种替换密码的特例,其中每个明文字符按照固定的偏移量(位移)来替换。也称为凯撒密码。
- 特点:凯撒密码中,明文的每个字母按照一个固定的偏移量向右(或向左)移动,例如偏移量为3的凯撒密码将'A'替换为'D','B'替换为'E',以此类推。移位密码属于替换密码的一种简单形式,易于实现,但安全性较低。
-
机械密码:
- 定义:机械密码是使用机械装置(通常是基于物理结构的装置)来实现加密和解密的密码系统。
- 特点:机械密码通常涉及转轮、齿轮或其他物理结构,这些结构可以根据密钥或密码来调整,从而实现字符的替换或转换。最著名的例子是恩尼格玛机(Enigma machine),它在二战期间被纳粹德国用作加密通信的工具。
总结:
- 替换密码是通过替换明文中的字符来实现加密,可以是简单的移位替换,也可以是更复杂的多表替换。
- 移位密码是替换密码的一种特例,其中每个字符按照一个固定的位移量进行替换。
- 机械密码利用物理结构实现加密,通常比纯文本替换更复杂,提供了更高的加密强度和安全性。
替换密码
分类
-
单表替换密码:
- 定义:单表替换密码是指通过一个固定的替换表(例如字母表的置换表)来加密明文。最著名的例子是凯撒密码,其中字母表中的每个字母都按照一个固定的偏移量进行替换。
- 特点:单表替换密码的加密过程是简单的替换操作,每个明文字符(或者字符块)都对应一个唯一的密文字符(或者字符块)。这种方法容易实现和理解,但由于固定的替换表,安全性较低,容易受到频率分析等攻击。
-
多表替换密码:
- 定义:多表替换密码是一种使用多个替换表(也称为秘钥表)的加密技术。加密时,根据密钥中的某种规则(如轮换、随机选择等),选择合适的替换表进行加密。
- 特点:多表替换密码提高了安全性,因为不同的明文字符(或者字符块)可以映射到不同的密文字符(或者字符块),且同一个明文在不同的加密情况下可能对应不同的密文。这种方法可以抵抗频率分析等简单攻击,但仍然可能受到更复杂的密码分析攻击。
单表替换密码
凯撒密码
这是一种替换加密技术,其中每个字母在字母表中移动固定数目的位置。例如,如果我们设定移动3个位置,那么'A'会变成'D','B'会变成'E',依此类推。一个例子是,加密“HELLO”时,每个字母都移动3个位置,结果是“KHOOR”。
简单替换密码
在这种加密方法中,字母表中的每个字母都被系统地替换为另一个字母。例如,我们可以决定将'A'替换为'D','B'替换为'E',等等,但替换是随机的,不像凯撒密码那样规律。例如,用一种特定替换规则加密“SIMPLE”可能得到“JKBCDE”。
仿射密码
这是一种使用数学函数的替换密码,具体公式为 (E(x) = (ax + b) \mod m),其中(m)是字母表中的字符数量,(a)和(b)是密钥,且(a)和(m)必须互质。例如,假设(a=5),(b=8),加密字母‘A’(设‘A’为0)的结果是(E(0) = (5*0 + 8) \mod 26 = 8),所以‘A’被加密为‘I’。
加密公式
给定明文 ( x )(其中 ( x ) 是字母在字母表中的位置,从 0 开始计算),加密函数 ( E ) 可表示为: [ E(x) = (ax + b) \mod m ] 这里的 ( m ) 是字母表中字母的总数(通常是 26),( a ) 和 ( b ) 是密钥,其中 ( a ) 必须和 ( m ) 互质(即 ( a ) 和 ( m ) 的最大公约数为 1,保证 ( a ) 在模 ( m ) 下有逆元)。
解密公式
解密是加密的逆过程。设密文 ( y ) 是通过上述加密公式得到的,解密函数 ( D ) 可表示为: [ D(y) = a^{-1}(y - b) \mod m ] 这里的 ( a^{-1} ) 是 ( a ) 在模 ( m ) 下的乘法逆元,意味着 ( a \cdot a^{-1} \equiv 1 \mod m )。计算 ( a^{-1} ) 通常可以通过扩展欧几里得算法来实现。
示例
假设我们使用 ( m = 26 ),( a = 5 ),( b = 8 ),并且要加密字母 ‘A’(记为 ( x = 0 )):
加密过程: [ E(0) = (5 \times 0 + 8) \mod 26 = 8 ] 所以 ‘A’ 加密后变成位置为 8 的字母,即 ‘I’。
解密过程: 首先,我们需要找到 5 的逆元。假设找到 ( 5^{-1} = 21 ),那么: [ D(8) = 21 \times (8 - 8) \mod 26 = 0 ] 因此,位置 8 的字母(即 ‘I’)解密后变回 ‘A’。
仿射密码的安全性在于选择合适的 ( a ) 和 ( b ),以及保持这些值的秘密。但在现代密码学中,由于其线性特性和限定的密钥空间,它被认为是较弱的加密方法。
普莱费尔密码
普莱费尔密码(Playfair Cipher)是一种使用5x5矩阵对成对字母进行加密的经典替换密码系统。它在19世纪由查尔斯·惠斯通发明,并以其朋友查尔斯·普莱费尔的名字命名。这种密码比单一替换密码更为复杂,因为它加密的是字母对,而不是单个字母。以下是普莱费尔密码的基本加密规则:
-
准备密钥方阵:首先选择一个密钥词(通常去除重复字母),将其字母按顺序填入5x5的方阵中,剩余的格子按字母表顺序填充,未使用的字母继续填充,通常将字母“I”和“J”视为相同,以适应25个格子。
-
准备明文:将明文分为字母对,如果有一个字母单独存在,则添加一个额外的字母(如'X'或'Q')使其成对。如果一对字母相同,则插入一个填充字母如'X',例如“HELLO”变为“HE LX LO”。
-
加密规则:对每对字母应用以下规则:
- 如果字母对在同一行:对每个字母,用其右侧的字母替换(如果是行尾,则换到行首)。
- 如果字母对在同一列:对每个字母,用其下方的字母替换(如果是列底,则换到列顶)。
- 如果字母对在不同行不同列:字母对在方阵中形成一个矩形,用同行对角的字母进行替换,即保持行不变,交换列。
培根密码
这种密码将每个字母编码为一系列的'A'和'B'。例如,'A'可以编码为“AAAAA”,'B'为“AAAAB”,等等。密文通常看起来是无意义的,但通过特定的编码规则可以解码出原文。
猪圈密码
这种加密方法使用一系列的符号来代表字母,通常是在两个或三个不同的圆形图案中画分割线来表示。每个符号代表一个特定的字母,根据符号的形状和位置确定。
摩斯密码
这是一种早期的电报代码,使用短信号(点)和长信号(划)以及间隔来表示字母、数字和标点符号。例如,“SOS”在摩斯密码中表示为“··· --- ···”。
多表替换密码
维吉尼亚密码
维吉尼亚密码可以通过一个方便的密码表来实现加密和解密过程,这种表也被称为“维吉尼亚方阵”。这个方阵包含了26行26列的字母,每一行字母都向左或向右移动一位,从而形成了一个完整的字母表的移位序列。
维吉尼亚方阵的构建
密码表的每一行都是从前一行的最后一个字母开始,继续按照字母顺序排列。例如:
- 第一行从 A 开始,依次排列到 Z。
- 第二行从 B 开始,依次排列到 A。
- 第三行从 C 开始,依次排列到 B。 依此类推,直到整个表格完成。
加密过程
使用维吉尼亚密码表进行加密时:
- 确定密钥:选择一个密钥。
- 重复密钥:将密钥重复至与明文长度相同。
- 使用密码表:找到明文中每个字符在表的顶部的列,密钥中对应字符在表的左侧的行。在行列交叉点的字母即为加密后的字符。
解密过程
解密与加密相反:
- 找到密文中的每个字符在表中的列。
- 找到密钥对应字符在表的左侧的行。
- 在该行中找到密文字符,然后跟随这一列向上直到表格的顶端,顶端的字母是明文中对应的字符。
这个方法使得加密和解密过程非常直观,并且易于通过手工或使用简单程序来实现。通过使用密码表,维吉尼亚密码的实现可以更为清晰且容易操作。
移位密码
滚筒密码
滚筒密码是古希腊时期的斯巴达人使用的一种加密技术。这种方法涉及到一块长条的皮革或羊皮纸和一个木制的滚筒。加密过程如下:
- 绑定:将长条的纸或皮革绕在滚筒上。
- 书写:在纸条上沿着滚筒的长度方向书写信息。
- 解开:当纸条从滚筒上解开后,原来的信息会被打乱,因为原文是沿着滚筒的轴向书写的。
- 传递和解读:纸条被送到接收者那里,接收者需要一个直径相同的滚筒才能重新绕上去,从而阅读信息。
滚筒密码的安全性依赖于滚筒的直径和用于绑定的材料的宽度。只有当拥有正确直径的滚筒时,接收者才能正确地解读信息。
栅栏密码
栅栏密码是一种简单的置换密码,用于通过重新排列字母的顺序来加密文本。它的基本操作如下:
- 写法:将文本字符顺序写入分成几行的“栅栏”结构中。例如,如果我们选择两行栅栏,第一个字母放在第一行,第二个字母放在第二行,第三个字母再回到第一行,依此类推。
- 读取:加密时按行读取字符。首先读取第一行的所有字符,然后读取第二行的所有字符,如果有更多行也按此方法继续。
- 解密:接收者按相同的行数重建栅栏结构,然后按写入时的Z字形或N字形路径重新填写并读取字符。
栅栏密码的安全性取决于栅栏的行数(也就是深度)。行数越多,密码通常越难破解,但同时解密也需要更精确的行数信息。
相关文章:

【密码学】面向小白的古典密码基础入门笔记
目录 Mindmap 前言 破译方法 三类古典密码 替换密码 分类 单表替换密码 凯撒密码 简单替换密码 仿射密码 普莱费尔密码 培根密码 猪圈密码 摩斯密码 多表替换密码 维吉尼亚密码 移位密码 滚筒密码 栅栏密码 Mindmap 前言 1.所有古典密码都已不安全 2.密…...

【Qt】之【Bug】大量出现“未定义的标识符”问题
背景 构建时出现大量错误 原因 中文注释问题 解决 方法1. 报错代码附近的中文注释全部删掉。。。 方法2. 报错的文件添加 // Chinese word comment solution #pragma execution_character_set("utf-8")...

C++中的常成员函数
2024年6月29日,周日下午 例如,以下是一个常成员函数的示例: class MyClass { public:int getValue() const {return value;} private:int value; };常成员函数是C中一种特殊的成员函数,它具有以下特点: 不可修改对象…...

小试牛刀-区块链代币锁仓(Web页面)
Welcome to Code Blocks blog 本篇文章主要介绍了 [区跨链代币锁仓(Web页面)] ❤博主广交技术好友,喜欢我的文章的可以关注一下❤ 目录 1.编写目的 2.开发环境 3.实现功能 4.代码实现 4.1 必要文件 4.1.1 ABI Json文件(LockerContractABI.json) 4.2 代码详解…...

Geoserver源码解读五 Catalog
系列文章目录 Geoserver源码解读一 环境搭建 Geoserver源码解读二 主入口 Geoserver源码解读三 GeoServerBasePage Geoserver源码解读四 REST服务 Geoserver源码解读五 Catalog 目录 系列文章目录 前言 一、定义 二、前置知识点 1.Spring 的 Bean 生命周期 ApplicationCon…...

安全与加密常识(5)自签名证书
文章目录 什么是自签名证书?自签名证书有什么优势?自签名证书有什么缺陷?企业可以使用自签名证书吗?如何创建自签名证书?前面我们介绍了什么是证书签名请求:证书签名请求(Certificate Signing Request,CSR)是一种数据文件,通常由申请者生成,并用于向证书颁发机构(C…...

Java官网网址及其重要资源
Java是一种广泛应用于开发各种应用程序的编程语言,它具有跨平台、面向对象和高性能等优势。若你想学习Java或深入了解它的最新动态,Java官网是你的首要目的地。在本文中,我们将向你介绍Java官网的网址以及一些重要资源。 Java官网网址&#x…...

Linux--start-stop-daemon
参考:start-stop-daemon(8) - Linux manual page 1、名称 start-stop-daemon:启动和停止系统守护程序。 2、简介 start-stop-daemon [option...] command 3、描述 start-stop-daemon用于控制系统级进程的创建和终止。使用其中一个匹配选项࿰…...

优化Java中XML和JSON序列化
优化Java中XML和JSON序列化 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java应用程序中,对于XML和JSON的序列化操作是非常常见的需求。本文将…...

像学Excel 一样学 Pandas系列-创建数据分析维度
嗨,小伙伴们。又到喜闻乐见的Python 数据分析王牌库 Pandas 的学习时间。按照数据分析处理过程,这次轮到了新增维度的部分了。 老样子,我们先来回忆一下,一个完整数据分析的过程,包含哪些部分内容。 其中,…...

Rust 基础教程
Rust 编程语言教程 Rust是一门注重安全、并发和性能的系统编程语言。本文将从Rust的基本语法、常用功能到高级特性,详细介绍Rust的使用方法。 目录 简介环境配置基础语法 变量和常量数据类型函数控制流 所有权和借用 所有权借用 结构体和枚举 结构体枚举 模块和包…...

Study--Oracle-06-Oracler网络管理
一、ORACLE的监听管理 1、ORACLE网络监听配置文件 cd /u01/app/oracle/product/12.2.0/db_1/network/admin 2、在Oracle数据库中,监听器(Listener)是一个独立的进程,它监听数据库服务器上的特定端口上的网络连接请求,…...

uniapp零基础入门Vue3组合式API语法版本开发咸虾米壁纸项目实战
嗨,大家好,我是爱搞知识的咸虾米。 今天给大家带来的是零基础入门uniapp,课程采用的是最新的Vue3组合式API版本,22年发布的uniappVue2版本获得了官方推荐,有很多同学等着我这个vue3版本的那,如果没有学过vu…...

数字信号处理教程(2)——时域离散信号与时域离散系统
上回书说到数字信号处理中基本的一个通用模型框架图。今天咱们继续,可以说今天要讲的东西必须是学习数字信号处理必备的观念——模拟与数字,连续和离散。 时域离散序列 由于数字信号基本都来自模拟信号,所以先来谈谈模拟信号。模拟信号就是…...

imx6ull/linux应用编程学习(8)PWM应用编程(基于正点)
1.应用层如何操控PWM: 与 LED 设备一样, PWM 同样也是通过 sysfs 方式进行操控,进入到/sys/class/pwm 目录下 这里列举出了 8 个以 pwmchipX(X 表示数字 0~7)命名的文件夹,这八个文件夹其实就对应了…...

等保2.0 实施方案
一、引言 随着信息技术的广泛应用,网络安全问题日益突出,为确保信息系统安全、稳定、可靠运行,保障国家安全、公共利益和个人信息安全,根据《网络安全法》及《信息安全技术 网络安全等级保护基本要求》(等保2.0&#x…...

7/3 第六周 数据库的高级查询
...

ubuntu20.04安装kazam桌面屏幕录制工具
在Ubuntu 20.04上安装Kazam可以通过以下步骤进行: 1.打开终端:可以通过按下Ctrl Alt T组合键来打开终端。 2.添加PPA源:Kazam不再在官方Ubuntu仓库中,但可以通过PPA源进行安装。在终端中输入以下命令来添加PPA: su…...

Python应对反爬虫的策略
Python应对反爬虫的策略 概述User-Agent 伪造应对302重定向IP限制与代理使用Cookies和Session管理动态内容加载数据加密与混淆请求频率限制爬虫检测算法法律与道德考量结语 概述 在数字化时代,网络数据采集已成为获取信息的重要手段之一。然而,随着技术…...

240703_昇思学习打卡-Day15-K近邻算法实现红酒聚类
KNN(K近邻)算法实现红酒聚类 K近邻算法,是有监督学习中的分类算法,可以用于分类和回归,本篇主要讲解其在分类上的用途。 文章目录 KNN(K近邻)算法实现红酒聚类算法原理数据下载数据读取与处理模型构建--计算距离模型预测 算法原理 KNN算法虽…...

keil5模拟 仿真 报错没有读写权限
debug*** error 65: access violation at 0x4002100C : no write permission 修改为: Dialog DLL默认是DCM3.DLL Parameter默认是-pCM3 应改为 Dialog DLL默认是DARMSTM.DLL Parameter默认是-pSTM32F103VE...

力扣爆刷第158天之TOP100五连刷56-60(子集、最小栈、最长有效括号)
力扣爆刷第158天之TOP100五连刷56-60(子集、最小栈、最长有效括号) 文章目录 力扣爆刷第158天之TOP100五连刷56-60(子集、最小栈、最长有效括号)一、78. 子集二、105. 从前序与中序遍历序列构造二叉树三、43. 字符串相乘四、155. …...

高薪程序员必修课-Java中 Synchronized锁的升级过程
目录 前言 锁的升级过程 1. 偏向锁(Biased Locking) 原理: 示例: 2. 轻量级锁(Lightweight Locking) 原理: 示例: 3. 重量级锁(Heavyweight Locking)…...

Vue项目打包上线
Nginx 是一个高性能的开源HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它在设计上旨在处理高并发的请求,是一个轻量级、高效能的Web服务器和反向代理服务器,广泛用于提供静态资源、负载均衡、反向代理等功能。 1、下载nginx 2、…...

算法题中常用的C++功能
文章目录 集合优先队列双端队列排序时自定义比较函数最大数值字符串追加:删除:子串: 元组vector查找创建和初始化赋值: 字典map引入头文件定义和初始化插入元素访问元素更新元素删除元素检查元素存在遍历元素int和string转换 集合…...

左扰动和右扰动
在SLAM(Simultaneous Localization and Mapping)中,使用左扰动还是右扰动主要取决于你如何定义坐标系和你希望扰动影响的姿态表示。这通常与你的坐标系选择和你正在解决的具体问题有关。 左扰动通常用于以下情况: 当你使用局部坐…...

【计算机网络】期末复习(2)
目录 第一章:概述 第二章:物理层 第三章:数据链路层 第四章:网络层 第五章:传输层 第一章:概述 三大类网络 (1)电信网络 (2)有线电视网络 ࿰…...

ojdbc8-full Oracle JDBC 驱动程序的一个完整发行版各文件的功能
文章目录 1. ojdbc8.jar2. ons.jar -3. oraclepki.jar -4. orai18n.jar -5. osdt_cert.jar -6. osdt_core.jar -7. ojdbc.policy -8. README.txt -9. simplefan.jar -10. ucp.jar -11. xdb.jar - ojdbc8-full 是 Oracle JDBC 驱动程序的一个完整发行版,包含了连接和…...

在Linux环境下使用sqlite3时,如果尝试对一个空表进行操作(例如插入数据),可能会遇到表被锁定的问题。
在Linux环境下使用sqlite3时,如果尝试对一个空表进行操作(例如插入数据),可能会遇到表被锁定的问题。这通常是因为sqlite3在默认情况下会对空表进行“延迟创建”,即在实际需要写入数据之前,表不会被真正创建…...

【目标检测】DINO
一、引言 论文: DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 作者: IDEA 代码: DINO 注意: 该算法是在Deformable DETR、DAB-DETR、DN-DETR基础上的改进,在学习该算法前&#…...