深度探索:Secure Hash Algorithm(SHA)全景解析


title: 深度探索:Secure Hash Algorithm(SHA)全景解析
date: 2024/4/15 18:33:17
updated: 2024/4/15 18:33:17
tags:

  • SHA安全
  • 抗碰撞性
  • 算法版本
  • 实现细节
  • 性能优化
  • 发展历史
  • 应用案例

在这里插入图片描述

密码学中的哈希函数

一、哈希函数的定义

哈希函数是一种数学函数,它接受任意长度的输入数据(称为“消息”),并生成一个固定长度的输出值(称为“哈希值”或“摘要”)。这个过程称为哈希。

二、哈希函数的作用

  1. 确保数据完整性:通过比较原始数据和新计算出的哈希值,可以验证数据在传输或存储过程中是否被篡改。
  2. 提供唯一标识:哈希值可以作为数据的唯一指纹,用于数据检索和比对。
  3. 构建其他密码学协议:哈希函数是许多密码学协议(如数字签名、密钥生成等)的基础。

三、哈希函数的特性

  1. 单向性:从哈希值推导出原始输入数据在计算上是不可能的。
  2. 抗碰撞性:寻找两个不同的输入数据产生相同哈希值的过程非常困难。
  3. 高灵敏性:原始输入数据的微小变化会导致哈希值产生显著的不同。
  4. 固定长度输出:无论输入数据的大小,哈希函数都会生成一个固定长度的哈希值。

四、哈希函数在密码学中的重要性

  1. 数据完整性验证:保护数据在传输和存储过程中的完整性。
  2. 数字签名:结合公钥加密技术,实现消息的来源验证和不可抵赖性。
  3. 密钥生成:在密钥派生和其他密码学协议中生成安全的密钥。
  4. 安全协议:在SSL/TLS、IPsec等安全协议中,哈希函数用于构建安全握手过程。

SHA算法家族

SHA算法家族是一组广泛使用的密码散列函数,由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布。这些算法用于将任意长度的数据映射到固定长度的散列值,确保数据的完整性,并在各种安全协议中发挥作用。

SHA-1

设计原理:

SHA-1是基于MD4散列算法设计的,它改进了MD4中的弱点,并增加了安全性。SHA-1接受最大长度为2^64位的消息,并生成一个160位的散列值。

结构:
  • 初始化:使用一个固定的初始值。
  • 分块处理:将消息分割成512位的块。
  • 填充:对最后一个块进行填充,使其长度模512位为448。
  • 压缩函数:对每个块应用一个复杂的压缩函数,该函数包括四个轮次的循环运算,每轮包含20个步骤。
性质:
  • 单向性:从散列值推导出原始消息在计算上是不可能的。
  • 抗碰撞性:寻找两个不同消息产生相同散列值非常困难。
  • 高灵敏性:消息的微小变化会导致散列值显著不同。

SHA-2

SHA-2是一系列散列函数的统称,包括SHA-224、SHA-256、SHA-384和SHA-512等。它们的区别在于生成的散列值的长度和内部结构。

设计原理:

SHA-2系列算法基于SHA-1,但增加了额外的安全性和效率改进。

结构:
  • 初始化:使用不同的初始值。
  • 分块处理:与SHA-1类似,但块大小和循环次数根据散列长度不同而不同。
  • 填充:与SHA-1相同。
  • 压缩函数:每个版本的SHA-2都有独特的压缩函数设计,包括更多的循环和步骤。
性质:
  • 单向性、抗碰撞性和高灵敏性与SHA-1类似。
  • SHA-2的变体提供不同长度的散列值,以满足不同的安全性需求。

SHA-3

SHA-3是NIST在2015年正式发布的散列函数标准,旨在提供与SHA-2不同的设计,以增强安全性。

设计原理:

SHA-3的设计采用了全新的结构,称为Keccak算法,它是一种海绵结构,具有良好的扩散和混淆特性。

结构:
  • 初始化:使用固定的初始状态。
  • 分块处理:将消息分割成任意大小的块。
  • 填充:不需要传统的填充,因为海绵结构可以处理任意长度的消息。
  • 压缩函数:Keccak采用多个轮次的变换,这些变换包括θ、ρ、π、χ和ι步骤。
