首页 > 其他分享 >密码学——现代密码体制总结(别再管哈希叫加密了哦)

密码学——现代密码体制总结(别再管哈希叫加密了哦)

时间:2025-01-17 16:58:06浏览次数:3  
标签:加密 密码 算法 密钥 哈希 密文 密码学 mod

文章目录
  • 加解密与现代密码体制总结
    • 一、什么是加解密?
      • 1.加密与解密
      • 2.传统的加解密(古典密码)
      • 3.现代的加解密
    • 二、现代密码体制
      • 1.现代密码的两大类
      • 2.两种体制各有特点
    • 三、对称密钥体制
      • Ⅰ.分组密码
        • 1.Feistel——经典的分组密码结构
        • 2.DES (Data Encryption Standard)——数据加密标准(已过时)
        • 3.AES (Advanced Encryption Standard)——高级加密标准(现阶段可靠)
        • 4.分组密码的加密模式(千万别用ECB!!)
      • Ⅱ.流密码
        • RC4
      • Ⅲ.对称密钥体制的密钥分发——实际应用中必须面对的问题
        • 1.集中式密钥分发
        • 2.分布式密钥分发
    • 四、非对称密钥(公钥)体制
      • 1.RSA算法
      • 2.ElGamal算法
    • 五、本文概念关系图
    • 六、参考资料

加解密与现代密码体制总结

​前言:
本文以区分哈希、编解码和加解密为引,总结了各类密码体制。
包括了对称密钥体制和非对称密钥(公钥)体制的特点,与DES、AES、RC4、RSA及ElGamal等经典算法的实现思想。

文章篇幅较长,大家可以在目录自助选择阅读,希望能给正在学习密码学的同学带来一点小小的帮助。

一、什么是加解密?

1.加密与解密

加密(Encryption)是明文转换为密文的过程,不能通过密文来了解明文的内容,且这个过程必须是可逆的,即:解密(Decryption)。

​ 很多朋友一开始很容易将加解密哈希编解码混淆:可能是因为这三者最终都生成了一些人类不可读的数据。

  • 关于哈希(Hash):

    • 哈希又称杂凑或散列,是一类消息摘要算法,输入任意的数据根据算法的不同而生成固定长度的字符串,该字符串亦称哈希值

    • 哈希算法是不可逆的,即不可能根据哈希值本身来分析出原数据。

    • 既然说哈希不是加密,那为什么还存在一些因”哈希解密“闻名的网站呢?

      某“md5解密”网站的描述是:

在这里插入图片描述

  • 可以看到,该网站通过穷举字符串组合并计算得到海量的对应哈希值,并将其记录于数据库中(“该网站声称有约90万亿条记录,占据储存超500TB。”)。

    当用户输入哈希值后,该网站并不是根据哈希值来进行解密,而是查询包含该哈希值的记录,来尝试获取拥有相同哈希值的字符串,当然这个数据并非一定是你所寻求的原数据(哈希碰撞)。

  • 哈希碰撞:数据与哈希值是满射但非单射的关系(哈希算法不限制输入的数据长度,但生成哈希值的长度是固定的),所以不同数据经过哈希算法也可能得到相同的哈希值,这种情况叫哈希碰撞,理论上是不可能100%避免的,但是通过优化哈希算法能够有效地降低哈希碰撞在实际场景中的发生概率

在这里插入图片描述

请务必不要再使用诸如MD5、SHA-1等已经被证明不安全的哈希函数(md5算法已经被广泛破解了,“加盐”操作可以提高攻击的难度,但并不能保证这类已经被“有效破解”的哈希函数能够提供可信赖的安全性,无论是作为保密手段还是校验文件完整性(攻击者可以很较容易地构造恶意文件来实现哈希碰撞)。),使用SHA-256和SHA-3等新晋算法才是正确的选择。

  • 关于编码/解码(Encode/Decode):

    • 编码是信息格式转换的过程,它的范围很广泛,比如将人类可读的文本转为计算机可读的二进制数据、将信号转为代码等,编码的往往是为了实现信息在不同系统间的传输,编码的逆过程即是解码。

    • 虽然不能说编码是一种加密,但可以将加密理解为一种编码的操作。

      两者本质的区别在于:

      • 编码的过程并不限制解码者的身份(采用公布编/解码标准,任何人都可以解码),旨在实现信息在不同”系统“间的传输;

      • 而加密的过程限制了解密者的身份(古典密码:必须知道密码替换或置换的规则,现代密码:必须知道对应的解密密钥),旨在保证信息的安全性。

