目录
4.2 DES(Data Encryption Standard)
4.3 AES(Advanced Encryption Standard)
一、密码学基础概念
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。大整数质因数分解是世界难题,若伪随机数生成器算法差,存在碰撞成功从而破解的可能。