性质:
  • 单向性、抗碰撞性和高灵敏性。
  • SHA-3提供了不同的输出长度,类似于SHA-2。
  • SHA-3的设计使得它对某些类型的攻击(如长度扩展攻击)更加抵抗。

SHA算法家族的每个版本都在不断的安全评估和改进中,以适应不断变化的安全威胁和技术发展。尽管SHA-1已经不再被认为是安全的,但SHA-256和SHA-3仍然是当前广泛使用的散列函数,用于保护数字安全和数据完整性。

SHA算法的应用

SHA算法在密码学中扮演着至关重要的角色,由于其单向散列特性,它们被广泛应用于确保数据的完整性、验证消息的真实性以及数字签名等多个安全领域。

数字签名

数字签名是SHA算法最直接的应用之一。在数字签名过程中,发送方使用私钥对消息的散列值进行签名。接收方则使用发送方的公钥来验证签名。以下是SHA算法在这一过程中的应用:

  1. 生成散列值:发送方首先使用SHA算法计算消息的散列值。这个散列值是固定长度的,无论原始消息的长度如何。
  2. 签名:发送方使用其私钥对散列值进行加密,生成数字签名。
  3. 验证:接收方收到消息和签名后,使用发送方的公钥解密签名,得到散列值,并独立计算接收到的消息的散列值。
  4. 对比散列值:如果两个散列值匹配,则签名被认为是有效的,消息未被篡改。

消息认证码(MAC)

消息认证码(MAC)是用于验证消息完整性和来源的一种技术。SHA算法可以用来生成MAC:

  1. 共享密钥:通信双方共享一个密钥。
  2. 散列计算:发送方使用SHA算法和共享密钥对消息进行散列计算。
  3. 发送MAC:发送方将消息和MAC一起发送给接收方。
  4. 验证:接收方使用相同的密钥和SHA算法重新计算MAC,并与收到的MAC进行对比。

数据完整性验证

SHA算法在验证数据完整性方面也非常有用:

  1. 散列计算:在数据传输或存储之前,计算数据的SHA散列值。
  2. 存储或传输散列值:将散列值存储在安全的地方或与数据一起传输。
  3. 验证完整性:在数据被访问或接收时,重新计算散列值,并与之前存储或传输的散列值进行对比。
  4. 检测篡改:如果两个散列值不匹配,则表明数据在传输或存储过程中可能被篡改。

具体应用场景

  • 安全通信:在SSL/TLS协议中,SHA算法用于保护数据的完整性,确保在客户端和服务器之间传输的数据未被篡改。
  • 软件分发:软件发布者通常会提供软件包的SHA散列值,以便用户下载后验证软件包的完整性。
  • 版本控制系统:在版本控制系统中,SHA算法用于确保代码库中的文件未被意外或恶意修改。
  • 区块链技术:在区块链中,SHA算法用于确保交易记录的不可篡改性,以及区块之间的链接。
  • 密码管理器:密码管理器使用SHA算法来安全地存储和验证用户的密码。

由于SHA算法的这些应用,它们成为了现代信息安全基础设施的重要组成部分。然而,随着计算能力的提升和密码学研究的深入,旧的算法(如SHA-1)可能会变得不再安全,因此需要定期更新到更安全的算法(如SHA-256或SHA-3)。

SHA算法的安全性

SHA(Secure Hash Algorithm)系列算法包括SHA-1、SHA-256、SHA-384、SHA-512等,它们被广泛应用于密码学领域。在安全性方面,SHA算法的主要考虑因素包括抗碰撞性(Preimage Resistance)、抗第二原像攻击(Second Preimage Resistance)和抗碰撞性(Collision Resistance)。

抗碰撞性(Preimage Resistance)

抗碰撞性指的是给定散列值,很难找到原始消息。对于SHA算法,具有很高的抗碰撞性,即使知道散列值,也难以逆向推导出原始消息。这意味着SHA算法在保护消息的机密性方面是安全的。

抗第二原像攻击(Second Preimage Resistance)

抗第二原像攻击是指对于给定消息,很难找到另一个具有相同散列值的不同消息。SHA算法在这方面也表现良好,即使攻击者知道原始消息,也难以生成一个具有相同散列值的伪造消息。

