当前位置: 首页 > article >正文

SHA-3:从海绵构造到KECCAK-p,深入解析新一代哈希函数核心

1. 为什么我们需要SHA-3记得我第一次接触哈希函数时用的还是SHA-1。那时候做文件校验用SHA-1生成个摘要感觉既方便又安全。直到后来看到新闻说SHA-1被破解了我才意识到密码学世界的变化有多快。这就是SHA-3诞生的背景——我们需要一个更安全的哈希函数。SHA-3的诞生其实挺戏剧性的。2007年美国国家标准与技术研究院NIST发起了一场公开竞赛要从64个候选算法中选出新一代的哈希标准。经过层层筛选最终在2015年KECCAK算法胜出成为了我们现在所知的SHA-3。你可能要问为什么是KECCAK它有什么特别之处简单来说它带来了三个关键优势首先是全新的海绵结构完全不同于之前MD系列的构造其次是在硬件实现上的高效表现最重要的是它提供了更强的安全性保障包括抗碰撞性和抗侧信道攻击能力。2. 海绵构造像海绵一样工作的哈希函数2.1 海绵的基本原理想象一下你用海绵吸水的场景海绵先吸收水分吸收阶段然后你挤压海绵时水分又会被释放出来输出阶段。KECCAK的工作原理就是这样这也是它被称为海绵构造的原因。具体来说海绵结构有三个核心组件函数f这是算法的核心变换函数填充方法pad确保输入数据符合要求格式速率r控制数据处理的节奏在数学表达上一个海绵函数可以表示为SPONGE(f,pad,r)[N,d]其中N是输入数据d是输出哈希值的长度。2.2 吸收阶段详解吸收阶段就像海绵吸水的过程。这里有个关键概念叫速率rate记作r。你可以把r理解为每次处理的数据块大小。举个例子如果r1088那么每次就处理1088位的数据。这个阶段的具体步骤是对输入数据进行填充padding确保长度符合要求将填充后的数据分成若干块每块r位每块数据与当前状态进行异或运算通过函数f进行变换重复这个过程直到处理完所有数据块这里有个有趣的细节海绵结构的内部状态大小是brc其中c被称为容量。c越大安全性越高但效率会降低。在SHA3-256中b1600r1088所以c512。2.3 输出阶段的工作方式输出阶段就像挤海绵的过程。每次挤压调用函数f都会产生r位的输出。如果需要更长的输出就继续挤压。比如要生成256位的哈希值而r1088那么实际上只需要一次挤压然后取前256位即可。这种设计有个很大的优势它可以轻松支持可变长度的输出。这也是为什么SHA-3家族中会有SHAKE128和SHAKE256这样的可扩展输出函数XOF。3. KECCAK-p海绵结构的心脏3.1 KECCAK-p的基本概念如果说海绵结构是SHA-3的身体那么KECCAK-p就是它的心脏。这是一个置换函数负责数据的实际变换。在SHA-3中使用的是KECCAK-p[1600,24]意思是状态大小为1600位进行24轮变换。KECCAK-p的特别之处在于它的三维状态表示法。想象一个5×5×w的三维数组其中w可以是1,2,4,8,...64。在SHA-3中w64所以总状态大小是5×5×641600位。3.2 五步变换的舞蹈KECCAK-p的每轮变换由五个步骤组成我习惯把它们想象成一场精心编排的舞蹈θTheta这是线性扩散步骤。它会计算每列的奇偶校验位然后用这些校验位来影响其他数据。具体来说对于每个比特它会与相邻两列的特定比特进行异或运算。ρRho这是位旋转步骤。每个lane5×5数组中的一行中的比特会按照预定的偏移量进行循环移位。不同的lane有不同的移位量这增加了算法的扩散性。πPi这是排列步骤。它会重新排列lane的位置相当于对5×5的平面进行置换。这个步骤的目的是打乱比特之间的局部关系。χChi这是唯一的非线性步骤。它对每行进行非线性变换具体来说是对每行的三个连续比特进行与或运算。这个步骤为算法提供了非线性特性。ιIota这是轮常数加步骤。它会将一个与轮数相关的常数异或到状态的一个特定lane上。这个步骤确保每轮变换都有所不同。这五个步骤的组合提供了强大的混淆和扩散特性使得KECCAK-p能够抵抗各种密码分析攻击。4. 深入KECCAK-p的五个轮函数4.1 θ列扩散的艺术θ步骤是KECCAK-p中我最喜欢的一个变换。它的数学表达式看起来有点复杂但实际概念很简单让每一列的数据都影响其他列。具体实现是这样的对每一列沿着z轴方向计算它的奇偶校验位将这些校验位与相邻列进行异或用结果来更新当前状态用代码表示的话大概是这样的def theta(state): # 计算奇偶校验 parity [0] * 5 for x in range(5): parity[x] state[x][0] for y in range(1,5): parity[x] ^ state[x][y] # 更新状态 new_state [[0]*5 for _ in range(5)] for x in range(5): for y in range(5): new_state[x][y] state[x][y] ^ parity[(x-1)%5] ^ parity[(x1)%5] return new_state这个步骤确保了即使只改变输入的一个比特经过θ变换后也会影响多个其他比特。4.2 ρ和π比特的旋转舞蹈ρ和π步骤经常一起工作它们负责将比特在三维状态中移动。ρ步骤对每个lane进行循环移位移位数取决于lane的位置(x,y)。具体移位数由以下公式决定对于0 ≤ t ≤ 24求最小的t使得(t1)(t2)/2 ≡ 1 mod 5 然后移位量为(t1)(t2)/2这个设计确保了每个lane都有不同的移位模式。π步骤则重新排列lane的位置。具体来说它将位置(x,y)的lane移动到(y,2x3y)。这个排列看起来有点随意但实际上经过精心设计可以最大化扩散效果。4.3 χ唯一的非线性变换χ是KECCAK-p中唯一的非线性步骤它为算法提供了重要的非线性特性。这个变换可以表示为a[x][y] a[x][y] XOR ((NOT a[x1][y]) AND a[x2][y])用大白话说就是每个比特的新值取决于它自己和它右边的两个比特的当前值。这个简单的非线性操作与前面的线性变换相结合产生了非常强大的混淆效果。在实际硬件实现中χ步骤可以非常高效地完成。4.4 ι打破对称性ι步骤是最简单的一个但非常重要。它只是简单地将一个与轮数相关的常数异或到状态的一个特定lane上。这个步骤的主要目的是打破对称性确保每轮变换都有所不同。轮常数是通过一个简单的LFSR线性反馈移位寄存器生成的。虽然看起来很简单但这个步骤对于防止某些类型的密码分析攻击至关重要。5. 实际应用中的SHA-35.1 多速率填充Multi-rate padding在实际使用SHA-3时填充padding是个很重要的步骤。SHA-3使用了一种叫做多速率填充的独特方法。它的规则很简单在消息末尾添加一个1比特然后添加若干个0比特最后再添加一个1比特这种填充方式确保了不同长度的消息在填充后都能被正确区分。在代码实现中这个步骤通常这样处理def multi_rate_padding(message, rate): # 添加第一个1 padded message b\x01 # 计算需要填充的0的个数 zero_bytes (rate - (len(padded)*8 % rate)) // 8 - 1 if zero_bytes 0: padded b\x00 * zero_bytes # 添加最后一个1 padded b\x80 return padded5.2 SHA-3与SHA-2的性能对比在实际项目中我经常被问到SHA-3和SHA-2哪个更好这个问题没有简单答案。SHA-3在硬件实现上通常更高效但在某些软件实现中SHA-256可能更快。这里有个简单的性能对比表特性SHA-256SHA3-256算法结构MD结构海绵结构硬件性能中等优秀软件性能优秀中等抗碰撞性强更强侧信道防护一般优秀选择哪个算法取决于你的具体需求。如果安全性是首要考虑SHA-3是个不错的选择如果是在现有系统中升级可能需要考虑兼容性问题。5.3 实现时的常见陷阱在实现SHA-3时有几个常见的坑需要注意字节序问题KECCAK使用的是小端序这与很多系统默认的大端序不同状态初始化确保初始状态全为零轮常数应用ι步骤中的轮常数必须正确应用输出截断最后记得只取所需长度的输出我曾经在一个项目中因为忽略了字节序问题导致生成的哈希值与其他实现不匹配调试了很久才发现问题所在。所以建议在实现时一定要参考官方的测试向量进行验证。

