【密码学】一文了解密码学的基本

发布于:2025-03-30 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

一、密码学基础概念

1.1 密码学定义 

1.2 加密算法类型

1.3 其他密码技术

1.4 隐写术与数字水印

1.5 密码与信息安全常识

二、历史上的密码

2.1 恺撒密码及加密轮盘 

2.2 简单替换密码

2.3 维吉尼亚密码

2.4 Enigma密码机

三、Base64编码

3.1 Base64编码介绍

3.2 Base64编码举例

四、对称密码

4.1 对称密码介绍

4.2 DES(Data Encryption Standard)

4.2.1 DES的加密与解密

4.2.2 Feistel网络的加密一轮循环

4.2.3 Feistel网络的加密多轮循环

4.2.4 Feistel网络的解密一轮循环

4.2.5 Feistel网络的解密多轮循环

4.2.6 Feistel网络密码算法特点

4.2.7 DES算法的实现

4.2.8 3DES

4.3 AES(Advanced Encryption Standard)

五、公钥密码

5.1 公钥密码简介

5.2 公钥密码原理

5.3 RSA密码

5.4 RSA密码 - 生成密钥对

5.5 RSA密码 - 实例


一、密码学基础概念

1.1 密码学定义 

        专门研究编制密码和破译密码的技术科学。例如小杨(发送者)为防止小齐(窃听者)知晓,与小芬(接收者)约定暗号(密钥key)对信息加密,只有小芬能解密,其中涉及明文、密文、加密、解密、消息等概念。


1.2 加密算法类型

        算法分加密算法和解密算法,最重要的是密钥(key),常见加密解密算法有对称加密和非对称加密。


1.3 其他密码技术

- 单向散列函数:能针对文件信息算出散列值,这个散列值就如同文件的电子身份证号。只要文件内容被修改,散列值也会跟着改变。
- 数字签名:给文件加上类似手写在纸上那种物理签名的数字签名,通常借助非对称加密算法来完成。
- 数字证书:在互联网通讯过程中,用来标志通讯各方身份信息的一串数字,由专门的证书授权(CA)机构负责颁发 。


1.4 隐写术与数字水印

        隐写术是在数据中隐藏信息,如将另一句话嵌在一段话中,每句话首字连起来构成隐藏信息。数字水印技术应用隐写术,将版权或签名信息嵌入文件。

1.5 密码与信息安全常识

        - 千万别用自创的加密算法。公开的加密算法都经过数学家论证,相对可靠。那些没公开的算法,早晚会被曝光,到时候安全性就无法保障了。
        - 低强度的密码不仅起不到保护作用,还可能因被轻易破解,给使用者带来严重损失,这种情况下,还不如不设置密码。
        - 随着时间推移,任何密码都可能被破解,只是时间长短的问题。
        - 密码仅仅是信息安全体系的一个环节。黑客常常会通过社会工程学手段骗取密码,从而导致信息泄露。

        信息安全至关重要,我们应当选择合适的密码算法对信息进行加密。不同的密码算法适用于不同场景,在信息传递过程中,要时刻警惕,防止信息被窃听,避免密码被盗取 。

二、历史上的密码

2.1 恺撒密码及加密轮盘 

        相传尤里乌斯·恺撒使用,用于古罗马军事信息通信,原理是平移算法(小写字母明文,大写字母密文,平移3位)。

        有加密轮盘(平移3位,key为3),解密通过反向平移,破解可用暴力破解(尝试不同key值)。


2.2 简单替换密码

        有一种密码编制方法,是把字母表打乱,让打乱后的字母与原字母表中的字母一一对应,将这种对应关系当作密码。恺撒密码就属于这一类。

        在进行加密操作时,需要制作一张加密字母表,然后对照它对明文进行加密。解密的时候,则对照原本的明文字母表来还原信息。

        这种密码破解起来相当困难。要是采用暴力破解法,由于加密字母表是26个字母的全排列,可能性极其多,数量大约是4兆的1000兆倍,需要尝试海量组合。除了暴力破解,还能采用频率分析法,也就是统计文本中各个字母出现的频率,以此来推断密码规律。另外,还能运用逆向分析,像福尔摩斯探案集《跳舞的小人》里,就是通过逆向推理破解了密码。


2.3 维吉尼亚密码

        掩盖字母使用频率的古老方式。加密时明文对应一串密钥,根据密钥在维吉尼亚密码表中生成密文;解码同理,根据密文和密钥查表找出明文。

维吉尼亚密码的加密原理明文对应的会有一串密钥,根据密钥在维吉尼亚密码表中生成密文
举例:
加密:hacker
密钥:hello
查表生成密钥
在表中找到明文横坐标与密钥纵坐标交叉点为密文