抗碰撞性(Collision Resistance)

抗碰撞性是指很难找到两个不同的消息,它们的散列值相同。对于SHA算法,尤其是对于较新的版本(如SHA-256、SHA-384、SHA-512),其抗碰撞性非常强大,因此找到碰撞的机会非常小。

攻击案例和应对措施

  1. SHA-1碰撞攻击:在2017年,研究人员成功实施了对SHA-1算法的碰撞攻击,即找到两个不同的消息,它们具有相同的SHA-1散列值。这引发了对SHA-1安全性的担忧,因为碰撞攻击可能导致数字签名和其他安全机制的破坏。针对这种情况,推荐使用更安全的SHA-256或更高版本的算法。
  2. SHA-256及更高版本的安全性:目前,SHA-256以及更高版本的SHA算法仍被认为是安全的,并且没有已知有效的碰撞攻击。因此,对于安全性要求较高的应用,应该选择使用SHA-256或更高版本的算法。
  3. 定期更新算法:由于密码学领域的不断发展和攻击技术的进步,推荐定期评估并更新使用的散列算法,以确保系统的安全性。

总的来说,SHA算法在大多数情况下都提供了良好的安全性保障,但仍需要密切关注密码学领域的发展,及时采取相应的安全措施以保护数据的机密性和完整性。

SHA算法的实现

SHA算法的实现细节因算法版本(如SHA-1, SHA-256, SHA-512等)而异,但它们大多数遵循类似的步骤,包括消息预处理、分块处理和输出散列值。以下是SHA算法实现的一些关键方面:

算法伪代码

以SHA-256为例,其基本步骤可以概括如下:

  1. 初始化变量:选择一系列固定的初始哈希值和常量。

  2. 消息预处理:将消息填充至长度模512位为448位的倍数,通常通过添加一个1位和若干个0位,然后添加一个64位的长度字段来实现。

  3. 分块处理

    • 将消息分割为512位的块。

    • 对每个块,执行以下操作:

      • 将块分割为16个32位的字。
      • 执行80轮的散列计算,每轮使用不同的函数和常量。
  4. 输出散列值:最终的散列值是所有处理过的消息块的累积结果。

实际编程实现

以下是使用Python实现的SHA-256算法的简化版:

from hashlib import sha256

def hash_message(message):
    # 使用内置的hashlib库进行散列计算
    hash_object = sha256(message.encode())
    return hash_object.hexdigest()

在实际编程实现中,以下是一些关键点:

  • 字段操作:通常使用位操作和模运算来实现。
  • 循环和散列计算:需要精确实现算法规定的80轮散列计算。
  • 哈希输出:散列值通常以十六进制字符串的形式表示。

性能优化

性能优化对于散列算法的实现至关重要,尤其是在处理大量数据时:

  1. 并行计算:对于支持并行处理的数据,可以同时处理多个数据块。
  2. 内存使用:优化内存使用可以减少缓存未命中和提高处理速度。
  3. 汇编优化:对于性能要求极高的应用,可以使用特定平台的汇编语言来优化关键操作。
  4. 算法选择:根据实际需求选择合适的SHA版本。例如,SHA-256通常在安全性和性能之间提供了良好的平衡。

其他考虑

  • 安全性:在实现时,确保没有引入安全漏洞,如缓冲区溢出等。
  • 可移植性:在不同平台上测试算法实现,确保其可移植性。
  • 错误处理:实现适当的错误处理机制,确保在输入错误或其他异常情况下程序不会崩溃。

总之,SHA算法的实现需要遵循精确的规范,同时考虑到性能和安全性。在实际应用中,通常使用经过严格审查和优化的库,如OpenSSL或Python的hashlib,以避免潜在的安全问题和性能瓶颈。

SHA算法的发展

SHA(Secure Hash Algorithm)是一系列加密散列函数的统称,由美国国家安全局(NSA)设计并由美国国家标准与技术研究院(NIST)发布。SHA算法的发展经历了多个版本,以适应不断变化的安全需求和计算能力。