相关文章:

SHA-3:从海绵构造到KECCAK-p,深入解析新一代哈希函数核心

1. 为什么我们需要SHA-3? 记得我第一次接触哈希函数时,用的还是SHA-1。那时候做文件校验,用SHA-1生成个摘要,感觉既方便又安全。直到后来看到新闻说SHA-1被破解了,我才意识到密码学世界的变化有多快。这就是SHA-3诞生的…...

Jetson Nano玩家必看:Windows下用Diskpart彻底格式化SD卡(解决烧录后不识别问题)

Jetson Nano玩家必备技能:Windows下彻底格式化SD卡的终极指南 当你兴奋地将Linux系统镜像烧录到SD卡,准备在Jetson Nano上大展拳脚时,却发现Windows资源管理器里那张卡"消失"了——这不是灵异事件,而是分区表变化导致的…...

Unity 2019.4.7f1实战:从零复刻Flappy Bird,搞定PC/Web/Android三端发布

Unity 2019.4.7f1实战:从零复刻Flappy Bird,搞定PC/Web/Android三端发布 当你第一次打开Unity时,面对那个空荡荡的3D场景,可能会有些不知所措。但别担心,今天我们就用这个看似简单的Flappy Bird游戏,带你走…...

从零搭建ROS2与Web实时数据交互系统