维吉尼亚密码的解码
明文对应的会有一串密钥,根据密钥在维吉尼亚密码表中生成密文
举例:
密文:oenvsy
密钥:hello
查表对照密文和密钥找出明文


2.4 Enigma密码机

        在二战时期,纳粹德国使用了一种加密强度很高的密码机,叫Enigma密码机。后来,英国的图灵成功破解了这种密码机。这件事充分说明了,密码安全对于国家安全有着极其关键的作用。

        密码的发展历史悠久,从古老的恺撒密码,再到二战时的Enigma密码机,密码的复杂程度在持续提升。发展到现在,密码已经成为一门独立的学科。在现代,对称密码和非对称密码是最为常见的密码类型 。

三、Base64编码

3.1 Base64编码介绍

        由64个Ascii码表组成,包括A-Z、a-z、0-9、+、/ 64个字符表示64种状态,64个字符表示6位二进制所有状态(2⁶),3个字节24位用Base64表示需4个字符(3*8 = 4*6)。


3.2 Base64编码举例

    - 正常情况(如文本“Man”):3个字节拆成4个字节,每个字节根据值在Base64表中获取字符。


    - 不足三字节特殊情况(如文本“A”):1个字节取前6位,剩余2位用0补齐6位,不够4字节后面补等号(=);文本“BC”同理。

四、对称密码

4.1 对称密码介绍

        咱们可以通过魔术师洗牌和复原扑克牌的例子,来理解对称加密的概念。魔术师把原本整齐的牌(就相当于明文)打乱(这一步等同于加密),得到乱牌(也就是密文)。之后,魔术师又能把乱牌恢复成原本整齐的状态(这就好比解密)。之所以魔术师能在原牌和乱牌之间随意切换,是因为他洗牌(加密)和复原(解密)的过程是相反的。这种加密和解密过程互逆的加密方式,就是对称加密。

对称密码原理及特点

1. 借助密钥(key)实现数据的加密与解密。
2. 采用分组xor加密方式,例如对16进制数6555(二进制110010101010101),以密钥011011111011011进行异或运算,得到密文101001010001110。

4.2 DES(Data Encryption Standard)

        1977年,DES被列入美国联邦信息处理标准(FIPS 46 - 3),成了一种对称密码算法。当时,美国以及其他国家的政府部门、银行,都大量使用DES来保障信息安全。

        但计算机技术发展得越来越快,DES被暴力破解所花费的时间越来越短。以RSA公司举办的DES破译比赛为例,1997年破解DES需要96天,到1999年,就只需要22小时15分钟了。如今,除了用来解密以前用DES加密的旧密文,已经不提倡再使用DES算法了。

4.2.1 DES的加密与解密

        DES将64bit的明文加密为64bit的密文,虽密钥长度标称64bit,但每7bit会设置一个用于错误检查的bit,实际密钥长度为56bit。DES每次仅能加密64bit,若明文较长,需对DES加密进行迭代,迭代的具体方式称作模式。

        DES基于Feistel网络,这是一种典型的分组密码结构,由Horst Feistel设计。在Feistel网络中,加密步骤称为轮,DES进行16轮循环。


4.2.2 Feistel网络的加密一轮循环

1. 第一步,将输入的数据一分为二,划成左右两部分。
2. 把输入数据右侧部分,直接挪到输出数据的右侧位置。
3. 把刚才输入数据的右侧部分,送到轮函数里。
4. 轮函数根据送进来的右侧数据,再结合子密钥,计算出一串看起来毫无规律的bit序列。
5. 拿算出来的这串bit序列,和左侧数据进行XOR运算,运算结果就当作加密后的左侧数据。因为第一轮处理后右侧数据还没加密,所以得用不同子密钥,反复进行这一轮操作。并且,在每两轮操作中间,要把左侧和右侧数据位置对调,保证所有数据都能被加密 。

4.2.3 Feistel网络的加密多轮循环

1. 第一轮加密左侧。
2. 第二轮加密右侧。
3. 第三轮加密左侧。需注意,每轮使用的子密钥不同。


4.2.4 Feistel网络的解密一轮循环

1. 把输入数据分成左右两部分。
2. 将输入的右侧数据直接发送到输出的右侧。
3. 把输入的右侧数据传入轮函数。
4. 轮函数依据右侧数据和子密钥,算出看似随机的bit序列。
5. 将上述bit序列与左侧数据进行XOR运算,结果作为解密后的左侧数据。解密和加密过程完全相同,使用相同子密钥即可完成解密。