2.传统的加解密(古典密码)
  • 替换密码:将明文中的字符替换成其他字符而得到密文。

    如:
    Playfair密码:将明文中的每对相邻字符替换为密文中的另一对字符。
    维吉尼亚密码:一种多表替换密码,通过将明文按照一定规则分组,再使用不同的密表进行替换,从而生成密文。

  • 置换密码:改变明文中原有的字符顺序(位置)而得到密文

    如:
    栅栏密码:将明文中的字符按照一定规则进行排列,从而生成密文。
    凯撒密码:将明文中的字符按照一定的间隔分组,然后将每组中的字符按照一定的顺序排列,最后将所有组中的字符按照顺序连接起来,生成密文。

3.现代的加解密
  • 在现代密码学中,用于实现明密文转换的系统叫密码系统,亦称密码体制

  • 密码体制的组成往往有:明文m、密文c、加密算法E、加密密钥KE、解密算法D和解密密钥KD。

    所以在进行加解密时,除了要求有明(密)文的输入外,还需要有对应加(解)密的密钥

    加密过程:m => + (E、KE) => EK-E( m ) = c

    解密过程:c => + (D、KD) => DK-D( c ) = m

  • 与古典密码不同的是,现代密码体制要求加解密算法的实现原理是公开的,只需要信息接收双方对过程中的密钥进行保密即可。

二、现代密码体制

1.现代密码的两大类

对称密钥体制非对称密钥体制(分类依据是在加密和解密的过程是否使用相同的密钥——这里前者相同,而后者不同)

2.两种体制各有特点
  • 对称密钥体制

​ 在对称密码体制中,要求通信双方都拥有相同的密钥,但要在复杂的网络环境中满足这一需求可不容易:如果在网络中直接传输密钥,安全性将收到极大的威胁,但如果使用可靠性极高的“信使”来传输密钥,传输成本又太高。

​ 其次,因为加密时用到密钥,那么攻击者可能通过利用一些已知的信息(算法、密文甚至某些明密文对)来猜解密钥

所以对称密钥体制面临的问题更多在于如何保障密钥的安全性


  • 非对称密钥体制

在非对称密钥体制(又称公钥体制)中,通信的某一方基于某种算法,来得到一对公钥PK(Public Key)私钥(Secret Key),且通过其中一个密钥来获得另一密钥在计算上是很困难的,而这种计算的复杂度决定了该公钥密码系统的安全强度。

在实际的加解密过程中,加密与解密过程必须使用一对相互对应的公私钥(比如使用公钥PK-A加密明文P,就只能用该公钥对应的私钥SK-A来解密:DSK-A(EPK-A( P )) = P)。

通信方A公开密钥(即向网络分发公钥PKA),所有人在向A发送数据P时可以用由A事先分发的公钥PKA来加密数据得到EPK-A( P ),因为这世上只有通信方A握有对应的私钥SK-A(前提是该密码体制足够安全没被破解且通信方A也没有泄露私钥),所以只有通信方A能对密文进行解密得到明文P = DSK-A((EPK-A( P ))) 。

除此之外,当通信方A分发公钥PKA后,可以用对应的私钥SKA来加密数据P的哈希值,得到密文MMD(P)连同数据P一并发送到网络中。而网络中任意收到公钥PKA的人都可以尝试用PKA来解密该密文MMD(P),解密得到哈希值,并同样对数据P进行哈希计算得到另一个哈希值,如果两个哈希值相同,那么就确信这个数据P来自通信方A,通信方A也不能抵赖说自己没有发送密文M(即使通信方A是在此前不小心泄露了私钥SKA,也必须为此承担相应的后果),这便是基于公钥体制的数字签名技术。

​ 公钥密码体制的出现解决了密钥分发数字签名这两大密码学的难题,将现代密码学向前推进了一大步,它的发明者Diffie和Hellman后来也因此获得了2015年的图灵奖(一份迟到的奖项)。

​ 但是,公钥体制也面临着两个实际的问题:
①如何判断某公钥是否来自我的目标通信方,而不是第三方伪造的?
②计算效率远低于对称密码体制

三、对称密钥体制

​ 前面提到对称密钥体制面临的主要问题在于如何保障密钥的安全性(①通信双方如何安全地共享密钥、②如何防止攻击者通过解析算法、已有密文乃至某些明密文对之间的关系来猜解出密钥)。