早期版本

  1. SHA-0(1993年):最初版本的SHA算法,但由于很快发现了一些小问题,它并没有得到广泛应用。
  2. SHA-1(1995年):SHA-0的修订版,修复了SHA-0中的问题。SHA-1在相当长的一段时间内被广泛使用,但由于其安全性逐渐受到威胁(尤其是随着计算能力的提升),NIST在2010年宣布不再推荐使用SHA-1。

演进过程

  1. SHA-2系列(2001年):为了提高安全性,NIST发布了SHA-2系列算法,包括SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, 和 SHA-512/256。这些算法使用不同的散列长度和构造,提供了更高的安全性。SHA-256和SHA-512是最常用的版本。

    • SHA-256:产生一个256位的散列值,通常用于大多数需要高安全性的应用。
    • SHA-512:产生一个512位的散列值,适用于需要更高安全级别的应用。
  2. SHA-3(2015年):由于对SHA-2的安全性存在一些理论上的担忧(尽管至今未发现实际攻击),NIST举办了一个公开竞赛,最终选择了Keccak算法作为SHA-3。SHA-3提供了与SHA-2不同的设计原理,增加了抵抗未来潜在攻击的能力。

未来可能的发展方向

  1. 安全性增强:随着量子计算的发展,现有的散列算法可能面临安全威胁。因此,研究者和机构正在探索新的散列算法,这些算法能够抵抗量子计算机的攻击。
  2. 效率提升:随着数据量的增加,散列算法的效率变得更加重要。未来的算法可能会在保持高安全性的同时,提供更快的数据处理速度。
  3. 标准化和合规性:随着新的散列算法的发展,NIST和其他标准组织可能会发布新的标准和指南,以适应新的安全威胁和计算环境。
  4. 多用途散列函数:未来的散列算法可能会设计成不仅可以用于生成散列值,还可以用于其他密码学应用,如加密、认证等。
  5. 后量子散列算法:随着后量子密码学的进展,可能会出现新的散列算法,这些算法能够抵御量子计算机的攻击。
  6. 隐私保护散列:为了更好地保护用户隐私,可能会发展出新的散列算法,这些算法能够在不泄露原始数据的情况下提供数据散列。

SHA算法的发展是一个持续的过程,随着密码学、计算技术和安全威胁的不断变化,我们可以期待未来会有更多创新和改进的算法出现。

SHA算法与其他哈希算法的比较

SHA算法和其他哈希算法在密码学中都有其特定的应用场景和优缺点。以下是对SHA算法与其他常见哈希算法(如MD5、SHA-2等)的比较,以及它们在不同场景下的适用性分析。

MD5

优点:
  • 速度快:MD5算法的计算速度相对较快,适用于对速度要求较高的场景。
  • 兼容性:由于MD5使用较早,许多系统和应用已经集成了MD5算法。
缺点:
  • 安全性低:MD5已经被证明存在严重的碰撞漏洞,不再适合用于安全性要求高的场合。
  • 散列长度固定:MD5生成的散列值长度为128位,随着计算能力的提升,其安全性逐渐降低。
适用场景:
  • 数据完整性校验:在不涉及安全性的场合,MD5可以用于检查数据的完整性。
  • 快速哈希:对于不需要高安全性的场合,MD5由于其计算速度快,仍然有一定的使用价值。

SHA-2

优点:
  • 安全性高:SHA-2系列算法提供了比MD5更高的安全性,尤其是SHA-256和SHA-512。
  • 灵活性:SHA-2提供了多种散列长度(224、256、384、512位),可以根据需要选择合适的长度。
缺点:
  • 计算速度:相比于MD5,SHA-2的计算速度较慢,尤其是在较长散列长度时。
  • 算法复杂性:SHA-2算法的实现比MD5复杂,可能需要更多的计算资源。
适用场景:
  • 安全性要求高的场合:如数字签名、密码存储等。
  • 需要不同散列长度的场合:可以根据实际需求选择合适的散列长度。

SHA-3

优点:
  • 设计原理不同:SHA-3采用了与SHA-2不同的设计原理,提供了更高的安全性。
  • 抗碰撞性强:SHA-3在理论上具有更好的抗碰撞性。
缺点:
  • 计算速度:SHA-3通常比SHA-2慢,尤其是在某些实现中。
  • 兼容性和普及度:SHA-3相对较新,可能不如SHA-2普及。