4.2.5 Feistel网络的解密多轮循环

1. 第一轮解密左侧,使用子密钥3。
2. 第二轮解密右侧,使用子密钥2。
3. 第三轮解密左侧,使用子密钥1。需注意,每轮解密使用的子密钥顺序与加密相反。

4.2.6 Feistel网络密码算法特点

1. 加密轮数可随意增加。
2. 加密时,任何函数作为轮函数都能正常解密。
3. 加密和解密可采用完全相同的结构,同样基于Feistel网络分组算法实现的密码算法还有MARS、RC6、Twofish。

4.2.7 DES算法的实现

1. 对输入的64bit数据,按置换IP表打乱顺序。
2. 左侧加密公式:左侧 + 轮函数f(右侧,子密钥)。
3. 左侧和右侧都经过16轮加密,每次使用的密钥不同。
4. 获取子密钥。
5. 对最后输出前的64bit数据,按尾置换IP表2替换位置。

4.2.8 3DES

3DES即三重DES(triple - DES),为增强DES强度,将DES重复3次得到。其有几种类型:
1. DES密钥1和DES密钥3相同,DES密钥2不同,称作DES-EDE2。
2. DES密码1、2、3都不同,称作DES-EDE3。
3. DES密钥都相同,等同于DES。

4.3 AES(Advanced Encryption Standard)

        AES已经替代DES,成了新的对称密码算法标准。AES基于2000年评定通过的Rijndael算法,这套算法由比利时密码学家Joan Daemen和Vincent Rijmen设计。Rijndael算法的分组长度固定为128位,密钥长度能在128位到256位之间选择,而且是以32位为一档。在AES标准里,规定的密钥长度就三个:128位、192位和256位。

Rijndael算法加密步骤
1. **SubBytes处理(置换)**:把数据分组后,每个字节都有一个值,范围在0到255之间。以这个值作为索引,到一张有256个值的替换表(S - Box)里找到对应值,将原本的1字节值换成找到的值。
2. **ShiftRows处理(乱序)**:完成SubBytes处理后,输出结果按字节打乱顺序。
3. **MixColumns处理(移位)**:对4字节的数据做位运算,让它变成另外一个4字节值。
4. **AddRoundKey处理(异或)**:将数据与轮密钥进行XOR运算。整个加密过程中,这一步要重复10到14轮。

Rijndael算法解密步骤
1. AddRoundKey处理。
2. InvMixColumns处理,是MixColumns处理的逆向操作。
3. InvShiftRows处理,是ShiftRows处理的逆向操作。
4. InvSubBytes处理,是SubBytes处理的逆向操作。

        一般来说,使用密钥长度够长,而且算法没漏洞的对称密码,就能保证明文信息不被泄露。长密钥能抵抗暴力破解,没有漏洞的算法可以防止其他类型的攻击。但对称密码在通信时,最大的难题就是密钥配送,也就是怎么安全地把密钥传给接收方。要解决这个问题,通常得靠公钥密码。DES和三重DES的分组长度是64位,而AES的分组长度有128位、192位和256位可选。

五、公钥密码

5.1 公钥密码简介

        公钥密码技术的诞生,就是为了解决对称密码技术存在的两个大难题。第一个难题是对称密码在密钥分配方面存在安全隐患,第二个难题是对称密码无法进行数字签名。

        1976 年,Diffie和Hellman在《密码学的新方向》这篇文章里,首次提出了公钥密码的概念,这也标志着公钥密码学研究正式开启。到了1977 年,Rviest、Shmair和Adlmena提出了RSA算法,这是第一个比较成熟的公钥密码算法。从那以后,人们基于各种不同的计算问题,又提出了很多公钥密码算法。

        在公钥密码体系里,密钥分为加密密钥和解密密钥。发送消息的人用加密密钥对消息加密,接收消息的人用解密密钥对密文解密。也就是说,发送者只需要加密密钥,接收者只需要解密密钥。这里要注意,解密密钥绝对不能被窃听者拿到,不过就算加密密钥被窃听者获取了,也不会造成太大影响。因此,加密密钥可以公开,我们把它叫做公钥;解密密钥不能公开,叫做私钥。公钥和私钥配套使用,组成密钥对。

举个例子,Bob和Alice要进行通信:
1. Bob生成一对密钥,也就是公钥和私钥。
2. Bob把公钥发送给Alice。
3. Alice拿到Bob的公钥后,用它对要发送的消息进行加密。
4. Alice将加密后的密文发送给Bob。
5. Bob收到密文后,用自己的私钥进行解密,就能读取消息的原文了 。