1. 为什么需要ROS2与Web实时交互? 在机器人开发或IoT项目中,我们经常需要通过网页远程监控设备状态或发送控制指令。想象一下这样的场景:你正在调试一个自动巡逻的机器人,但总不能一直盯着终端看日志吧?这时候如果有个…...

基于节点电价的电网对电动汽车接纳能力评估模型研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &…...

HPM5361EVK开发板深度体验:480MHz RISC-V MCU实战开发与性能评测

1. 项目概述:从开箱到点亮,一个真实的HPM5361EVK上手体验上次聊了HPM5361EVK开发板的开箱和硬件初印象,很多朋友后台留言,催更实际的上手体验和性能测试。确实,一块开发板好不好,光看参数和做工是远远不够的…...

FPGA开发入门:从零开始用Vivado实现LED流水灯项目

1. 项目概述与核心价值最近在后台和社群里,看到不少刚接触FPGA开发的朋友,特别是从单片机或嵌入式软件转过来的,对于如何上手第一个完整的FPGA项目感到有些迷茫。大家常问:“我学了Verilog语法,也跑过仿真了&#xff0…...

软电路入门:用导电缝纫线与LED制作可穿戴发光作品

1. 项目概述:当缝纫遇见电路 几年前,我第一次把一颗会发光的LED缝到帆布包上时,那种感觉非常奇妙。它不再是冰冷的电路板,而是布料纹理的一部分,随着针脚的走向亮起柔和的光。这就是软电路,或者说电子纺织品…...

Mac小白必看:手把手教你用终端命令重建丢失的Recovery HD分区(附详细路径解释)

Mac用户自救指南:彻底掌握Recovery HD分区修复全流程 当你发现CommandR组合键失效时,那种无助感我深有体会。去年帮朋友修复一台二手MacBook时,我们花了整整一个下午才搞明白为什么恢复模式无法启动——原来前主人为了腾出空间删除了Recovery…...

别再只会写脚本了!用Matlab APP Designer给你的数据分析做个可视化界面(附完整代码)

