dsy2224
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
一、MD5
(Message Digest Algorithm 5)是一种哈希函数。加密通常涉及使用密钥进行加密和解密,而哈希函数是单向的,将输入数据映射为固定长度的哈希值。MD5被广泛用于文件完整性校验、密码存储等场景,但由于存在安全漏洞,不再适用于对抗专业攻击。
以下是MD5的详细解释:
1. MD5算法的步骤:
a. 消息填充:
- 原始消息被填充以确保其长度是512位的整数倍。
b. 初始化缓冲区:
- MD5有一个128位的缓冲区,通常表示为四个32位的变量(A, B, C, D)。
- 这些变量在算法执行期间存储中间结果。
c. 处理消息块:
- 将填充后的消息划分为512位块。
- 每个块通过一系列步骤进行处理,包括逻辑函数、非线性函数、循环左移等。
d. 更新缓冲区:
- 在处理完每个消息块后,缓冲区的值会更新。
e. 生成摘要:
- 最终的MD5摘要由缓冲区中的四个变量连接而成。
2. 安全性问题:
a. 碰撞攻击:
- MD5容易受到碰撞攻击,即找到两个不同的输入产生相同的MD5哈希值。
- 这导致MD5不再适合用于对抗恶意攻击。
b. 速度:
- MD5是一种相对较快的哈希算法,这使得暴力破解和彩虹表攻击变得更为可行。
3. MD5的应用场景:
a. 文件完整性校验:
- MD5可用于验证文件的完整性,确保文件在传输或存储过程中没有被篡改。
b. 密码存储:
- 在早期,MD5被用于存储密码的散列值,但由于碰撞问题,现在更推荐使用更安全的密码哈希函数,如bcrypt、Argon2等。
4. 推荐替代方案:
- SHA-256和SHA-3:
- SHA-256(Secure Hash Algorithm 256-bit)和SHA-3是更安全的哈希函数,用于替代MD5。
- SHA-256产生256位哈希值,提供更大的安全性。
5. 使用MD5的注意事项:
- 不要在安全性要求高的场景使用:由于MD5存在安全漏洞,不建议在需要高安全性的场景中使用,如密码存储等。
- 考虑更安全的替代方案:如果需要哈希算法,推荐使用SHA-256或SHA-3等更安全的替代方案。
- 总体而言,MD5在安全性方面存在问题,因此在设计新系统或更改现有系统时,最好选择更安全的哈希算法。
6.MD5计算过程:
以"abc"为例,其ASCII码为97 98 99,转换为二进制为:
01100001 01100010 01100011
- 填充:在末尾填充1000 0000,然后添加原长度64位表示10000000000000000011,因此填充后总长度为448位。
- 初始化:A=0x67452301, B=0xEFCDAB89, C=0x98BADCFE, D=0x10325476
- 处理:将448位分为14个子块,每个子块进行4轮运算,详细步骤如下:
- 子块1: 01100001 01100010 01100011 1000 0000
- 子块2: 00000000000000000000000000000000 ...
- 子块14: 10000000000000000011
针对每个子块:
轮1:
- 将子块分为4个8位的M[i], 进行一次循环左移
- 计算: F := (B AND C) OR ((NOT B) AND D) g := F + A + M[i] + K[i] A := D D := C C := B B := B + LEFTSHIFT(g, s[i])
轮2-4:同样的步骤,只是使用不同的K[i]和s[i]
- 输出:将最后得到的A,B,C,D连接就是结果: A = 0xC3D2E1F0 B = 0xBA4D388F C = 0xA30C2593 D = 0x7B61435C
连接后MD5值为:C3D2E1F0BA4D388FA30C25937B61435C
所以"abc"的MD5哈希值为:C3D2E1F0BA4D388FA30C25937B61435C
以上就是MD5算法的详细计算步骤和过程。可以看出MD5通过迭代运算、模加、位运算等手段来产生消息摘要,能够很好的保证散列结果的随机性。
二、SHA
SHA,全称为安全散列算法(Secure Hash Algorithm),是一组密码学哈希函数的家族,由美国国家安全局(NSA)设计。SHA算法被广泛用于计算和验证数据的哈希值,通常用于确保数据的完整性、数字签名和密码学安全协议等方面。SHA算法家族包含多个版本,其中最常见的是SHA-1、SHA-256、SHA-384和SHA-512。
SHA算法的基本原理:
消息填充:将输入消息填充,以确保其长度符合算法的要求。
初始化:设置初始的哈希值(称为初始向量)。
处理消息块:将填充后的消息划分成固定大小的块,然后对每个块进行一系列的运算,包括位运算、逻辑函数、循环操作等。
更新哈希值:在处理完每个块后,更新哈希值,将其作为下一个块的输入。
生成摘要:最终得到的哈希值即为消息的摘要。
SHA-1、SHA-256、SHA-3的区别:
SHA-1:
- 输出长度:160位。
- 安全性问题:已被广泛认为不再安全,因为存在碰撞攻击。
SHA-256:
- 输出长度:256位。
- 安全性:目前是安全的,适用于许多应用领域,包括数字签名、SSL证书等。
SHA-3:
- 输出长度:可选,支持不同的输出长度(224、256、384、512位)。
- 安全性:目前是安全的,是NIST竞赛中选出的最新标准。
SHA加密的步骤:
选择合适的SHA算法:根据安全性和性能要求选择合适的SHA版本,如SHA-1、SHA-256、SHA-3。
消息填充:将输入消息填充,使其长度符合算法的要求。
初始化哈希值:设置初始的哈希值,这是一个固定的初始向量。
处理消息块:将填充后的消息划分成块,对每个块进行一系列的运算,更新哈希值。
生成摘要:最终的哈希值即为消息的摘要
SHA加密算法的计算过程:
SHA-1是一种广泛使用的安全散列算法。它可以将任意长度的数据作为输入,生成一个160位的消息摘要。
SHA-1的计算过程可概括为以下步骤:
- 填充:将原始数据填充到448位的整数倍。填充方法是先添加1,然后添加0,最后添加原始数据长度的64位二进制表示。
- 初始化缓冲区:设置5个32位缓冲区,分别初始化为某些固定值。
- 处理数据:对512位数据分块进行80次循环运算。每次将消息块分割,然后通过位运算、模加、循环左移等改变缓冲区的值。
- 输出:经过80次运算后,输出5个缓冲区连接起来的160位哈希值。
接下来以"abc"为例,详细说明SHA-1的计算过程:
- 填充:"abc"转换为比特流为 011000010110001001100011,填充10001和原长度000 011,总长度为448位。
- 初始化:A=0x67452301, B=0xEFCDAB89, C=0x98BADCFE, D=0x10325476, E=0xC3D2E1F0
- 处理:对512位进行80次循环运算,每次将消息块分为80个子块W[i],然后进行位运算更新ABCDE的值。
- 输出:经过计算,得到ABCDE的值分别为:
A = 0x34AA973C B = 0xD4C4DAA4 C = 0xF61EEB2B D = 0xDBAD2731 E = 0xC340DF5F
将ABCDE连接起来,得到SHA-1哈希值为:34AA973CD4C4DAA4F61EEB2BDBAD2731C340DF5F
所以"abc"的SHA-1哈希值为:34AA973CD4C4DAA4F61EEB2BDBAD273 1C340DF5F
以上详细步骤展示了SHA-1的计算过程,通过多轮运算来混淆原始信息,产生一个160位长度的指纹。这大大提高了算法的碰撞难度,能用于数字签名等安全场景。
三、ASC
ASCII(American Standard Code for Information Interchange)。ASCII是一种字符编码标准,它将字符映射到数字,定义了128个字符,包括英文字母、数字、标点符号和一些控制字符。这个编码方案旨在使不同计算机和设备之间的文本数据交换更加一致。
ASCII编码基础:
字符映射:每个ASCII字符都有一个对应的数值,范围从0到127。例如,大写字母"A"对应的ASCII值是65,小写字母"a"对应的ASCII值是97。
可打印字符和控制字符:ASCII字符被分为可打印字符和控制字符。可打印字符是可以显示在屏幕上的字符,而控制字符通常用于控制设备和通信。
扩展ASCII:初始的ASCII标准只包括基本的拉丁字母、数字和一些标点符号。扩展ASCII在其后增加了更多字符,使其支持不同的语言和符号。
ASCII编码示例:
以下是一些常见字符的ASCII编码示例:
- 大写字母 "A" 的ASCII码是 65。
- 小写字母 "a" 的ASCII码是 97。
- 数字 "0" 到 "9" 的ASCII码是 48 到 57。
- 空格的ASCII码是 32。
- 符号 "!" 的ASCII码是 33。
扩展ASCII:
扩展ASCII在标准ASCII的基础上增加了更多字符,包括特殊字符、附加的拉丁字母、希腊字母等。这使得ASCII编码不仅可以表示英文字符,还能支持其他语言和符号。
注意事项:
编码长度:每个ASCII字符都用一个字节(8位)表示。这意味着ASCII编码可以在计算机系统中非常高效地存储和传输。
有限字符集:ASCII编码只定义了128个字符,不足以表示所有语言和符号。对于更广泛的字符集,如Unicode,被用来支持全球范围内的文本表示。
ASC是一种编码方式:
ASC编码就是将字符按照ASCII码表进行编码,比如:
- 'a'的ASCII码是97,所以'a'的ASC码就是97。
- 'b'的ASCII码是98,所以'b'的ASC码就是98。
具体来说,ASC编码的计算步骤是:
- 对输入的字符串逐个字符进行处理。
- 对每个字符,查询ASCII编码表找到其对应的数字代码。
- 将每个字符的ASCII码连接起来,就构成了最终的ASC编码。
比如对字符串"abc"进行ASC编码:
- 'a'的ASCII码是97
- 'b'的ASCII码是98
- 'c'的ASCII码是99
- 连接每个字符的ASCII码,最终得到ASC编码:979899
所以"abc"的ASC编码结果是:979899
ASC编码实际上就是一种字符集编码,它对文本没有任何的加密转换,只是简单地将字符转换为ASCII码。通常ASC编码更多地用于数据存储、传输时对字符进行数字化处理,而不是用于加密安全场景。
四、进制算法
进制是一种表达数字的方法,常见的有二进制、八进制、十进制和十六进制。具体算法如下:
- 二进制
二进制用0和1两个数字来表示,每位称为一个比特(bit)。二进制数转换为十进制的方法是,从右向左,每位数字乘以2的指数幂,然后求和。
例如:11001101 转换为十进制数:
1 × 2^7 + 1 × 2^6 + 0 × 2^5 + 0 × 2^4 + 1 × 2^3 + 1 × 2^2 + 0 × 2^1 + 1 × 2^0 = 205
所以11001101的十进制数是205。
- 八进制
八进制用0-7的8个数字来表示,每位称为一个字节(oct)。八进制数转换为十进制的方法是,从右向左,每位数字乘以8的指数幂,然后求和。
例如:3271转换为十进制数:
1 × 8^0 + 7 × 8^1 + 2 × 8^2 + 3 × 8^3 = 2145
所以3271的十进制数是2145。
- 十六进制
十六进制用0-9和A-F共16个数字来表示,每位称为一个字节(hex)。转换方法是从右向左,每位数字乘以16的指数幂,然后求和。
例如:9F16 转换为十进制数:
F × 16^1 + 9 × 16^0
= 15 × 16 + 9 = 255
所以9F16的十进制数是255。
以上是几种常见进制的算法解析和示例,可以看出不同进制之间可以通过指数运算实现转换。掌握各种进制的转换算法对于理解和应用计算机科学非常重要。
五、BASE64
BASE64编码算法:
- 定义
BASE64编码是一种将二进制数据转换成文本字符串的编码算法。它的主要目的是确保数据能够在不丢失信息的情况下以ASCII文本的形式传输。BASE64编码通常用于电子邮件、XML文档、URL参数等需要文本表示的场景。
- 原理
BASE64的编码原理是,将3个8位字节(38=24位)转化为4个6位的字节(46=24位)。如果要编码的字节数不是3的整数倍,最后会剩下1个或2个字节,则需要填充0,使其达到3的整数倍。
- 编码步骤
(1) 将输入的原始二进制数据以3个字节一组拆分。
(2) 对每组输入的3个字节(24位),按6位一组总共分为4组。
(3) 在编码表中查找每6位对应的BASE64编码,该编码是一个可打印字符。
(4) 将查找到的4个编码字符连接成一个字符串,作为该3字节组的BASE64编码结果。
(5) 对所有的字节组重复步骤2-4,就可以得到整个数据的BASE64编码。
(6) 如果原始数据不是3的倍数,最后一组剩余1或2个字节,需要填充0达到3字节,然后正常编码。
- 解码步骤
BASE64解码的过程是编码的逆过程:
(1) 查表将Base64编码中的字符转换为6位二进制数据
(2) 每取4组6位的编码,转换为3字节(3*8=24位)的数据
(3) 去掉编码时填充的0,就可以恢复原始数据
- 示例
原始数据:Hello World
ASCII码: 48 65 6c 6c 6f 20 57 6f 72 6c 64
分组:48 65 6c 6c 6f 20 57 6f 72 6c 64 00 (填充了2个字节0)
编码:SGVsbG8gV29ybGQ=
以上就是BASE64编码的超级详细介绍了,它通过查表编码、填充等手段,可以将任意二进制数据转换为一种可打印的文本编码,适合在文本传输场景下表示二进制数据。
六、Unescape
Unescape的原理和用法:
- 定义
Unescape是一种编码/解码算法,可以对含有十六进制转义序列的字符串进行解码,恢复原始的数据。
- 原理
Unescape会查找字符串中的转义序列,转义序列的格式为\x
+两位十六进制数。比如\x41
表示字符'A'。
Unescape会将这些转义序列转换为对应的ASCII字符。
- 编码过程
对原始字符串进行Escape编码的过程:
(1) 遍历字符串的每个字符
(2) 如果是正常可打印字符,不变
(3) 如果是不可打印字符,转换为\x
+该字符对应的两位十六进制表示
(4) 拼接最终编码后的字符串
- 解码过程
Unescape进行解码的过程:
(1) 遍历编码后的字符串
(2) 如果遇到\x
开头的转义序列,取后两位十六进制数
(3) 将十六进制数转换为对应的ASCII字符
(4) 其余部分不变
(5) 拼接最终解码后的字符串
- 示例
原始字符串:Hello World!
编码后:\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21
解码后:Hello World!
以上就是Unescape的超级详细介绍了,它可以对转义后的字符串进行解码,恢复原始数据。这种编码方式可以用于不同系统之间传递一些二进制数据。
七、AES
AES加密算法:
AES,全称为高级加密标准(Advanced Encryption Standard),是一种对称密钥加密算法,广泛用于保护敏感数据的安全性。AES是由比利时密码学家Joan Daemen和Vincent Rijmen设计的,于2001年被美国国家标准技术研究所(NIST)采纳为替代DES的加密标准。
工作原理:
- 替代-置换网络(Substitution-Permutation Network, SPN):AES采用SPN结构,包括四个主要操作:字节替代(SubBytes),行移位(ShiftRows),列混淆(MixColumns),和轮密钥加(AddRoundKey)。
密钥长度:
- AES支持不同的密钥长度,包括128位、192位和256位。
- 密钥长度不同,加密轮数也会随之改变。分别是10轮、12轮和14轮。
数据处理:
- AES将明文分成一个4x4的矩阵,被称为状态矩阵(State)。
- 每个字节在状态矩阵中进行替代、移位、混淆和与轮密钥的异或操作。
密钥扩展:
- AES使用密钥扩展算法,将初始密钥扩展成轮密钥,用于每轮加密过程中与状态矩阵进行异或操作。
- 密钥扩展算法采用了Rijndael算法中的逆变换。
加密过程:
- 初始化轮:将明文与初始轮密钥进行异或操作。
- 轮数循环:每一轮包括SubBytes、ShiftRows、MixColumns和AddRoundKey四个步骤。
- 最后一轮没有MixColumns步骤。
解密过程:
- 解密过程与加密过程类似,但是使用的是轮密钥的逆操作,包括逆SubBytes、逆ShiftRows、逆MixColumns和AddRoundKey。
安全性:
- 目前AES被广泛认为是安全可靠的加密算法,尤其在密钥长度足够长的情况下。
- 对AES进行成功的攻击需要比穷举更为高级的技术,如差分攻击、线性攻击等。
应用领域:
- AES广泛应用于各种领域,包括网络通信、数据存储、加密文件和电子商务等。
- 它被许多国家政府和组织采纳为加密标准,包括美国政府的敏感信息保护。
总体而言,AES是一种高效且安全的对称密钥加密算法,适用于当前的各种安全通信和数据保护需求。其设计经过广泛的评估和审查,成为当今世界上最常用的对称密钥加密算法之一。
AES加密的详细计算过程:
假设明文为:“Hello World”
密钥为:0x00010203 04050607 08090a0b 0c0d0e0f
AES-128使用128位密钥,进行10轮变换。计算步骤如下:
- 将明文转成字节数组并补齐到16的整数倍长度
明文字节数组为:48 65 6c 6c 6f 20 57 6f 72 6c 64
填充为:48 65 6c 6c 6f 20 57 6f 72 6c 64 80 00 00 00 00 00 00 00 00
- 初始轮密钥加
将密钥进行扩展,得到初轮密钥0x00010203 04050607 08090a0b 0c0d0e0f
与明文第一个块进行异或,结果为:4d 64 6b 6f 2d 52 7b 61 73 61 60 60 60 60 60 60 60
- 进行9轮变换
每轮包括SubBytes、ShiftRows、MixColumns和AddRoundKey。
最后一轮不包括MixColumns。
- 终结轮变换后得到密文块:
69 c4 e0 d8 6a 7b 04 30 d8 cd b7 80 70 b4 c5 5a
重复上述步骤对剩余明文块进行加密,最终得到密文。
解密过程则是相反的操作,使用逆S盒和逆列混淆,以及逆轮密钥加来恢复明文。
这样就完成了AES的一个详细的加密和解密计算例子,明确了其中字节替换,行/列变换和轮密钥加的计算步骤。
八、DES
DES,即数据加密标准(Data Encryption Standard),是一种对称密钥加密算法,由美国国家标准局(NIST)于1977年采纳并发布为联邦信息处理标准(FIPS PUB 46)。DES是一种块密码(block cipher)算法,它将明文按照64位的块进行加密,使用56位的密钥。
工作原理:
- 初始置换(Initial Permutation):明文按照一定规则进行初始排列。
- 轮函数(Round Function):DES有16轮加密过程,每轮使用子密钥对数据进行混合和置换。
- 密钥调度算法(Key Schedule Algorithm):56位的密钥通过置换和旋转操作生成16个子密钥。
数据处理:
- 分组:将64位的明文分成两个32位的半块。
- 子密钥:每轮使用一个不同的子密钥,这些子密钥是通过主密钥进行处理得到的。
- 替代(Substitution)和置换(Permutation):使用S盒进行替代,然后进行一系列的置换操作。
S盒:
- DES中包含8个不同的4x16的置换表,被称为S盒。
- S盒的作用是将每个6位的数据块映射到一个4位的输出块。
密钥生成:
- DES使用56位的密钥,但实际上只有其中的48位被用于加密过程。
- 密钥调度算法通过对56位密钥进行置换和旋转,生成16个48位的子密钥。
加密过程:
- 明文首先经过初始置换,然后分成左右两个32位的半块。
- 迭代16轮,每轮对右半块进行扩展、与子密钥进行异或运算,然后通过S盒和P盒进行替代和置换。
- 最后将左半块与右半块进行交换,形成下一轮的输入。
解密过程:
- 解密过程与加密过程相似,但是子密钥的应用顺序是相反的。
- 即,解密时使用的第一个子密钥是加密时使用的最后一个子密钥,依次类推。
安全性:
- DES的56位密钥长度在今天的计算能力下已经不够安全,因此DES不再被推荐用于实际的安全通信。
- DES的主要问题之一是密钥空间较小,可以通过穷举攻击进行破解。
后续替代:
- 由于DES的安全性问题,现在更常用的对称密钥加密算法包括AES(高级加密标准)等。
DES加密的详细计算过程:
假设明文为:“Hello World”
密钥为:0x133457799BBCDFF1
DES以64位为一个块,进行16轮Feistel结构变换。计算步骤如下:
- 对明文进行填充,每个块扩展为64位
明文块1: 48 65 6c 6c 6f 20 57 6f
明文块2: 72 6c 64 80 00 00 00 00
- 明文块1初始IP置换,结果为:
20 70 6c 5f 2d 6e 19 67 3b 7c 73 14 38 34
- 第一轮Feistel变换
- 将32位R部分进行E扩展和子密钥异或
- 将48位输入进行S盒替换,结果为:
- P置换后与L部分异或作为新R输入
如此重复16轮后,进行逆IP置换,得到密文块1。
- 对明文块2执行相同的过程,得到密文块2。
- 最终密文为两个块的组合。
解密只需使用逆置换、逆S盒和反序子密钥即可恢复明文。
这样就完成了一个DES加密的计算示例,说明了其中位扩展、置换、异或、S盒等操作的执行流程。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)