适用场景:
  • 对安全性有极高要求的场合:如某些安全敏感型应用。
  • 需要多样化哈希算法的场合:为了提高整体安全性,可以同时使用SHA-2和SHA-3。

总结

在选择哈希算法时,需要根据应用场景的安全需求、计算资源、兼容性和速度等因素进行综合考虑。

  • 对于需要快速哈希且安全性要求不高的场景,MD5可能仍然适用。
  • 对于大多数安全性要求较高的场景,SHA-2是一个不错的选择,尤其是SHA-256。
  • 对于需要最高安全级别的场景,可以考虑使用SHA-3。

需要注意的是,随着技术的发展,过去被认为是安全的算法可能会变得不再安全,因此定期评估和更新使用的哈希算法是保持系统安全的重要措施。

实际案例分析

SHA算法在现实世界中有广泛的应用,尤其在数字货币领域和区块链技术中扮演着重要的角色。以下是SHA算法在这些领域的具体应用案例:

数字货币领域

比特币(Bitcoin)

比特币是使用SHA算法的一个典型例子。在比特币网络中,SHA-256算法被用于工作量证明(Proof of Work, PoW)机制,这是比特币网络中确认交易并创建新区块的过程。矿工通过解决一个基于SHA-256算法的加密难题来竞争记账权。成功解决问题的矿工将获得新生成的比特币作为奖励。

此外,SHA-256还被用于以下方面:

  • 生成比特币地址:比特币地址是通过将公钥进行SHA-256哈希,然后进行RIPEMD-160哈希生成的。
  • 确保交易完整性:每笔交易的输入和输出都会通过SHA-256进行哈希处理,以确保交易的完整性。
以太坊(Ethereum)

虽然以太坊在其PoW机制中使用了不同的算法(Ethash),但在智能合约和账户的创建中,SHA-256仍然有其应用。例如,以太坊的地址生成也涉及到SHA-3(KECCAK-256)算法的使用。

区块链技术

区块链的不可篡改性

区块链的不可篡改性依赖于哈希函数,尤其是SHA算法。每个区块都包含前一个区块的哈希值,这样就形成了一个连锁反应,确保了整个区块链的不可篡改性。如果某个区块被修改,那么它的哈希值就会改变,进而影响后续所有区块的哈希值。

智能合约

在以太坊等支持智能合约的区块链平台上,SHA算法用于确保智能合约代码的不可篡改性和验证交易数据的完整性。

实际案例:
  1. 供应链管理

    • 使用区块链技术来追踪商品从生产到消费的全过程。SHA算法可以确保供应链数据的完整性,防止数据被篡改。
  2. 身份验证

    • 在区块链身份验证系统中,用户的身份信息可以通过SHA算法进行哈希处理,以保护用户隐私,同时确保身份信息的真实性。
  3. 版权保护

    • 在数字版权管理(DRM)中,创作者可以将作品的内容通过SHA算法哈希后存储在区块链上,以证明作品的原创性和所有权。
  4. 投票系统

    • 在基于区块链的投票系统中,SHA算法可以用来确保选票的不可篡改性和匿名性。投票人的选择经过哈希处理后记录在区块链上。

通过这些案例,我们可以看到SHA算法在确保数据完整性、提供安全性、以及维护系统不可篡改性方面的重要作用。SHA算法的这些特性使其成为数字货币和区块链技术中的核心组件。

未来展望

SHA算法作为安全哈希算法的一种,虽然在多个领域有着广泛的应用,但随着技术的发展和计算能力的提升,其安全性、效率和隐私保护等方面可能会面临新的挑战。以下是SHA算法未来可能的发展趋势和改进方向,以及新的应用领域。