从脚本到交互式应用:用MATLAB APP Designer打造专业数据分析工具 在数据科学和工程领域,MATLAB一直是不可或缺的计算工具。然而,许多用户长期停留在命令行脚本的层面,未能充分发挥MATLAB的完整潜力。本文将带您突破这一局限&#…...

避坑指南:QGraphicsView自适应缩放时,为什么你的Item总对不齐或留白?

避坑指南:QGraphicsView自适应缩放时Item对齐与留白问题深度解析 在Qt图形界面开发中,QGraphicsView框架因其强大的2D显示能力被广泛应用。但当开发者尝试实现视图内容的自适应缩放时,经常会遇到一个令人头疼的问题——调用fitInView后&#…...

跨越平台鸿沟:Simulink、VeriStand与LabVIEW联合仿真环境一站式部署指南

1. 为什么需要联合仿真环境? 在工业自动化和科研领域,我们经常遇到一个尴尬的局面:不同团队使用的工具链完全不同。控制算法工程师习惯用Simulink建模,测试工程师依赖LabVIEW开发上位机,而硬件在环(HIL&am…...

Hugging Face Tokenizer的padding、truncation参数详解:如何让你的BERT/RoBERTa输入不出错?

Hugging Face Tokenizer的padding与truncation实战指南:BERT输入处理的深度解析 当你第一次将文本输入BERT模型时,是否遇到过这样的报错:"RuntimeError: The size of tensor a (512) must match the size of tensor b (128)"&#…...

Unity 2021.3 + EDM4U:手把手搞定Google登录SDK的安卓依赖与打包避坑

Unity 2021.3 EDM4U:深度解析Google登录SDK的安卓依赖管理实战 在移动应用开发中,第三方登录功能几乎是标配,而Google登录作为全球用户覆盖率最高的方案之一,其集成过程却常常让Unity开发者头疼不已。特别是当项目升级到Unity 2…...

面试官问‘0.1+0.2≠0.3’,你能从CPU层面讲清楚吗?浮点数运算避坑指南

为什么0.10.2不等于0.3?从晶体管到代码的浮点数运算解密 当你在Python或JavaScript中输入0.1 0.2时,得到的不是预期的0.3,而是一个近似值0.30000000000000004。这个看似简单的数学问题背后,隐藏着计算机处理数字的复杂机制。理解…...

ARM架构TLB机制与TLBI指令详解

1. ARM TLB机制与TLBI指令概述在ARM架构中,TLB(Translation Lookaside Buffer)是内存管理单元(MMU)的核心组件,负责缓存虚拟地址到物理地址的转换结果。当CPU访问内存时,首先查询TLB获取地址转换…...

别再只盯着P值了!用Stata做格兰杰检验后,这样解读结果才专业(含VAR模型与脉冲响应分析)

超越P值陷阱:格兰杰检验的深度解读与Stata实战指南 当屏幕上跳出那个熟悉的P值时,大多数研究者会条件反射般地做出二元判断——"显著"或"不显著",然后匆匆写下结论。这种机械式的数据分析方式正在学术界和业界制造大量&q…...

开关电源传导EMI超标?手把手教你用π型滤波器搞定(附SCT2450实测数据)

开关电源传导EMI超标?手把手教你用π型滤波器搞定(附SCT2450实测数据) 在电源设计领域,传导EMI超标是工程师们经常遇到的棘手问题。当你的产品在EMC实验室测试失败时,那种挫败感相信每个硬件工程师都深有体会。传导噪声…...

深入GD32 CAN FD驱动层:从寄存器配置到ISO 15765协议栈的实战解析

深入GD32 CAN FD驱动层:从寄存器配置到ISO 15765协议栈的实战解析 在车载电子与工业控制领域,CAN FD协议正逐步取代传统CAN总线,成为高速数据传输的新标准。GD32系列MCU凭借其出色的性价比和丰富的外设资源,成为许多嵌入式开发者的…...

告别Canvas截图:用MediaProjection搞定Android状态栏和视频画面的完整截取方案

Android屏幕捕获终极方案:MediaProjection深度解析与实战 在移动应用开发中,屏幕捕获功能的需求日益增长,从用户反馈收集到操作演示录制,再到远程协作支持,这一功能已成为许多应用的核心竞争力。然而,传统基…...

基于CCS811与CircuitPython的可穿戴呼吸监测面具制作全解析

1. 项目概述与核心价值 几年前,当我第一次接触到可穿戴健康设备时,就被其潜力深深吸引。但市面上的产品要么是封闭的“黑盒”,数据不透明;要么价格高昂,难以进行个性化定制。我一直想,能不能自己动手做一个…...

MongoDB 4.4+ 版本后,手把手教你搞定mongodump独立安装与配置(附环境变量设置)

MongoDB 4.4独立工具链部署指南:从零构建mongodump备份环境 当你在全新的Linux服务器上部署了MongoDB 4.4或更新版本,准备执行例行数据库备份时,在终端输入熟悉的mongodump命令却只得到command not found的响应——这不是你的操作失误&#…...

零代码玩转物联网:用ItsaSnap与Adafruit IO实现手机控制硬件

1. 项目概述:当物联网遇上零代码,用手机就能玩转硬件数据 如果你对物联网(IoT)项目感兴趣,但又对写代码、搭服务器这些技术门槛望而却步,那么今天聊的这个工具可能会让你眼前一亮。想象一下,你…...

从开发板到自研板:RK3568设备树移植与定制编译实战

1. RK3568设备树移植入门指南 第一次接触RK3568设备树移植的工程师,往往会被dts文件中密密麻麻的节点和属性搞得晕头转向。我刚开始做这块的时候,光是看那7000多行的代码就头疼。但其实只要掌握几个关键点,移植工作就会变得清晰很多。 设备树…...

5分钟掌握Snap.Hutao:免费开源的Windows原神桌面工具箱完全指南

5分钟掌握Snap.Hutao:免费开源的Windows原神桌面工具箱完全指南 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn…...

ROFL-Player:英雄联盟回放时光机,一键穿越所有版本

ROFL-Player:英雄联盟回放时光机,一键穿越所有版本 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为英雄联…...

14502黄大年茶思屋145期难题 第二题 QLC盘多namespace并发备电量优化问题 标准化解题框架

总标题:黄大年茶思屋145期难题第二题 AI无偏差版脱敏题目标准化解题详细写作框架 子标题:QLC盘多namespace并发备电量优化问题 标准化解题框架 摘要 本文严格遵循AI无偏差脱敏标准化写作范式,完整复刻本期第二道脱敏原题全文,逐项…...

避开这些坑!ISCE2数据下载实战:Earthdata账号、.netrc配置与DEM自动拼接

ISCE2数据下载实战:Earthdata账号配置与DEM自动拼接避坑指南 当你第一次尝试用ISCE2处理哨兵数据时,可能会被各种数据下载问题搞得焦头烂额。Earthdata认证失败、DEM下载报错、脚本运行异常——这些看似简单的问题往往会让整个项目停滞数天。本文将分享…...

stm32 FOC从学习开发(七)SVPWM算法MATLAB仿真进阶:从模型搭建到代码生成

1. SVPWM算法仿真与代码生成全流程 搞电机控制的朋友都知道,SVPWM(空间矢量脉宽调制)是FOC(磁场定向控制)的核心算法之一。前几期我们聊过Clark变换、Park变换,也讲过SVPWM的基本原理,今天咱们就…...

告别单一地图!用BIGEMAP叠加ArcGIS Online和OpenStreetMap,打造你的专属作业底图

告别单一地图!用BIGEMAP叠加ArcGIS Online和OpenStreetMap,打造你的专属作业底图 在GIS专业领域,单一地图源往往难以满足复杂分析需求。当我们需要同时兼顾权威数据和社区更新时,如何将不同特性的地图源智能叠加,成为提…...