
SHA-256算法
哈希算法 (Hash Functions)
哈希算法将输入数据(如文件或消息)转换为固定长度的散列值。其数学基础涉及有限域运算、布尔代数和加密原语。值得注意的是,哈希算法并非加密算法,它具有单向性,也就是说无法从哈希值反推出原始数据。不过,可以使用暴力破解的方式来尝试找到能生成相同哈希值的原始数据。
-
常见算法:
-
SHA-256 (Secure Hash Algorithm 256-bit):
-
数学基础:SHA系列算法基于Merkle-Damgård结构,使用布尔运算和消息扩展函数,设计时考虑抗碰撞攻击。
-
应用:常用于数据完整性校验、数字签名和区块链中的工作量证明(PoW)机制。
-
MD5 (Message Digest Algorithm 5):
-
数学基础:与SHA类似,MD5使用迭代和置换操作将消息压缩为128位的散列值。
-
应用:尽管已不再安全,MD5曾广泛用于数据验证和文件校验。
-
优点:
-
散列值固定,无法从散列值反推出原始数据。
-
常用于数据完整性检查。
-
缺点:
-
哈希算法存在碰撞风险:两个不同输入可能产生相同的哈希值。
-
一些算法(如MD5)已经被证明不再安全。
SHA算法
SHA(Secure Hash Algorithm)是由美国国家安全局(NSA)设计的哈希函数族。SHA算法通过对输入数据进行哈希计算,生成固定长度的哈希值,广泛应用于数字签名、信息完整性验证等领域。SHA算法的安全性依赖于输入的长度和处理速度。
# SHA家族的算法
SHA算法家族包含多个不同的版本,主要包括SHA-0、SHA-1、SHA-2和SHA-3系列。每种算法的特点和安全性各不相同。
#SHA256原理
- 数据填充
在消息末尾添加一个1位的比特。
然后添加若干个0位,直到消息的长度接近512的倍数。
最后,消息的长度(以比特为单位)以64位二进制形式追加到消息的末尾。
假设我们有一个消息"abc",其长度为3字节(24比特)。我们来详细计算这个消息如何填充至512位。
a= 01100001
b= 01100010
c= 01100011
原始数据:(a)01100001/(b)01100010/(c)01100011
01100001/01100010/01100011/1 ——尾端添1
01100001/01100010/01100011/1[0...0] (423个0)
使消息填充到448位
01100001/01100010/01100011/1[0...0](423个0)
尾端加64位长度字段:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00011000
- 初始化哈希值
SHA-256 的标准初始哈希值(十六进制表示):
H0 =0x6a09e667
H1 =0xbb67ae85
H2 =0x3c6ef372
H3 =0xa54ff53a
H4 =0x510e527f
H5 =0x9b05688c
H6 =0x1f83d9ab
H7 =0x5be0cd19
-
消息分块
-
消息扩展
-
迭代计算
使用以下脚本完成这三个功能:
最终整合后的SHA-256加密脚本如下:
得到"Hello, world!"的SHA-256加密值为:
315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3