发展趋势和改进方向

  1. 安全性增强

    • 抗量子计算:随着量子计算的发展,现有的加密算法可能面临被破解的风险。未来SHA算法需要考虑对量子攻击的抵抗力,可能需要发展新的哈希算法,或者对现有算法进行量子安全的改造。
    • 抵抗碰撞攻击:尽管SHA算法设计之初就考虑了抗碰撞攻击,但随着攻击技术的发展,寻找更高效的抗碰撞算法是未来改进的方向。
  2. 效率提升

    • 算法优化:为了适应更多的应用场景,特别是在资源受限的环境中(如物联网设备),优化SHA算法的效率和资源消耗是必要的。
    • 硬件加速:通过专用硬件(如ASICs)来加速哈希计算,可以显著提高处理速度,降低能耗。
  3. 隐私保护

    • 零知识证明和多方计算:结合零知识证明和多方计算技术,SHA算法可以在保护隐私的同时进行数据验证。
    • 哈希函数的可逆性:研究可逆哈希函数,以便在不泄露原始数据的情况下进行数据验证。
  4. 标准化和多样性

    • 新的哈希标准:随着技术的发展,可能会出现新的哈希标准来满足不同应用的需求。
    • 算法多样性:为了避免单一算法可能存在的潜在风险,采用多种哈希算法组合使用,增加系统的整体安全性。

新的应用领域

  1. 隐私增强技术

    • 匿名支付系统:在数字货币和区块链应用中,SHA算法可以结合其他隐私保护技术,如环签名和零知识证明,以增强用户的匿名性。
    • 去中心化身份验证:在去中心化身份(DID)系统中,SHA算法可以用于保护用户身份信息,同时确保身份的可验证性。
  2. 数据完整性保护

    • 物联网数据安全:在物联网设备中,SHA算法可以用于确保数据的完整性和真实性,防止数据在传输过程中被篡改。
    • 云存储服务:在云存储服务中,SHA算法可以用来验证数据的完整性和一致性。
  3. 区块链技术的新应用

    • 跨链技术:SHA算法可以在不同的区块链之间提供数据一致性和安全性的保证。
    • 合规性和审计:在区块链应用中,SHA算法可以帮助实现自动化的合规性检查和审计过程。
  4. 网络安全

    • 数据防篡改:在网络安全领域,SHA算法可以用于检测数据是否被篡改,特别是在关键基础设施的数据保护中。

总之,SHA算法的未来发展将需要在保持其核心功能的同时,不断适应新的技术挑战和应用需求。随着技术的进步,我们可以期待更安全、更高效、更隐私保护的哈希算法的出现。

附录

SHA在线加密工具

SHA在线加密 | 一个覆盖广泛主题工具的高效在线平台(amd794.com)

https://amd794.com/sha

示例代码

下面我将提供一个使用Python内置库hashlib实现的SHA-256算法的代码示例。这个库封装了SHA-256算法的底层实现细节,但通过这个示例,你可以了解如何使用SHA-256算法来计算一个字符串的哈希值。

import hashlib

def sha256_hash(data):
    # 创建一个sha256哈希对象
    hash_object = hashlib.sha256()
    
    # 对数据进行编码,确保是字节串(bytes)
    data_encoded = data.encode('utf-8')
    
    # 使用哈希对象的update方法对数据进行哈希计算
    hash_object.update(data_encoded)
    
    # 获取16进制表示的哈希值
    hex_dig = hash_object.hexdigest()
    
    return hex_dig

# 示例数据
data = "Hello, World!"

# 计算并打印SHA-256哈希值
print("The SHA-256 hash of the data is:", sha256_hash(data))

在这个示例中,hashlib.sha256()创建了一个新的SHA-256哈希对象。然后,我们使用update()方法将编码后的数据传递给哈希对象,这会逐步处理数据。最后,hexdigest()方法返回了哈希值的十六进制表示。

如果你想了解更底层的实现细节,以下是一个简化的伪代码示例,展示了SHA-256算法的核心步骤:

# 以下变量是预定义的,具体值可以在参考信息[1]中找到
h0, h1, h2, h3, h4, h5, h6, h7 = initial_hash_values
k = [round_constant_0, round_constant_1, ..., round_constant_63]