5.2 公钥密码原理

        公钥密码之所以安全,关键就在于,即便知道了公钥,也很难算出私钥。公钥密码机制的运行有两个前提:一是密文通过明文和公钥计算得到;二是明文能通过密文和私钥计算出来。设计公钥密码时,目标是让从明文到密文的正向计算简单,而从密文反推明文的逆向计算变得困难,这一目标通过特定数学问题来达成。

        下面介绍一些相关数学运算概念。日常中,我们熟悉加减乘除运算;模运算,简单来说,就是求余数的运算。质数,是只能被1和它自身整除的数;合数,就是除了能被1和本身整除外,还能被其他数整除的数。一个数的倒数,和它相乘结果为1。约数指的是能整除给定数的数;倍数则是给定数的整数倍。公约数是几个数共有的约数,其中最大的就是最大公约数;公倍数是几个数共有的倍数,其中最小的就是最小公倍数。对数是乘方的逆运算,而在模运算里的对数,叫做离散对数。

        离散对数有个特性,正向计算比较容易,逆向计算却很困难。以7²mod 13 = 8为例,如果要找出满足7^? mod 13 = 8中的?,采用从0开始逐个尝试的方法,计算量非常大。要是底数7足够大,且无法化简,逆向计算的难度会更高。RSA算法正是基于这一原理设计的。

5.3 RSA密码

        RSA是公钥密码算法,名称由三位开发者Ron Rivest、Adi Shamir、Leonard Adleman的姓氏组成,可用于公钥密码和数字签名。
RSA加密和解密过程
1. 密钥对:公钥由数E和数N组成,私钥由数D和数N组成。
2. 加密:密文 = 明文^E mod N,即明文的E次方除以N的余数。
3. 解密:明文 = 密文^D mod N,即密文的D次方除以N的余数。

5.4 RSA密码 - 生成密钥对

由于E和N是公钥,D和N是私钥,生成密钥对即求E、D、N这三个数。
生成步骤
1. 求N:N = p × q,p和q是大质数,数太小易被破解,且质数不可分解。
2. 求L:L仅在生成密钥对过程中使用,是p - 1和q - 1的最小公倍数,公式为L = lcm(p - 1, q - 1)。
3. 求E:E比1大、比L小,且E和L的最大公约数为1,即gcd(E, L) = 1 (E和L互质)。通过伪随机数生成器生成1 < E < L范围内E的候选数,判断是否满足gcd(E, L) = 1的条件,循环判断直至条件成立,求最大公约数可使用欧几里得辗转相除法。满足gcd(E, L) = 1能保证存在解密的数D。
4. 求D:数D由数E计算得到,D、E、L需满足1 < D < L,E × D mod L = 1。满足该条件,就能通过D和N对用E和N加密的密文进行解密,确保解密得到原明文。
总结求值公式
1. 求N:N = p × q,用伪随机数生成器求p和q,p和q都是质数。
2. 求L:L = lcm(p - 1, q - 1),L是p - 1和q - 1的最小公倍数。
3. 求E:1 < E < L,gcd(E, L) = 1,E和L的最大公约数是1(E和L互质)。
4. 求D:1 < D < L,E × D mod L = 1。

5.5 RSA密码 - 实例

1. 求N:N = p × q,设p = 17,q = 19(17、19都是质数),则N = 17 × 19 = 323。
2. 求L:L是p - 1和q - 1的最小公倍数,L = lcm(p - 1, q - 1) = lcm(16, 18) = 144。
3. 求E:E和L的最大公约数必须是1,即gcd(E, L) = 1,满足条件的有5、7、11、13、17、19、23……,选择E = 5。
4. 求D:E × D mod L = 1,即5 × D mod 144 = 1,得出D = 29。
生成密钥对
1. 公钥:E = 5,N = 323。
2. 私钥:D = 29,N = 323。
使用公钥加密明文
设明文 = 123,且明文必须小于N。加密:密文 = 明文^E mod N = 123⁵mod 323 = 28153056843 mod 323 = 225。
使用私钥解密明文
解密:明文 = 密文^D mod N = 225²⁹mod 323 = 123。
破解难度分析
1. 通过密文获取明文:公式为明文 = 密文^D mod N,求密文^D相当于求对数,求密文^D mod N相当于求离散对数,这是世界难题。
2. 暴力破解:求出D就能解密,但D足够大时,暴力破解难度极大。
3. 通过E和N求出D:加密时密文 = 明文^E mod N,若N能分解求出p和q,就能求出D。大整数质因数分解是世界难题,若伪随机数生成器算法差,存在碰撞成功从而破解的可能。