​ 首先,如何防止攻击者成功猜解密钥呢?我们不妨从攻击者的角度来考虑,虽然攻击者没有密钥,但因为加密算法是公开的,那么攻击者便可尝试利用已知的算法、密文甚至其一些明密文对来解析加密所使用的密钥。由此有两种思路来避免上述情况的发生:一是提高算法的复杂度,让攻击者难以解析成功,二是每次加密都采用不同的密钥,且让这些密钥之间没有相关性,基于这两种思路,分别有了分组密码体制流密码体制

​ 通信双方如何安全有效地共享密钥呢?

Ⅰ.分组密码

​ 分组密码的加解密:以分组(一定长度的数据)算法加解密的对象输入n位长的明文分组m及b位密钥k,输出n位密文分组c,反之解密亦然。

1.Feistel——经典的分组密码结构

在这里插入图片描述

​ 对于n位的分组,将其拆分为前n/2位和后n/2位的数据,分别记为L1和R1(L-Left、R-Right),进行一定次数的迭代,迭代的方式如下(对于第 i 次迭代):

Li = Ri-1

Ri = Li-1 ⊕ F(Ki, Ri-1)

其中,F()是该算法的轮函数,⊕是异或运算,Ki是第i次迭代的轮密钥(输入一串密钥,有相应的算法来为没轮迭代生成对应的轮密钥)。

​ 而解密过程就是加密的逆过程:

Ri-1 = Li

Li-1 = Ri ⊕ F(Ki, Ri-1)


2.DES (Data Encryption Standard)——数据加密标准(已过时)

DES基于Feistel结构,输入64位的数据和64位密钥(只有56位是实际的密钥,另外8位是奇偶校验码),产生64位密文。

DES一度成为国际上广泛使用的对称密钥加密算法,但随着计算机算力的提高,DES的56位密钥加密变得不再安全。
现在我们还在使用的DES实际是3DES(Triple DES)。(但慢慢地,3DES的安全性也受到了一些威胁,后面马上要提到的AES才是现阶段最佳的选择)

3DES的加解密过程如图:

在这里插入图片描述

​ 通过三重DES,相当于采用了56x3=168位密钥,安全性得到了很大的提高。

​ 或许有的朋友会有一个疑问,之前不是说对称密钥体制的加解密过程必须使用相同的密钥吗?为什么在3DES加密过程中,可以使用密钥K2去“解密”由密钥K1加密的密文?

​ 实际上,这里的“解密”不是我们在文初提到的那个解密(能得到明文的过程)。它仅仅是DES的一个“解密运算D”而已,是3DES加密过程的一个子过程,与它前后的两次“加密运算E”共同构成了3DES的整个加密过程。而3DES解密运算则逆向进行三个过程,最终才完成解密。


3.AES (Advanced Encryption Standard)——高级加密标准(现阶段可靠)

AES同样基于Feistel结构,输入128位长度的数据和某种长度的密钥(AES的密钥可以是128位、192位或256位),返回128位密文。

AES的安全性很高,取代了DES,是现今国际上使用最广泛的对称密钥加密算法


4.分组密码的加密模式(千万别用ECB!!)

因为分组密码加解密时需要对明文分块操作,这里就分支出来了几种思路不同的加密模式(仅仅选择性地列举几种经典的,其他的请读者自行了解)

  • ECB(Electronic CodeBook)电子密码本模式:
    ECB是最简单的加密模式,加解密过程中各分组之间互相独立
    这意味着不同分组间只要明文相同,加密得到的密文也会相同,这会导致:
    ①攻击者可以通过分组识别来猜测明文
    ②攻击者可以采用重放攻击(因为ECB允许不同分组对应相同密文,所以接收方也不知道攻击者重发的这个密文包是真是假,只能一并处理)来达到欺骗的效果;
    ③除此之外,ECB的计算效率很低,在面对大的数据块时这一缺点会显露无疑。
  • CBC(Cipher Block Chaining)密码分块链接模式:
    CBC引入了一个初始化向量IV(Initialization Vector),并且后每个分组在加密前会和前一个分组的密文进行异或(而第一个分组则是和初始化向量IV进行异或)。
    ①这样就不会出现ECB加密模式里面那样的“不同分组间只要明文相同,则对应的密文也一定相同”的情况,攻击者就很难猜测出明文
    ②但因为加解密过程中前后分组关联密切,所以无法并行计算各个分组,所以它的效率也不能算是最佳;
    ③不过,当初始化向量IV不够随机时也会出现一些问题:比如,如果使用相同的IV来加密两个相同的明文分组,那么产生的密文块也会是相同的。
    (这里的初始化向量IV是一个和分组长度相同(毕竟要异或嘛)的伪随机数序列,接受方在解密前也得拿到这个IV,后面介绍流密码时也会提到这个初始化向量IV)