def sha256(data):
    # 对数据进行填充操作,使其长度模512位为0
    data = pad(data)
    
    # 分块处理数据
    for chunk in chunks(data, 512):
        # 初始化消息调度数组w
        w = [0] * 64
        # 将chunk填充到消息调度数组中
        for i in range(16):
            w[i] = chunk[i]
        for i in range(16, 64):
            # 根据SHA-256算法的公式计算w[i]
            w[i] = some_computation(w[i-2], w[i-7], w[i-15], w[i-16])
        
        # 初始化工作变量
        a, b, c, d, e, f, g, h = h0, h1, h2, h3, h4, h5, h6, h7
        
        # 主循环
        for i in range(64):
            # 根据SHA-256算法的公式进行计算
            temp1 = some_computation(a, b, c, d, e, f, g, h, k[i], w[i])
            h = g
            g = f
            f = e
            e = d + temp1
            d = c
            c = b
            b = a
            a = temp1 + temp2  # temp2是上一步计算的一部分
        
        # 更新哈希值
        h0 = (h0 + a) % 2**32
        h1 = (h1 + b) % 2**32
        h2 = (h2 + c) % 2**32
        h3 = (h3 + d) % 2**32
        h4 = (h4 + e) % 2**32
        h5 = (h5 + f) % 2**32
        h6 = (h6 + g) % 2**32
        h7 = (h7 + h) % 2**32
    
    # 将最终的哈希值转换为16进制字符串
    return ''.join(format(x, '08x') for x in (h0, h1, h2, h3, h4, h5, h6, h7))

# 示例数据
data = "Hello, World!"

# 计算并打印SHA-256哈希值
print("The SHA-256 hash of the data is:", sha256(data))

请注意,上面的伪代码仅用于说明SHA-256算法的核心概念,它省略了实际的计算细节和函数实现。在实际应用中,你应该使用经过严格审查和测试的库,如Python的hashlib,来确保安全和正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/545895.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day55 动态规划 part15

