现代密码学
概论
-
计算机安全的最核心三个关键目标(指标)/为:保密性 Confidentiality、完整性 Integrity、可用性 Availability ,三者称为 CIA三元组
- 数据保密性:确保隐私或是秘密信息不向非授权者泄漏,也不被非授权者使用(获取到明文)
-
OSI安全架构关注安全攻击、安全服务和安全机制。
- 安全攻击:任何危及信息系统安全的活动
- 被动攻击试图获取或利用系统的信息,但不影响系统资源。如信息内容的泄漏和流量分析
- 被动攻击不涉及对数据的修改,因此很难检测。通常采用加密的方式来阻止被动攻击。即重点是预防而非检测。
- 主动攻击则试图改变系统资源或影响系统运行。主动攻击分为:伪装、重放、消息修改和拒绝服务。
- 伪装:指某实体假装为其他实体。伪装攻击还包含其他形式的主动攻击。例如,截获认证信息,在认证信息完成合法验证以后进行重放。无权限的实体就可以通过冒充有权限的实体获得额外的权限。
- 重放:指攻击者未经授权将截获的信息再次重放。
- 消息修改:指未经授权地修改合法消息的一部分,或延时消息的传输,或改变消息的顺序。
- 拒绝服务
- 被动攻击试图获取或利用系统的信息,但不影响系统资源。如信息内容的泄漏和流量分析
- 安全服务:加强信息安全性的一种处理过程或通信服务。其目的是使用安全机制进行反攻击。
- 安全机制:用来检测、阻止攻击,或者从攻击状态恢复到正常状态的机制
- 安全攻击:任何危及信息系统安全的活动
-
攻击面是由系统中一系列可访问且可利用的漏洞组成。主要分为:
- 网络攻击面:指的是企业网络、广域网或是互联网。包含协议的漏洞及拒绝服务供给、终端通信链路等。
- 软件攻击面:设计应用程序、工具包或操作系统漏洞。
- 人类攻击面:主要是系统人员或是外部人员造成的漏洞。
-
攻击树是采分支化、层次化表示利用安全漏洞的可能技术集合的一种数据结构。
- 根节点:攻击目的。第二层是攻击的目标,再往下则是攻击的方式等。
- 深度越深则越具体。因此叶节点是具体的攻击方式。
网络安全模型需要考虑
- 设计安全的相关变换算法
- 产生算法所需的秘密信息(密钥)
- 设计分发、共享秘密信息的方案
- 指定协议,该协议利用安全变换和秘密信息实现安全服务
传统加密技术
密码编码学
密码编码学具备以下三个独立特征:
- 转换明文为密文的运算类型:代换和置换
- 代换是将明文中的元素映射成另个元素;置换是将明文中的元素重新排列。这些运算都要求不能信息丢失、即所有运算是可逆的。
- 密钥:发送方和接收方使用相同密钥,称为对称密码否则,称为非对称密码。
- 处理明文的方法:分组处理或流式处理
密码分析:密码分析的目标是获取密钥,而非恢复出单个密文对应的明文。
- 穷举法
Shannon:一个好的密码系统应具备抵抗统计分析的两个特性:
- 扩散性(diffusion):在同一密钥下
- 相似的明文,密文差别较大;
- 相似的密文,明文差别较大。
- 扩散性可以隐藏明文和密文之间的关系,阻止对手通过统计密文找到明文
- 混淆性(confusion):在同一明文下:
- 相似的密钥,密文差别较大;
- 相似的密文,密钥差别较大。
- 混淆性隐藏密文和密钥之间的关系,阻止对手通过统计密文来找到密钥
Substitution 代换技术 Caesar
思路:
- 元素表:以 26个字母为元素表,做循环排列,形如:abcd…xy zabcdef…
- 密码表:与明文表相对而言。所有明文经过变换得到的密文的合集,就是密码表。
- 间隔:可以自定义间隔,间隔指示应当向向后找多少位的字母代替当前字母。间隔不同,密码表就不同。
例如,假设间隔为 3,则 A B C 应分别代换为 D E F
完整的代换表为:
Caesar密码的三个重要特征使我们可以采用穷举攻击分析方法:
- 已知加密和解密算法
- 需测试的密钥只有25个
- 明文所用的语言是已知的,且其意义易于识别
DEMO
解密以下 caesar密码:
EHVWWLPHRIRIWKHKHBHBDULVLVVVSUSULQJZKHQIQRORZHUHVUVEOEORRRP对这个密文尝试所有位移值,直到看到可理解的文本。为节省时间,我可以快速编写代码来完成这个过程。通过暴力破解密文,我们发现位移值为 3 时(向前),密文解密后的结果为:
BEST TIME OF THE YEAR IS SPRING WHEN FLOWERS BLOOM.
代换技术之单表代换
首先必须区分单表代换与 caesar密码的区别。
caesar密码中,所有明文–>密文必须遵循相同的间隔。即,若 A 对应 D,则能推断出 B 一定对应 E。这样,密码表只有 26张。
单表代换中,所有明文 --> 密文不遵循相同的间隔。即,若 A 对应 D,B 可能对应 A/B/C/E/F…任意一个,只有确保一一对应的关系,明文与密文可以以一种杂乱的关系确定下来。这样,密码表有 26!张。大大增加了复杂性。
但代换技术的弱点没有解决:
- 因为单字母替代不会改变字母的频率,所以原始文字的统计特征几乎被完整保留下来。
- 有两种主要方法可以减少代换密码里明文结构在密文中的残留度:
- 对明文中的多个字母一起加密;
- 采用多表代换
Playfair
Playfair密码将明文中的双字母组合作为一个单元对待,并将这些单元转换为密文的双字母组合。
编制密码表(矩阵)
PlayFair 中,密码表即按照指定密钥字母串构造出来的矩阵。
- 准备一个密钥字母串,一个 5X5 的矩阵。
- 将密钥字母串去重,得到顺序集合 A;
- 将 26字母表去重集合 A,得到顺序集合 B;
- I 和 J 被算为一个字母;
- 从左到右,从上到下,将顺序集合 A 填充到该矩阵,然后再将顺序集合B 填充到该矩阵。
整理明文表
- 将明文表字母两两分组,一组即为一对。
- 分割后,任一对明文字母如果是重复的,则在这对明文字母之间插入一个填充字符,如 X。
- 分割且填充后,任一对明文字母若在矩阵的同一行中出现(不需要相邻),那么分别用矩阵中其右侧的字母代替,行的最后一个字母由行的第一个字母代替。例如:ar 加密为 RM,ek 加密为 FE
- 分割且填充后,任一对明文字母若在矩阵的同一列中出现(不需要相邻),那么分别用矩阵中其下方的字母代替,列的最后一个字母由行的第一个字母代替。例如:hs 加密为 BP,ea 加密为 IM/JM
- 否则,任一对明文字母中的每一个字母将由与其同行,且与另一个字母同列的字母代替。例如:hs 加密为 BP,ea 加密为 IM/JM。(即按照矩形规则替换为隔壁角)
DEMO
使用的密钥词是 monarchy,将 ballon 加密。
- 去重得到的顺序集合A 为 【m,o,n,a,r,c,h,y】
- 将 26字母表去重集合 A,得到顺序集合 B【b,d,e,f,g,i,j,k,l,p,q,s,t,u,v,w,x,z】
- 将 I 和 J 视为一个字母,并将顺序集合A、B 填充,可得:
- 欲加密的明文是 balloon。则两两分组为:balloon --> ba ll oo n --> ba lx lo on
- ba 在同一列中出现,替换成 ib;lx 不同行不同列,按照矩形规则,替换为 su;lo 不同行不同列,按照矩形规则替换为 pm;on 在同一行中出现,替换为 na。
- 最终得到密文 ibsupmna。
代换技术之多表代换(Vigennere)
- 多表代换的代换表有多个。加密时交替使用不同的代换表。但注意,加密和解密要同步,也就是,加密和解密所用的代换表顺序要一致,不然解密会出错。
- 多表代换跟单表代换相比,其主要优点是,多表代换增大了密钥空间,更彻底地打破整体上的统计特性。
- Vigenere 实质上就是扩展的 Caesar加密。Vigenere 的代换表有多张,且每张使用不同的间隔k,在加密时,交替使用不同的代换表进行代换。
多表代换 DEMO
假设明文表为{1,2,3,4}
代换表1 为{1:2,2:4,3:3,4:1};
代换表2 为{1:4,2:1,3:2,4:3}。
代换表1 和代换表2 交替使用。
现在加密明文 123112:
Vigenere DEMO
Vigenere 中,密码表也是按照指定密钥字母串构造出来的矩阵。
- 构造一个 26X26 矩阵,第一行内容为【a,b…z】,第二行内容为第一行内容循环右移一位即【b,c…a】,以此类推。
- 选定任意密钥字母串
- 将欲加密明文与密钥字母串比对,当密钥比明文短时,重复密钥至与明文等长;
- 加密过程基于明文字符和密钥字符在密码表中的位置关系。明文字符决定行:在密码表中找到以明文字符开头的行;密钥字符决定列:在密码表中找到以密钥字符为列头的列。交点字符即为密文字母。
取密钥为 :deceptive
欲加密明文为:wearediscoveredsaveyourself
扩展密钥成为:deceptivedeceptivedeceptive
则明文字符 w 对应的密文为:Z(坐标为 (w,d))
整体密文为:ZICVTWONGRZGVTWAVZHCOYGLMGI
多表代换之轮转机(Enigma)
- 发信人首先要调节三个转子的方向,使它们处于 17576个方向中的一个(事实上转子的初始方向就是密匙,这是收发双方必须预先约定好的),然后依次键入明文,并把闪亮的字母依次记下来,然后就可以把加密后的消息用电报的方式发送出去。
单表代换之仿射加密 Affine Cipher
- 仿射加密的字母系統中所有字母都藉一簡單數學方程加密,對應至數值,或轉回字母。 所有字母皆藉由方程 (ax + b)mod m加密。其中:
对于加密
- 每个字母都被映射到一个数字上(通常是 A = 0, B = 1, …, Z = 25),然后通过仿射变换函数 (ax + b)mod m进行加密得到数字串后,再转回字母即可。
- a 和 b 为密钥;
- x 为明文字符对应的数字
- m 为字母个数,一般为 26;
- a 和 m 必须互质,由于 m 一般为 26,则 a 可选值为 1、3、5、7、9、11、15、17、19、21、23、25。(a > 26 会导致重复计算,没有意义)
- 当 a 为 1 时,仿射变换实质就是 Caesar密码。
对于解密
- 每个字母都被映射到一个数字上(通常是 A = 0, B = 1, …, Z = 25),然后通过仿射变换解密函数
进行解密得到数字串后,再转回字母即可。- 其中,a^(-1)是 a 的乘法逆元,将其设为 x,则
- 其中,a^(-1)是 a 的乘法逆元,将其设为 x,则
例如,对于 3 的乘法逆元,即求一个数 x,使得 3x mod 26 = 1 成立,可知 x = 9。
其本质就是穷举,但是更具体来说,可以有一种思路:既然要求 mod 的结果为 1。则等式左边结果恒比等式右边的可能倍数大 1。
等式右边可能的取值为 26,52,78,104,130…
则等式右边只能从 27,53,105,131… 中取得,进而可以快速匹配
DEMO
明文为:HELLO
参数:a = 5, b = 8, m = 26,则仿射变换函数为 (5x + 8)mod 26
对于加密过程
对于 H,加密过程为(5 X 7 + 8)mod 26 = 43 mod 26 = 17 -> R
以此类推,得到密文为 RCLLA。
对于解密过程
- 5 的乘法逆元满足 5x mod 26 = 1,则 5 的乘法逆元为 21。则解密的变换函数为 21·(x - 8)mod 26
- 对于密文字符 R,解密过程为:21·(17 - 8)mod 26 = 189 mod 26 = 7 ->H
以此类推,得到明文为HELLO
证明加密函数等于解密函数
代换之 Hill密码
-
Hill密码是一种基于矩阵运算的多字母替换密码,它是第一个用到代数方法的加密算法,主要用矩阵和向量的乘法来实现加解密。
-
Hill密码能抵抗唯密文攻击,但不能抵抗已知明文攻击,事实上,只要知道 n块相互独立的明文串及相对的密文,就可以确定密钥 K。
-
加密公式为C = (K·P) mod m,其中:
- P:明文的向量形式,即一组字母转化为数字的形式(如 A = 0, B = 1, …, Z = 25,则[a,b,c,d] 转化为[0,1,2,3])。
• K:密钥,是一个 n x n 方阵(必须可逆)。
• C:密文向量,计算得到的加密结果。
• m:字母表大小(通常 m = 26)。
- P:明文的向量形式,即一组字母转化为数字的形式(如 A = 0, B = 1, …, Z = 25,则[a,b,c,d] 转化为[0,1,2,3])。
加密过程为:
- 选定方阵的行列均为 n,然后将明文串每 n个分一组,最后一组不足 n个则补 X,这样就得到了若干组 n x 1向量。
- 将分组中的字母映射为数字;
- 将每组明文向量 P 与密钥矩阵 K 相乘得到:C = (K·P) mod 26 ,每次运算得到一个 n x 1的密文向量Q,将其转化回字母即可得到密文。
解密过程为:
- 将密文串每 n个分一组,最后一组不足 n个则补 X,这样就得到了若干组 n x 1向量。
- 将分组中的字母映射为数字;
- 根据已知的密钥矩阵K,求其逆矩阵设为 K‘
- 将每组密文向量Q 与密钥矩阵K‘ 相乘得到:C = (K’·Q) mod 26 ,每次运算得到一个 n x 1的明文向量P,将其转化回字母即可得到明文。
求逆矩阵
Hill加密的逆矩阵是在模运算基础上的逆矩阵,因此求其逆矩阵时,需时刻计算模
DEMO 之求加解密过程
DEMO 之已知明密对、n,求加密矩阵
给定一下信息,求解 Hill加密矩阵
• 分组长度 n = 2
• 明文(明文对):“howareyoutoday”
• 密文(密文对):“zwseniuspljveu”
将明文和密文按照分组长度 n = 2 分成对应的列向量,就得到了明文和密文的矩阵。
代换之一次一密
- 使用与消息一样长且无重复的随机密钥来加密消息
- 每个密钥都是一次性的,加密后就不再使用。
- 在理论上它是不可攻破的。它产生的随机输出与明文没有任何统计关系。因为密文不包含明文的任何信息。
代换技术之破解方法
最常用的是统计方法。
在英语中,用的最多的单个字母依次是 e,t,o,a,h,I;最少的是 z,j。
最常用的双字母组依次是 th,in,er,re,an;
最常用的三字母组是 the,ing,and,ion。
分组密码
- 在分组密码中,大小为 n 的一组明文符号被一起进行加密,创建出相同大小的一组密文。
- 在分组密码中,即使密钥是由多个值构成的,但仍看成单密钥,整个分组都由它进行加密。
- playfair密码是分组密码,组的大小是n=2两个字符一起加密。
- Hill密码是分组密码,用单密钥(一个矩阵)进行整体加密。虽然密钥由 n x n 个值组成,还是要看作一个单密钥。
置换 Permutation
- 置换是通过变动明文块内部的字符排列次序来达到加密信息的目的。
第一种置换方法
- 明文设为字符集合A- 密钥即为置换和逆置换。置换为【2,7,4,6,1,3,51】(2 表示当前位置用第 2个字母置换】。逆置换为【5,1,6,3,7,4,2】- 密文即为用密钥(置换)改变字符集合A 顺序得到的字符串B
第二种置换方法
- 明文设为字符串集合A,将 A 按行优先依次填入空矩阵中。
- 密钥为顺序数字集合。
- 按密钥中数字的顺序,排布矩阵中的列
隐写术
- 隐写术不是严格意义上的加密,其实现方式是将秘密消息隐藏在其他消息中 。
- 字符标记:选择一些印刷字母或打字机打出的文本,用铅笔在其上书写一遍。这些标记需要做得在一般场合下辨认不出,除非将纸张按某个角度对着亮光看。
- 不可见墨水:有些物质用来书写后不留下可见痕迹,除非加热或加之以某种化学物质
- 针刺:在某些字母上刺上小的针孔,这一般是分辨不出来的,除非对着光线。
- 打字机的色带校正:用黑色的色带在行之间打印。用这种色带打印后的东西只在强光下可见。
- 加水印
数论基础
整除性
注意: a != 0,但 b 可以为 0 ,且当 b 为 0 时,对于任何的 a ,a|b恒成立。如 1|0、2|0…
例:证明 若3|n且7| n,则21| n
由3|n,可知存在整数m 使得 n = 3m,进而代换可得 7|3m
此外,对于任何的m,1|m 恒成立,因此 7|7m 恒成立
运用线性运算法则,对于任意的 x、y:7|{x(3m)+y(7m)}恒成立
令 x = -2,y = 1,则有 7 |( -6m + 7m)= 7|m = 21 |3m = 21 |n
欧几里得算法求最大公因数(最大公约数)
最大公因数就最大公约数
欧几里得算法的时间复杂度:O(log n)
扩展欧几里得算法求两个数的最大公约数的线性表示
求 198 和 252 的最大公约数,并把它表为 198 和 252 的整系数线性组合
扩展欧几里得算法求乘法逆元
a mod b,在 a < b 时,求乘法逆元
-
欧几里得算法也叫辗转相除法,这个方法可以找到两个非负整数的最大公约数,
-
只要知道:扩展欧几里得的形式为 余数 = 被除数 - 系数x除数,即每一步都为减法
-
辗转相除直到余数为 1;
-
通过将前步等式代换得到 a,p 关系,a 的乘数即为所求。
此外还必须注意的细节有:
- 除法系数必须写右边,方便合并
- 与第一条同理,任何乘法必须注意次序,并且任何一项始终保持两两相乘
- 最终得到的 x 若为负数,则令 |x| + z = p,z 即为所求。
a mod b,在 a > b 时,求乘法逆元
模运算
同余
模算术运算(快速幂)
- 将幂转化为二进制。
- 设 ans = 1,cur = 底数,开始迭代;
- 轮数等于二进制幂的长度。从后往前看二进制幂:若为 1 ,则 ans = ans ✖️ cur (mod 模数),cur = cur ✖️ cur (mod 模数);若为 0 ,则 ans 不变,cur = cur ✖️ cur (mod 模数)。
- 最后结束 ans 即为整体的结果。
中国剩余定理
- 用于加速模运算
- 某一范围内的整数可通过它对两两互素的整数取模所得的余数来重构
- 使得非常大的数对M 的模运算转化到更小的数上来进行运算
DEMO
- 计算 Mi 和 M。其中 M1 = 除了一式以外所有式子的模;相乘;M为所有式子的模数相乘
- 计算 Mi 的乘法逆元;
- 使用公式
欧拉定理、费马小定理
- 欧拉函数:设 n 是正整数,小于 n 且与 n 互素的正整数个数称为 n 的欧拉函数,记为 φ(n)例如: φ(6)= 2 ;φ(7)=
6。- 若 n 是素数,则 φ(n)= n - 1;
- 若 n = pq,且 p、q 均为素数,则 φ(n)= (p - 1)(q - 1)
欧拉定理求大整数的后几位
- 计算模数n 的欧拉函数值 φ(n)
- 将幂拆解为含有欧拉函数值 φ(n)欧拉函数值 φ(n)的多因子的乘积
费马小定理指数取模
在 a、p 互素的情况下:
- 用费马小定理将指数化为小于模数的形式
- 将指数继续分拆,模出来的结果相乘最后再模即可
离散对数
本原根
多项式计算
对称密码体制
分组密码
- 分组密码将输入的明文分组当做一个整体处理,输出一个等长的密文分组。
- Feistel密码结构是分组密码中的一种对称结构。由于它是对称的密码结构,所以对信息的加密和解密的过程就极为相似,甚至完全一样。这就使得在实施的过程中,对编码量和线路传输的要求就减少了几乎一半。
- Feistel 建议使用乘积密码来增强密码的强度
- Feistel建议交替使用代换和置换,增强密码的扩散和淆性能
- 扩散 Diffusion:让每个明文数字尽可能地影响多个密文数字,使明文和密文的统计特性不相关。
- 混淆 Confusion:使密文和密钥之间的关系变得复杂
- 乘积密码 Product Cipher:在单个加密机制中依次使用两个或两个以上不同类型的基本密码(如代换和置换),所得结果的密码强度将强于每个单个密码的强度
- DES 等传统分组加密算法都采用了 Feistel结构。
分组密码之 DES
- DES具有很好的雪崩效应:明文或密钥某一位发生变化(微小的变化)将对密文产生很大的影响
- DES 采用 P置换来达到扩散性
- DES 采用 S盒置换来达到混淆性
- 其中,IP扩展、E扩展、P置换都为查表置换。
DEMO
已知 S盒如下,若输入为 101101,求输出。
首尾二数为 11,十进制为 3,则第三行;
中间数字为 1001,十进制为9,则第九列;
查表三行九列为 14,十进制为 1100,即输出值。
分组密码之 AES
- AES 分组长度只能是 128bit
- 密钥长度 128/192/256bit,分别对应着 10/12/14 轮的迭代。
- 处理单位是字节;作为对比,DES 处理单位为 bit。
- AES 的基本运算,可以记为“三代替、一换位”
- 字节代替SubBytes
- 列混淆MixColumns
- 行移位ShiftRows
- 轮密钥加AddRoundKey
- AES 解密的基本运算为:
- 逆向行移位
- 逆向字节代替
- 轮密加
- 逆向列混淆。
分组密码运行模式
- 当消息长度大于分组长度时,需要分成几个分组分别进行处理,分组的方式/顺序就称为分组密码的工作模式或分组密码算法的运行模式。
- 电子编码本模式。优点:简单且有利于并行计算,误差不会被传送。缺点:不能隐藏明文的模式,一旦有一个块被破解,使用相同的方法可以解密所有的明文数据,安全性比较差;可能对明文进行主动攻击这种方法
- 密码分组链接模式。优点:不易被主动攻击,是 SSL、IPSec 的标准。缺点:不利于并行计算,误差传递。
- 输出反馈模式。跟密码分组链接差不多。
- 密码反馈模式。
公钥密码
- 公钥密码解决的基本问题
- 解决传统密码中的密钥分配和数字签名
- 公钥密码的特点:
- 仅根据密码算法和密钥来确定解密密钥在计算上不可行;两个密钥中的任何一个都可用来加密,另一个用来解密。
- 公钥密码的六个组成部分:
- 明文、密文;公钥、私钥;加密、解密算法
- 公钥密码的三个作用
- 加解密:发送者用接收者的公钥加密消息,
- 数字签名:发送者用自己的私钥签名消息
- 密钥交换:通信双方用公钥密码交换会话密钥,此后便可用会话密钥进行对称加密,节省资源。
- 单向函数 one-way function
- 陷门单向函数(Trapdoor one-way function) 是单向函数,在不知陷门信息下,由f(x)求 x 极为困难;当知道陷门信息后,由 f(x)求 x 是易于实现的。
对于三种密码体制,尽管过程稍有不同,但总归是先找一个大素数n 作为模数,然后构造密钥对。
RSA
- RSA 属于分组密码
- 三种攻击 RSA 的方法
- 穷举法
- 数学攻击:实质上是对两个素数乘积的分解。为了避免被攻击,现阶段应选用 1024/2048 位密钥。
- 时间攻击:依赖解密算法的运行时间
加解密 DEMO
- 随机选择两个大素数 p,q,求它们的乘积 n =p ✖️ q 作为模数
- 求 n 的 Euler 函数 φ(n) = (p - 1)(q - 1) ;
- 选择一个与 n 互素的加密密钥 e,使得 1<e<φ(n),且 gcd(e,p(n)) = 1;
- 求 e ✖️d ≡ 1 (mod φ(n)),即 e 的乘法逆元 d 作为解密密钥
- 公布公钥 PU = {e,n},保留私钥 PR = {d,n}
- 注意,发送的明文M 必须 < n
以下 x,y 为传输文本。(私钥为幂)
加密过程为:
解密过程为:
公钥和私钥的关系 DEMO
公钥为 (e,n),私钥为(d,n),由于公钥是公开的,因此私钥中的 n 也是公开的,攻击者只要找到私钥中的 d,就能破解 RSA。
从公钥的 e 推导私钥的 d 的过程为:
- 将 n 分解为两个质数 p、q。由于实际采用的公私钥对长达 1024/2048 位,这种分解是几乎不现实的。
- 计算 φ(n)= (p - 1)(q - 1)
- 根据 e ✖️ d ≡ 1 (mod φ(n)),可求得私钥的 d,进而获取私钥。
例题:采用 RSA 加密体制,已知接收方的公钥是(e,n)=(5,35),拦截到的密文为 C = 10,破解明文。
- 35 = 5 ✖️ 7。5、7都是质数;
- φ(35)= (5 - 1)(7 - 1)= 24;
- 解 5 ✖️ d ≡ 1 (mod 24) 即求 5 mod 24 的乘法逆元,解得为 5;故密钥 PR = (5,35)
- 运用解密公式
DH 密钥交换
- 第一个公钥算法
- 是一个密钥公开交换算法
- 算法本身只限于进行密钥交换(建立公共密钥),不能交换任何信息
- 算法的基础是:有限域中的指数运算(模一个素数)是相对容易的,而离散对数的计算是相对困难的。
- 容易受到中间人攻击。
- 添加认证功能,用公钥证书/共享密钥
- 用户 A、B 均已知晓以下全局参数:大素数n(今后作为模数);一个模 n 的本原根:记为 α(作为计算公钥时的底数)
- 每个用户独立产生自己的密钥对。选择一个保密的随机数:PR < n,PR 即为私钥;计算其公钥: PU = α^PR mod n。(私钥为幂)
- 每个用户公开其公钥 PU,保留私钥 PR。
- A、B 独立计算二者共享的会话密钥 Kab。
- 攻击者想要解出私钥 PR,则必须求解离散对数,但之前提到过,离散对数的计算是非常困难的。
DEMO
EIGamal
- ELGaml算法侧重于信息的安全传播,构建的密钥对是为了传输信息的
- 破解 ElGamal 相当于解 Diffie-Hellman 问题
- EIGamal 的安全性依赖于 Z*上的离散对数问题
- 在加密过程中,对不同的消息,应选取不同的随机数k,否则,攻击者可以很容易攻击 EIGamal 公钥体系
DEMO
- 密钥产生过程:选择一个素数n,以及两个小于n 的随机整数 g、PR,计算 y = g^PR (mod n),则公钥 PU =(n,g,y),PR 为私钥。(私钥为幂)
- 加密过程:设密文消息为 M,选择一个与 n-1 互素的数k,计算C1 = g^k (mod n),^^ C2 = m ✖️ y^k(mod n),则密文为(C1,C2)。
- 解密过程为:
数字签名
- 数字签名的功能
- 确认信息是由签名者发送的;
- 确认消息自签名后到收到为止,未被修改过
- 签名者无法否认签名是由自己发送的、
- 数字签名的组成
- 密钥生成:产生公钥与私钥如公钥密码体制
- 签名算法:利用私钥对文档签名
- 验证算法:利用公钥对签名进行验证
签名的过程,本质就是对方的公钥进行加密,与平时传输是一样的。
哈希函数
- Hash函数的主要功能是提供数据完整性检验。
- Hash函数的应用
- 消息认证
- 消息认证是用来验证消息完整性的一种机制
- 当 Hash函数用于提供消息认证功能时,Hash函数值通常称为消息摘要 message digest
- 一般地,消息认证是通过使用消息认证码(MAC)实现的,即带密钥的Hash函数
- 广泛应用于文件传输如网络文件下载)
- 数字签名
- 消息认证
- 哈希函数安全性条件
- 单向性 one-way。
- 抗弱碰撞性/弱无碰撞性 weak collision resistance / weakly collision-free:即对任何给定的 x,找到满足 y≠x 且 H(x) = H(y) 的 y 在计算上是不可行的。
- 抗强碰撞性强无碰撞性 strong collision resistance / strongly collision-free:对任意两个不同的 x,y,找到满足 H(x) = H(y) 在计算上是不可行的。
- 伪随机性
- 对 hash函数的攻击方法
- 穷举攻击
- 密码分析攻击
- MD5 以 512b 分组长度处理消息
- SHA-1 安全哈希算法:用于产生 160b 消息摘要的哈希函数
- MD5 使用小端结构;SHA 使用大端结构
相关文章:
现代密码学
概论 计算机安全的最核心三个关键目标(指标)/为:保密性 Confidentiality、完整性 Integrity、可用性 Availability ,三者称为 CIA三元组 数据保密性:确保隐私或是秘密信息不向非授权者泄漏,也不被非授权者使…...
websocket是什么?
一、定义 Websocket是一种在单个TCP连接上进行全双工通信的协议,它允许服务器主动向客户端推送数据,而不需要客户端不断的轮询服务器来获取数据 与http协议不同,http是一种无状态的,请求,响应模式的协议(单向通信)&a…...
idea怎么打开两个窗口,运行两个项目
今天在开发项目的时候,前端希望运行一下以前的项目,于是就需要开两个 idea 窗口,运行两个项目 这里记录一下如何设置:首先依次点击: File -> Settings -> Appearance & Behavior ->System Settings 看到如…...
aws服务--机密数据存储KMS(1)介绍和使用
在AWS(Amazon Web Services)中存储机密数据时,安全性和合规性是最重要的考虑因素。AWS 提供了多个服务和工具,帮助用户确保数据的安全性、机密性以及合规性。AWS Secrets Manager、KMS(Key Management Service)是推荐的存储机密数据的AWS服务和最佳实践。这里先看KMS。 …...
怎么编译OpenWrt镜像?-基于Widora开发板
1.准备相应的环境,我使用的环境是VMware16ubuntu20.04,如图1所示安装编译所需的依赖包; sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-…...
Android opencv使用Core.hconcat 进行图像拼接
Android 集成OpenCV-CSDN博客 import org.opencv.android.Utils; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.imgcodecs.Imgcodecs; import android.graphics.Bitmap; import android.graphics.BitmapFactor…...
小杨的N字矩阵c++
题目描述 小杨想要构造一个m*m 的 N 字矩阵( m为奇数),这个矩阵的从左上角到右下角的对角线、第1 列和第m 列都 是半角加号 ,其余都是半角减号 - 。例如,一个 5*5 的 N 字矩阵如下: --- -- -- -- --- 请…...
C 语言面向对象
面向对象的基本特性:封装,继承,多态 1.0 面向过程概念 当我们在编写程序时,通常采用以下步骤: 1. 将问题的解法分解成若干步骤 2. 使用函数分别实现这些步骤 3. 依次调用这些函数 这种编程风格的被称作 面向过程…...
初试无监督学习 - K均值聚类算法
文章目录 1. K均值聚类算法概述2. k均值聚类算法演示2.1 准备工作2.2 生成聚类用的样本数据集2.3 初始化KMeans模型对象,并指定类别数量2.4 用样本数据训练模型2.5 用训练好的模型生成预测结果2.6 输出预测结果2.7 可视化预测结果 3. 实战小结 1. K均值聚类算法概述…...
部署实战(二)--修改jar中的文件并重新打包成jar文件
一.jar文件 JAR 文件就是 Java Archive ( Java 档案文件),它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…...
C++中的原子操作:原子性、内存顺序、性能优化与原子变量赋值
一、原子操作与原子性 原子操作(atomic operation)是并发编程中的一个核心概念,指的是在多线程环境中,一个操作一旦开始,就不会被其他线程的操作打断,直至该操作完成。这种不可分割的特性保证了操作的原子…...
【JavaEE初阶】多线程初阶下部
文章目录 前言一、volatile关键字volatile 能保证内存可见性 二、wait 和 notify2.1 wait()方法2.2 notify()方法2.3 notifyAll()方法2.4 wait 和 sleep 的对比(面试题) 三、多线程案例单例模式 四、总结-保证线程安全的思路五、对比线程和进程总结 前言…...
数据结构(Java版)第二期:包装类和泛型
目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1…...
[原创](Modern C++)现在C++的关键性概念: 通俗易懂的解释“多态“与“虚函数“的内在关系
常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共23年] 职业生涯: 21年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse、C Bui…...
python操作Elasticsearch
使用elasticsearch 6.x版本,操作es数据。 #! -*- coding:utf-8 -* import timefrom elasticsearch import Elasticsearch, helpersclass EstUtil:_instance Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance super(EstUtil, cls).__ne…...
【数据分享】2024年我国省市县三级的住宿服务设施数量(8类住宿设施/Excel/Shp格式)
宾馆酒店、旅馆招待所等住宿服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市住宿服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、各区…...
从尾到头打印链表 剑指offer
题目描述 输入一个链表的头节点,从尾到头反过来打印出每个节点的值。 链表节点定义如下: struct ListNode {int m_nKey;ListNode*m_pNext; }; 代码实现 栈实现: 递归实现: 但是用递归实现可能存在的问题:...
【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!
上篇文章:CSDN 我们介绍了JMeter的一些原理介绍,以及安装配置和启动流程,本文我们就来讲讲JMeter如何使用。 一、JMeter目录结构组成 1. 根目录 Jmeter安装包解压后的根目录如下图: 1.1 backups目录:脚本备份目录&am…...
【JavaEE】Servlet:表白墙
文章目录 一、前端二、前置知识三、代码1、后端2、前端3、总结 四、存入数据库1、引入 mysql 的依赖,mysql 驱动包2、创建数据库数据表3、调整上述后端代码3.1 封装数据库操作,和数据库建立连接3.2 调整后端代码 一、前端 <!DOCTYPE html> <ht…...
WPF中如何让Textbox显示为一条直线
由于Textbox直接使用是一条直线 设置如下代码 可以让Textbox变为直线输入 <Style TargetType"TextBox"x:Key"UsernameTextBoxStyle"><Setter Property"Template"><Setter.Value><ControlTemplate TargetType"{x:Typ…...
多维数组与特殊矩阵:存储与压缩
多维数组与特殊矩阵:存储与压缩 一、多维数组的存储 (一)基本概念 多维数组是线性表的推广,例如二维数组可以看作是元素为一维数组的线性表,三维数组可以看作是元素为二维数组的线性表,以此类推。在内存…...
第三讲 架构详解:“隐语”可信隐私计算开源框架
目录 隐语架构 隐语架构拆解 产品层 算法层 计算层 资源层 互联互通 跨域管控 本文主要是记录参加隐语开源社区推出的第四期隐私计算实训营学习到的相关内容。 隐语架构 隐语架构拆解 产品层 产品定位: 通过可视化产品,降低终端用户的体验和演…...
springboot项目使用maven打包,第三方jar问题
springboot项目使用maven package打包为可执行jar后,第三方jar会被打包进去吗? 答案是肯定的。做了实验如下: 第三方jar的项目结构及jar包结构如下:(该第三方jar采用的是maven工程,打包为普通jar…...
突破内存限制:Mac Mini M2 服务器化实践指南
本篇文章,我们聊聊如何使用 Mac Mini M2 来实现比上篇文章性价比更高的内存服务器使用,分享背后的一些小的思考。 希望对有类似需求的你有帮助。 写在前面 在上文《ThinkPad Redis:构建亿级数据毫秒级查询的平民方案》中,我们…...
【Linux】Linux系统电源状态
前言 本文主要介绍Linux系统电源状态。 Linux内核代码声明如下,位于kernel/power/suspend.c。 参考链接 Linux系统电源状态 在Linux操作系统中,将电源划分为如下几个状态: ACPI StateLinux StateDescriptionS0On(on)WorkingS1Standby(sta…...
《用Python画蔡徐坤:艺术与编程的结合》
简介 大家好!今天带来一篇有趣的Python编程项目,用代码画出知名偶像蔡徐坤的形象。这个项目使用了Python的turtle库,通过简单的几何图形和精心设计的代码来展示艺术与编程的结合。 以下是完整的代码和效果介绍,快来试试看吧&…...
ARM(安谋) China处理器
0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China,2018年4月established,独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1(星辰处理器) STAT-MC1,主要为满足AIOT应用性能、功…...
硬中断关闭后的堆栈抓取方法
一、背景 性能和稳定性是一个计算机工程里的一个永恒的主题。其中尤其稳定性这块的问题发现和问题分析及问题解决就依赖合适的对系统的观测的手段,帮助我们发现问题,识别问题原因最后才能解决问题。稳定性问题里尤其底层问题里,除了panic问题…...
电影风格城市夜景旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色教程 电影风格城市夜景旅拍通过 Lightroom 调色,将城市夜晚的景色打造出如同电影画面般的质感和氛围。以独特的色彩和光影处理,展现出城市夜景的魅力与神秘。 预设信息 调色风格:电影风格预设适合类型:人像,街拍…...
基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功
基于FPGA的2FSK调制 前言一、2FSK储备知识二、代码分析1.模块分析2.波形分析 总结 前言 设计实现连续相位 2FSK 调制器,2FSK 的两个频率为:fI15KHz,f23KHz,波特率为 1500 bps,比特0映射为f 载波,比特1映射为 载波。 1)…...
【Python】构建事件驱动架构:用Python实现实时应用的高效系统
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 事件驱动架构(Event-Driven Architecture,EDA)是一种基于事件流动进行系统设计的模式,广泛应用于游戏开发、实时监控和分布式系统中。它通过解耦事件的生产者和消费者,提升系统的可扩展性和灵活性。本文章从…...
安装 Docker(使用国内源)
一、安装Docker-ce 1、下载阿里云的repo源 [rootlocalhost ~]# yum install yum-utils -y && yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && yum makecache # 尝试列出 docker-ce 的版本 [rootlocalh…...
001 MATLAB介绍
前言: 软件获取渠道有很多,难点也就是百度网盘下载慢; 线上版本每月有时间限制。 01 MATLAB介绍 性质: MATLAB即Matrix Laboratory 矩阵实验室的意思,是功能强大的计算机高级语言, 已广泛应用于各学科研究部门、…...
vscode利用ofExtensions插件可以调试单进程Openfoam,但是不能调试mpi多进程案例
问题: 准备调试流固耦合案例,包括流体和固体的,但是用ofextensions插件。但是流体的话使用的是域分解方法,将大的单元分成了小的单元用mpi并行处理,里面的program必须输入"/usr/bin/mpirun", // 这里改为使…...
2022年计算机网络408考研真题解析
第一题: 解析:网络体系结构-数据链路层 在ISO网络参考模型中,运输层,网络层和数据链路层都实现了流量的控制功能,其中运输层实现的是端到端的流量控制,网络层实现的是整个网络的流量控制,数据链…...
React-useEffect的使用
useEffect react提供的一个常用hook,用于在函数组件中执行副作用操作,比如数据获取、订阅或手动更改DOM。 基本用法: 接受2个参数: 一个包含命令式代码的函数(副作用函数)。一个依赖项数组,用…...
python学习笔记(10)算法(3)列表
一、列表 列表(list)是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历 等操作,无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。 ‧ 链表天然可以看作一个列表&#…...
嵌入式系统与单片机工作原理详解
随着现代科技的发展,嵌入式系统已经深入到我们日常生活中的方方面面。无论是智能家居、汽车电子,还是工业控制、医疗设备,都离不开嵌入式系统的支持。而单片机作为嵌入式系统的核心组件,是实现这些功能的关键之一。本文将详细介绍…...
Spark SQL 之 QueryStage
ExchangeQueryStageExec ExchangeQueryStageExec 分为两种...
Flink Standalone 集群模式安装部署教程
目录 一、前言 二、环境准备 三、安装步骤 1. 下载并安装 Flink 4. 配置 Flink 5. 配置环境变量 6. 启动 Flink 集群 7. 访问 Flink Web 界面 四、简单测试 五、常见问题和解决办法 1. 启动失败,无法连接到 TaskManager 2. Web 界面无法访问 六、总结 …...
【运维】 使用 shell 脚本实现类似 jumpserver 效果实现远程登录linux 服务器
实现效果 通过序号选择登录: 配置证书登录 配置证书登录可以免去每次都输入密码的麻烦。详见另一篇博文: 【ssh】使用秘钥对(公钥/私钥)登录linux主机以及原理介绍 自动登录脚本 直接复用以下脚本即可,在 server…...
根据实验试要求,打通隧道连接服务器上的数据库,前端进行数据调用。
1.背景介绍 数据库布置在了工大实验试K80服务器上,本地属于外网无法直接访问校园内网。需要打通隧道,通过堡垒机进行服务器的访问。获取到数据库数据进行前端展示。 2.打通隧道 访问指令: 我选择使用Xshell打通隧道。优点:凭证…...
ubuntu 安装 docker 记录
本文假设系统为 Ubuntu,从 16.04 到 24.04,且通过 APT 命令安装。理论上也其他 Debian 系的操作系统。 WSL 也一样。 感觉 Docker 官方在强推 Docker Desktop,搜索 Docker 安装文档,一不小心就被导航到了 Docker Desktop 的安装页…...
46.坑王驾到第十期:vscode 无法使用 tsc 命令
点赞收藏加关注,你也能住大别墅! 一、问题重现 上一篇帖子记录了我昨天在mac上安装typescript及调试的过程。今天打开vscode准备开干的时候,发现tsc命令又无法使用了,然后按照昨天的方法重新安装调试后又能用了,但是关…...
pytorch3d linux安装
目录 测试成功2024.11.21: 测试成功2024.11.21: python3.10 GitHub - facebookresearch/pytorch3d: PyTorch3D is FAIRs library of reusable components for deep learning with 3D data 安装脚本: cd pytorch3d && pip install…...
P1168 中位数
网址如下:P1168 中位数 - 洛谷 | 计算机科学教育新生态 一道求中位数的题,本来是想再用二分法来试一下的,但是出现了一点问题,先把AC的放出来 很简单,一个记录比中位数大的数的最小堆,和一个记录比中位数小…...
全面解析多种mfc140u.dll丢失的解决方法,五种方法详细解决
当你满心期待地打开某个常用软件,却突然弹出一个错误框,提示“mfc140u.dll丢失”,那一刻,你的好心情可能瞬间消失。这种情况在很多电脑用户的使用过程中都可能出现。无论是游戏玩家还是办公族,面对这个问题都可能不知所…...
✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本
api.js //封装ajax方法 import $g from "../sg";//vue项目使用 import $ from jquery;//(提示:原生开发页面请前往https://jquery.com下载最新版jQuery) import { Message } from "element-ui";//element项目使用 // import axios from "…...
【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!
在Python开发中,字符串处理是最常见也是最基础的任务之一。而在众多字符串操作方法中,split()函数无疑是最为重要和常用的一个。无论你是Python新手,还是经验丰富的开发者,深入理解并熟练运用split()方法,都将大大提升…...
非root用户安装CUDA
1.使用nvidia-smi查看当前驱动支持的最高CUDA版本: 表示当前驱动最多支持cuda12.1 2.进入cuda安装界面,https://developer.nvidia.com/cuda-toolkit-archive,选择想要安装的版本,例如想要安装CUDA11.4: 如果需要查看ub…...