可以参考以下网络上的这组图片:
在这里插入图片描述
由于使用ECB加密,相同的色块都被加密为另一种相同的“色块”,所以可以看到Tux的肖像在被使用ECB加密后依然会显示出相应的轮廓。

  • CTR(Counter)计数器模式:
    CTR模式很有趣,它将分组密码转换为了“流密码”(后面会单独介绍)来进行计算实现,它引入了一个随机的计数器值N和一个计数列表 [0, 1, 2, …, m](假设明文的长度为m),并结合密钥加密生成一个新的“随机数流” [E(N || 0), E(N || 1), E(N || 2), …, E(N || m)],然后就用这一串随机数流来和明文进行对应的异或,便可得到密文。
    ①因为这个随机数流在指定了随机数N和计数列表后就能确定了,所以实际上每个明文块可以并行参与计算
    ②不过,当使用相同的计数器值和密钥来加密相同的明文,则会得到相同的密文,所以应当避免计数器值的重复。

Ⅱ.流密码

​ 流密码,亦称序列密码,特点是每次加密采用不同的密钥,且这些密钥之间没有相关性。 理论上讲这样的密码体制是最安全的(一次一密钥),但在现有的技术背景下,实现真正严格意义上的一次一密钥是很困难的……

RC4

​ 采用RC4的双方先经过协商共享了一个原始密钥k,且当有一方要发送信息的时候就要附上一个新的初始向量IV(Initialization Vector),并将其和原始密钥k拼在一起组成一个一次随机数种子。将该随机数种子输入伪随机数生成器,便会生成一个长度和明文m相同的一次性密钥流,用这个密钥流和明文m异或便得到密文c。

​ 而接受方在收到传来的数据时,会提取出本次加密使用到的初始向量IV,然后和发送方做相同的操作,得到相同的密钥流,将其与密文c异或便可得到明文m。

​ 这便是在WEP(Wired Equivalent Privacy)——曾经的WIFI安全标准中使用RC4来实现安全加解密的情景,如下图:
在这里插入图片描述

​ 图中的伪随机数生成器其实就是RC4,可以看到输入了一个随机数种子(由原始密钥k和初始向量IV组成),然后便生成了一个与明文长度相同的密钥流

RC4虽然看上去实现了一次一密钥,实则并不那么完美:

​ ①采用伪随机数生成来产生密钥,所以严格来说每个密钥之间并不是没有相关性(实时上计算机程序也不可能实现真正的随机);

​ ②此外,该伪随机数是由伪随机数种子得到的,而不同的伪随机数种子中却包含着相同的原始密钥k,这无疑又增加了密钥之间的相关性;

​ ③初始向量的长度有限,若原始密钥在较长时间内不改变的话,可能出现与先前相同的伪随机数种子(当一定长度的初始向量被穷举完原始密钥k也不发生改变,就可能出现某些伪随机数种子重复出现的情况),而相同的伪随机数种子又能产生相同的密钥流,这就违背了一次一密钥原则。

Ⅲ.对称密钥体制的密钥分发——实际应用中必须面对的问题

​ 对于对称密钥体制,我们往往需要有安全可行的在通信双方间的密钥共享技术。下面举例两种著名的密钥分发手段。

1.集中式密钥分发

依赖建立好的密钥分配中心——KDC(Key Distribution Center)

在这里插入图片描述

​ 任何想要通过KDC来分配密钥的通信方们都需要在KDC注册一个主密钥:如用户A想要和用户B借助KDC来共享一对相同的密钥,那么用户A和用户B必须事先都在KDC上注册一个主密钥KAKB)。

​ 如上图(红、蓝和绿色分别代表用户A、用户B和密钥分发中心KDC),当用户A想要与B共享密钥时,由用户A先发送一个(A||EKA(A, B))给KDC:

​ "||“左边的A是明文,相当于告诉KDC这条数据是用户A发来的,然后KDC就会使用数据库中用户A对应的主密钥KA来解密"EKA(A, B)”,如果正确就得到(A, B)。

​ 在拿到(A, B)后,KDC便会随机生成一个会话密钥R1,作为用户A和用户B之间的会话共享密钥。之后呢?自然是想办法让用户A和用户B都拿到会话密钥R1

​ KDC向用户A发送一个EKA(R1||EKB(A,R1))。

​ 用户A在收到这条数据,使用自己的KA来解密得到了R1||EKB(A,R1),"||“左边的R1是明文,此时用户A就拿到了会话密钥R1。之后便把”||"右边的EKB(A,R1)发送给用户B。

​ 用户B在收到数据后,使用自己的KB来解密,得到了(A,R1),即:与用户A之间的会话共享密钥是R1。

​ 这样,双方都获得了本次通信的会话密钥R1。

​ 集中式密钥分发虽然原理简单,但由于其依赖KDC,且通信双方必须在同一个KDC事先注册好密钥,所以不利于网络中任意两通信方之间安全通信的实现(假如没法解决如何在同一KDC中注册主密钥的问题)。

2.分布式密钥分发

利用Diffie-Hellman密钥交换算法

Diffie-Hellman算法(简称DH算法)用于在不安全的网络环境内直接实现在两个终端间安全地共享密钥。

DH算法的安全性基于有限域中离散对数的难解性,所以我们需要先简单、快速了解一下相关的数学知识

  • 同余:a ≡ b (mod P) 表示a和b在模P下同余,即a除以P得到的余数A和b除以P得到的余数B相同

  • 原根: 对于一个大素数P,如果{a mod P,a2 mod P,…,ap-1}包含了1至(P-1)的所有整数,那么称这个a是素数P的原根(a < P)。
    即,对于素数P和它的原根a,处于[1,(P - 1)]中的任意整数b,一定存在一个整数 i(1≤ i ≤(P - 1) ),满足:b ≡ ai (mod P),也可以这样来描述i :
    i = Indab (mod P)——即: i 是 “b以a为基,模P的离散对数(lnd)

  • 离散对数与我们在高中阶段所学的一般对数类似,有以下性质:
    IndaXY ≡ IndaX + IndaY (mod P)
    IndaXY ≡ Y · IndaX (mod P)

了解以上知识后,理解Diffie-Hellman算法就足够了。


以下是通信双方利用DH算法在不安全的公共网络中安全共享密钥的过程:
在这里插入图片描述

让我们来梳理一下公钥密钥K的具体生成过程:

①双方通过协商共享了一个大素数P和它的原根a(恶意中间人也可以拿到P和a)。

②用户A和用户B分别在[1,(P - 1)]中随机选择了一个整数XA和XB作为私钥。

​ 并计算出对应的公钥YA和YB:

​ YA = aXA (mod P)

​ YB = aXB (mod P)

③用户A和用户B计算出相同的共享密钥K。

​ 双方各自计算KA和KB:

​ KA = YBXA (mod P) = (aXB mod P) XA (mod P) = aXB·XA (mod P)

​ KB = YAXB (mod P) = (aXA mod P) XB (mod P) = aXA·XB (mod P)

关于高亮部分的证明:

​ aXA·XB (mod P) = aXA · aXA· … · aXA · aXA(一共XB个aXA连续相乘) (mod P)

​ = aXA mod P · aXA mod P · … · aXA mod P (一共XB个(aXA mod P)连续相乘) (mod P)

​ = (aXA mod P)XB (mod P)

​ = YAXB (mod P)

同理可得:

​ aXA·XB (mod P) = YBXA (mod P)

​ 所以:

​ 共享密钥K = KA = KB = aXA·XB (mod P)

④因为XA和XB分别是YA和YB以a为基,模P的离散对数:

​ XA ≡ IndaYA (mod P)

​ XB ≡ IndaYB (mod P)

​ 而当P是一个很大的素数时,计算模P的离散对数在计算上是很困难的,所以即使恶意中间人知道了a、YA、YB和P,也不能有效地计算出私钥XA或XB。

​ 根据大素数P的位数,定义了三组不同的D-H参数:D-H-1(P是768位二进制数)、D-H-2(P是1024位二进制数)和D-H-3(P是1536位二进制数)。