Day55 动态规划 part15 392.判断子序列 我的思路: 自己还是只能想到双指针法 解答: class Solution {public boolean isSubsequence(String s, String t) {if(s.length() 0) {return true;}if(s.length() > t.length() || t.length() 0) {return false;}ch…

微信小程序认证指南及注意事项

如何认证小程序? 一、操作步骤 登录小程序后台: https://mp.weixin.qq.com/ (点击前往) 找到设置,基本设置; 在【基本信息】处有备案和认证入口; 点击微信认证的【去认证】; 按照步骤指引一步步填写信息&#xff…

秋招复习笔记——八股文部分:网络基础

TCP/IP 网络模型 应用层 最上层的,也是我们能直接接触到的就是应用层(Application Layer),我们电脑或手机使用的应用软件都是在应用层实现。那么,当两个不同设备的应用需要通信的时候,应用就把应用数据传…

EPSON的RX8900CE适合用于安防摄像头产品

安防摄像头产品可以实现视频监控,运动检测,人脸识别等功能,并且可以支持远程访问,成了用户的“千里眼”。之前安防摄像头的价格比较高,一般比较重要的场合才会使用,目前随着安防摄像头价格逐渐降低&#xf…

简单工厂模式设计实验

实验内容: 楚锋软件公司欲基于Java 语言开发一套图表库,该图表库可以为应用系统提供各种不同外观的图表,例如柱状图、饼状图、折线图等。楚锋软件公司图表库设计人员希望为应用系统开发人员提供一套灵活易用的图表库,而且可以较为…

【Redis深度解析】揭秘Cluster(集群):原理、机制与实战优化

Redis Cluster是Redis官方提供的分布式解决方案,通过数据分片与节点间通信机制,实现了水平扩展、高可用与数据容灾。本文将深入剖析Redis Cluster的工作原理、核心机制,并结合实战经验分享优化策略,为您打造坚实可靠的Redis分布式…

成都百洲文化传媒有限公司电商领域的新锐力量

在电商服务领域,成都百洲文化传媒有限公司凭借其专业的服务理念和创新的策略,正逐渐成为行业内的翘楚。这家公司不仅拥有资深的电商团队,还以其精准的市场定位和高效的服务模式,赢得了众多客户的信赖和好评。 一、专业团队&#…

vue--双向数据绑定原理

Vue采用数据劫持 发布者-订阅者模式实现双向数据绑定,实现逻辑图如下所示: 数据劫持 Vue 借助Object.defineProperty()来劫持各个属性,这样一来属性存取过程都会被监听到 发布者-订阅者模式 主要实现三个对象:Observer&#…

⑤-1 学习PID--什么是PID

​ PID 算法可以用于温度控制、水位控制、飞行姿态控制等领域。后面我们通过PID 控制电机进行说明。 自动控制系统 在直流有刷电机的基础驱动中,如果电机负载不变,我们只要设置固定的占空比(电压),电机的速度就会稳定在…

Python | Leetcode Python题解之第24题两两交换链表中的节点

题目: 题解: class Solution:def swapPairs(self, head: ListNode) -> ListNode:dummyHead ListNode(0)dummyHead.next headtemp dummyHeadwhile temp.next and temp.next.next:node1 temp.nextnode2 temp.next.nexttemp.next node2node1.next…

【InternLM 实战营第二期笔记01】书生·浦语大模型全链路开源体系+InternLM2技术报告

本次课程链接在GitHub上:InternLM/Tutorial at camp2 (github.com) 第一次课程录播链接:书生浦语大模型全链路开源体系_哔哩哔哩_bilibili InternLM2技术报告:arxiv.org/pdf/2403.17297.pdf 一、书生浦语大模型全链路开源体系笔记 Intern…

2024 如何激活 Guitar Pro 8 .1 今天手把手教你

Guitar Pro 是一款倍受吉他手喜爱的吉他和弦、六线谱、BASS 四线谱绘制、打印、查看、试听软件,它也是一款优秀的 MIDI 音序器,MIDI 制作辅助工具,可以输出标准格式的 MIDI。GP 的过人之处就在于它可以直接用鼠标和键盘按标准的六线谱、四线谱…

【产品经理修炼之道】- 厂商银业务之保兑仓

保兑仓 保兑仓是指供应商、购货商、银行签订三方协议,以银行信用为载体,以银行承兑汇票为结算工具,由银行控制货权,供应商受托保管货物并对银行承兑汇票保证金以外部分以货物回购为担保措施,购货商随缴保证金随提货而设…

KDD 2023 | 时空数据(Spatial-Temporal)论文总结

2023 KDD论文接收情况:Research track(研究赛道)接收率:22.1%(313/1416),ADS Track(应用数据科学赛道)接收率:25.4%(184/725) &#…

没灵感?设计不出电子画册?

当你坐在电脑前,手指敲击键盘,却感觉大脑一片空白,眼前的画面仿佛凝固在屏幕上,那么,你可能陷入了灵感枯竭的困境。设计一本电子画册,需要创意的火花和独特的构思,而当灵感涸泉,设计…

【Leetcode每日一题】 动态规划 - 下降路径最小和(难度⭐⭐)(55)

1. 题目解析 题目链接:931. 下降路径最小和 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了. 2.算法原理 对于这类路径类问题,通常我们首先需要分析状态表示以及状态转移的过程。特别地,本题涉及…

如何安装Windows版VRTE2.1.0开发环境并进行开发

前言&#xff08;Abstract&#xff09; 本文档记录了如何安装Windows版VRTE2.1.0开发环境并进行开发&#xff0c;并且总结了当部署在安装了比较陈旧版本Linux内核&#xff08;如<4.5&#xff09;和库的板子上所遭遇的困难&#xff0c;如S32V234EVB。 Definitions and Abbre…

关于时频分析的一些事-答知乎问(一)

从信号的时频谱图中可以提取什么特征&#xff1f; 基于时频谱图的特征一般包括能量特征、时域和频域拓展特征以及时频内禀特征。 基于时频图的能量特征 基于时频图的特征中&#xff0c;能量特征是最简单的一种&#xff0c;通过分析时频谱图中的能量分布特性而获取信号的时频…

第011问 - 工作/学习老走神,如何提升注意力?(3个步骤提升注意力)

前言 你有没有遇到以下 2 个现象&#xff1a; 注意力被微信消息干扰&#xff1a;早上做好了计划&#xff0c;打算今天开发登录功能&#xff0c;结果一看微信 小A 给我发了一条消息&#xff0c;想都没想就给他回复了&#xff0c;这一回不要紧&#xff0c;他又给我发了&#xff0…

爆火 AI 硬件遭差评,Ai Pin 上市即翻车;Grok 推出首个多模态模型丨 RTE 开发者日报 Vol.184

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…