​ 因为DH算法不能防止“中间人攻击”,所以实际使用时需要结合其他安全机制(如消息完整性校验)才能实现两终端之间安全地共享密钥。

四、非对称密钥(公钥)体制

​ 前面提到了公钥体制的安全性取决于通过从一把密钥通过计算而得到另一把密钥的困难程度。因此,著名的公钥体制算法往往都是借鉴了数学中经典的难题,如:RSA算法基于大整数素因子分解的困难性ElGamal算法基于有限域中离散对数问题的难解性

1.RSA算法

​ RSA(Rivest-Shamir-Adelman)算法利用了大整数素因子分解的困难性

​ 即:将两个大素数相乘得到一个大整数很容易,但将该大整数分解为两个大素数因子在计算上是极困难的。

在此之前,我们需要先了解一些相关的数学知识。

  • 欧几里得算法:即gcd(a,b),值为a和b的最大公约数
  • 互质:即gcd(a,b) = 1 <=> a和b互质(a和b没有1以外的公因子)
  • 欧拉函数:即φ(n),值为所有不大于n且和n互质的自然数的个数
  • a ≡ b (mod P) 表示a和b在模P下同余,即a除以P得到的余数A和b除以P得到的余数B相同
  • 欧拉费马定理:如果gcd(a,n) = 1,则aφ(n) ≡ 1 (mod n)

了解以上知识后,就足矣完整走完RSA算法的流程了。


RSA算法的流程如下:

​ ① 找到两个大素数p和q,计算得到一个合数n = p x q;

​ ② 计算n的欧拉函数值(用于求不大于n且和n互质的自然数的个数),φ(n) = (p - 1) x (q - 1) ;

​ ③ 选择一个e,这个e满足 1 < e < φ(n),且e和φ(n)互质 => gcd(e, φ(n)) = 1;

​ ④ 找一个d,这个d满足ed mod φ(n) = 1,即ed - φ(n)·k = 1 => ed = 1 + (p - 1)(q - 1) · k;

​ 此时公钥e与私钥d都已生成,消息的接收方可以将(e,n)公诸于世,自己保留私钥d。

​ ⑤ 加解密过程:

​ 使用公钥e加密:Me ≡ C (mod n)

​ 使用私钥d解密:Cd ≡ M (mod n)

为什么⑤中的式子就可以实现加解密呢?
我们不妨来“联立”一下⑤中的两个式子:

​ Cd ≡ (Me)d (mod n)

​ ≡ M ed (mod n) (我们按照④中的推导来替换ed)

​ ≡ M (1+φ(n)·k) (mod n)

​ ≡ M · Mφ(n)·k (mod n)

​ 所以,只要我们证明Mφ(n)·k ≡ 1(mod n),即可证明Cd ≡ M (mod n),而根据欧拉费马定理,如果gcd(a,n) = 1,则aφ(n) ≡ 1 (mod n)。

​ 因为n是两个大素数p和q的积,所以n的因子一定只有四个(1,p,q和n)。但在RSA的实际算法处理中,M并不是完整的密文,而是由M某个切片并经过特定处理得到的很小的数,所以显然这里M不会是n的四因子之一,所以M和n互质(gcd(M,n) = 1,因此Mφ(n) ≡ 1 (mod n)。

​ 如果有任何人想要破解私钥d,那就必须算出φ(n)(因为d满足ed mod φ(n) = 1,且e和n是公开的),根据欧拉公式,φ(n) = (p - 1) x (q - 1),而通过一个大整数n分解得到它的两素因子p和q是极端困难的,所以RSA的安全性也取决于这个大整数n的位数。

​ RSA是目前最流行的公钥算法,它的发明者Rivest、Shamir和Adelman也因此获得了2002年的图灵奖。

2.ElGamal算法

​ ElGamal,也是基于有限域上离散对数的难解性而设计。

本节的数学知识同之前的DH算法中所涉及的内容。


ElGamal算法的流程如下:

​ ①选择一个大素数p,将p和它的原根a公诸于世

​ ②计算公私钥对:

​ 选择整数d作为私钥(d∈[0,(p - 2)]),计算得到公钥y = ad (mod p),并将公钥y也公布

​ ③加解密过程:

​ (i)加密

​ 明文M(M是整数,且M∈[1,(p - 1)]),随机选择一个k(k是整数,且k∈[0,(p - 2)]),按照下式得到密文(c1,c2)——这里密文相比明文扩展了一倍:

​ c1 = ak mod p

​ c2 = m· yk mod p

​ (ii)解密

​ M = c2(c1d)-1 mod p

我们可以检验一下加解密的正确性

​ c2(c1d)-1 ≡ M·yk·(ad·k)-1 (mod p) (因为②中y = ad (mod p))

​ ≡ M·yk ·(yk)-1 (mod p)

​ ≡ M (mod p)

​ ElGamal算法是继RSA算法以后使用最广泛的公钥加密算法之一。

​ 因为是随机算法,所以加密过程中的k不能暴露,也不能重复使用;此外,素数p的选择应该足够大(至少是1024位的二进制数)。
密文长度是明文的两倍也可算是该算法的一个缺点。

五、本文概念关系图

#mermaid-svg-MxSrzxb7jGhdMMST {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MxSrzxb7jGhdMMST .error-icon{fill:#552222;}#mermaid-svg-MxSrzxb7jGhdMMST .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MxSrzxb7jGhdMMST .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-MxSrzxb7jGhdMMST .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MxSrzxb7jGhdMMST .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MxSrzxb7jGhdMMST .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MxSrzxb7jGhdMMST .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MxSrzxb7jGhdMMST .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MxSrzxb7jGhdMMST .marker.cross{stroke:#333333;}#mermaid-svg-MxSrzxb7jGhdMMST svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MxSrzxb7jGhdMMST .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-MxSrzxb7jGhdMMST .cluster-label text{fill:#333;}#mermaid-svg-MxSrzxb7jGhdMMST .cluster-label span{color:#333;}#mermaid-svg-MxSrzxb7jGhdMMST .label text,#mermaid-svg-MxSrzxb7jGhdMMST span{fill:#333;color:#333;}#mermaid-svg-MxSrzxb7jGhdMMST .node rect,#mermaid-svg-MxSrzxb7jGhdMMST .node circle,#mermaid-svg-MxSrzxb7jGhdMMST .node ellipse,#mermaid-svg-MxSrzxb7jGhdMMST .node polygon,#mermaid-svg-MxSrzxb7jGhdMMST .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MxSrzxb7jGhdMMST .node .label{text-align:center;}#mermaid-svg-MxSrzxb7jGhdMMST .node.clickable{cursor:pointer;}#mermaid-svg-MxSrzxb7jGhdMMST .arrowheadPath{fill:#333333;}#mermaid-svg-MxSrzxb7jGhdMMST .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MxSrzxb7jGhdMMST .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MxSrzxb7jGhdMMST .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-MxSrzxb7jGhdMMST .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-MxSrzxb7jGhdMMST .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MxSrzxb7jGhdMMST .cluster text{fill:#333;}#mermaid-svg-MxSrzxb7jGhdMMST .cluster span{color:#333;}#mermaid-svg-MxSrzxb7jGhdMMST div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MxSrzxb7jGhdMMST :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

总结

哈希算法

编解码

加解密-保障信息安全

对数据创建指纹

助力信息在不同系统间传输转换

古典密码

现代密码体制

替换密码

置换密码

Playfair密码

维吉尼亚密码

栅栏密码

凯撒密码

对称密钥体制

非对称密钥体制

保证算法足够复杂的分组密码

保证一次一密钥的流密码

RC4算法

DES算法

3DES

AES算法-DES算法的接替者

分组密码的工作模式

ECB

CBC

CTR

对称密钥的密钥分发

集中式:依赖KDC

分布式:Diffie-Hellman算法

基于大整数素因子分解的困难性

RSA算法

基于有限域中离散对数的难解性

ElGamal算法

六、参考资料

《计算机网络安全》——沈鑫剡
《现代密码学》—— 任伟
【散列函数 - 维基百科】:https://zh.wikipedia.org/zh-cn/%E6%95%A3%E5%88%97%E5%87%BD%E6%95%B8
【数学_质数与RSA密码算法一】:https://www.youtube.com/watch?v=TqX0AHHwRYQ
【数学_质数与RSA密码算法二】:https://www.youtube.com/watch?v=AS0fYRnotEo

本文转自 https://blog.csdn.net/qq_51789211/article/details/128516357?ops_request_misc=%257B%2522request%255Fid%2522%253A%25228f79d9da1362e398032df7d1fbccbb2d%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=8f79d9da1362e398032df7d1fbccbb2d&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-128516357-null-null.142v101pc_search_result_base6&utm_term=%E5%AF%86%E7%A0%81&spm=1018.2226.3001.4187,如有侵权,请联系删除。
网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,请看下方扫描即可前往获取

标签:加密,密码,算法,密钥,哈希,密文,密码学,mod
From: https://blog.csdn.net/2301_79455190/article/details/145210357

相关文章

  • 【JS逆向】某政策大数据平台载荷进制流加密详细分析
    声明:本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!有相关问题请第一时间头像私信联系我删除博客!分析:目标网站:aHR0cHM6Ly93d3cuc3BvbGljeS5jb20v进入该......
  • 前端新手如何用vite构建小程序中使用的模块(以AES加密模块crypto-js为例)
    如果你只是想简单地把在vite项目中使用的模块引入到小程序中,不妨试试库模式。以crypto-js为例,你需要写两个JS文件:一个是构建脚本,类似于vite.config.js;//build.cjsconst{build}=require('vite'),path=require('path');build({publicDir:false,configFile:false......
  • Hutool 实现非对称加密
    目录思路生成RAS密钥消息公钥加密、私钥解密代码Demo生成A的密钥生成B的密钥A发送消息给BB解密A消息对称加密中,我们只需要一个密钥,通信双方同时持有。而非对称加密需要4个密钥。通信双方各自准备一对公钥和私钥。其中公钥是公开的,由信息接受方提供给信息发送方。公钥用......
  • 加密狗复制方法的探究
    在数字版权保护日益重要的今天,加密狗作为一种常见的硬件加密手段,被广泛应用于各类软件产品中,以防止软件被非法复制和使用。然而,在技术不断发展的背景下,对于加密狗复制方法的探讨也随之而来。一、硬件克隆方式芯片级克隆原理:这种方法是直接对加密狗内部的芯片进行分析和复制......
  • HTTP 与 HTTPS:从明文传输到安全加密的全面解析
    下面这篇博客旨在全方位解读HTTP与HTTPS的来龙去脉、核心原理以及在现代网络中的广泛应用。为了帮助读者真正理解这两种协议如何支撑互联网生态,本篇文章不仅会介绍HTTP的发展历程,也会深入浅出地阐述HTTPS如何在安全层面保护用户数据,并展望未来网络的演化趋势。希望这篇......
  • 【Ansible运维】让Ansible更安全:使用Vault进行加密
    管理目标节点时,有些操作需要使用密码才允许访问,但Ansible是一个自动化配置管理工具,在自动化操作的阶段中要求交互式输入密码的行为应该是一件让人败兴的事。通常,实现非交互式的方案有:(1)将敏感数据写入文件(比如写入变量文件),然后读取,这种方案不安全;(2)定义敏感数据对应的环境......
  • 编译原理笔记第一篇_天书_(加密的)
    小序Abstract余闻,古有大贤能者,怀大神通,俱玄妙幽深之大法也。若晓习之,可使铁石通得人言。尝想往之,然不知其所在,故不得往,不知其名号,故不得访。或问曰:何不问旁人矣?呜呼哀哉!今人者,多搬来搬去之徒,目光短浅之辈,生性愚钝,盲然自大,罔识大法,问之空徒劳矣!某日夜中,余寐,飘飘乎神往,往而遇一......
  • 学习 - Nginx -浅谈非对称加密的理解
    浅谈非对称加密的理解1、客户端首次访问服务器的时候,先访问443接口后获取到“公钥”并保存在客户端。2、客户端通过通过80端口在发送请求的时候,报文中的明文信息通过(公钥+算法)加密成密位进行发送。3、服务器端获取到密文以后,通过(私钥+算法)解密,获取到请求报文中原有的明......
  • 【轻松掌握数据结构与算法】哈希(Hashing)
    什么是哈希?哈希是一种将任意长度的数据转换为固定长度的数据的技术。这个固定长度的数据通常被称为哈希值或哈希码。哈希函数是实现这一转换的关键,它接受任意长度的输入,并产生一个固定长度的输出。为什么使用哈希?哈希的主要用途之一是快速查找数据。通过哈希函数,我们可以将......
  • leetcode刷题记录(java)——参考代码随想录:数组 链表 哈希表
    四、题目之:代码随想录https://programmercarl.com/(1)代码随想录:数组704.二分查找classSolution{publicintsearch(int[]nums,inttarget){if(target<nums[0]||target>nums[nums.length-1]){return-1;}intleft=0......