|
汽车零部件采购、销售通信录 填写你的培训需求,我们帮你找 招募汽车专业培训老师
Spongent 算法是一种用于加密的轻量级哈希算法,属于海绵构造(Sponge Construction)类的密码学算法。它是由Joan Daemen 和 Mikko S. L. 在 2011 年提出的,用于构建哈希函数、消息认证码(MAC)以及伪随机生成器(PRNG)。它设计的初衷是优化加密性能并提高安全性,尤其是在硬件和资源受限的环境中,如物联网(IoT)设备。
1. 基本概念
Spongent 算法基于海绵构造(Sponge Construction)原理。海绵构造是一种通用的加密构造方式,既可以用于哈希算法,也可以用于加密、数字签名、伪随机数生成等。其基本思想是将输入消息“吸收”到一个状态中,再通过一个变换过程,产生输出信息。
海绵构造的基本流程包括两个主要步骤:
吸收(Absorb):通过不断处理输入数据(例如消息或密钥),将其“吸收”到一个内部状态中。
挤出(Squeeze):从这个状态中提取输出,生成哈希值、加密数据或其他结果。
2. Spongent 算法的构成
Spongent 使用海绵构造,并根据需要调整内部状态的大小和算法的轮数(rounds)来实现不同的安全级别和性能需求。它采用了较为简单的操作,主要包括以下几个组件:
状态(State):Spongent 维持一个固定大小的状态,可以通过不断的迭代来“吸收”输入消息并“挤出”输出。
变换函数(Permutation):每轮操作都包括一个非线性的变换函数,它负责将状态空间中的值映射到新的状态空间中。这个变换函数通过一系列的迭代轮数(rounds)进行优化。
输出(Output):从海绵状态中“挤出”最终结果,可能是哈希值、加密密钥或其他数据。
3. 主要特点
灵活性:Spongent 算法支持不同大小的输出和输入,可以根据需求调整算法的安全性与效率。
简洁性:Spongent 设计上注重算法的简单性和易于实现,适合在计算资源有限的环境下使用。
海绵结构:作为基于海绵构造的算法,Spongent 不依赖传统的迭代哈希结构(如 Merkle-Damgård 结构),这使得它在某些情况下更加灵活和高效。
高效性:Spongent 的设计优化了速度和空间使用,非常适合在嵌入式系统和硬件加速场景中运行。
4. 工作原理
吸收(Absorb)
在吸收阶段,Spongent 接收输入消息并通过迭代的方式将其吸收到内部状态中。每次迭代的输入大小是固定的,并通过一些特定的操作(如 XOR 和非线性变换)将输入数据融合到内部状态中。通常,输入数据会被划分成多个块,每个块在算法中都要经过处理。
挤出(Squeeze)
一旦输入消息被完全吸收,Spongent 会开始“挤出”输出。此过程的结果可以是哈希值,也可以是密钥或伪随机序列。这个过程也通过迭代变换进行,直到生成所需长度的输出。
5. 与其他海绵构造的区别
Spongent 和其他海绵构造的哈希算法(例如 Keccak,后者是 SHA-3 的基础)具有一些相似性,但 Spongent 在设计时注重提高效率,特别是在硬件实现中。Spongent 和 Keccak 比较的一个主要区别是它们的状态大小和变换函数的不同,这使得它们在具体应用中的性能和安全特性有所差异。
6. 应用场景
由于 Spongent 算法的轻量级和高效性,它特别适合以下场景:
物联网(IoT):在计算资源有限的设备上,Spongent 提供了高效的加密和哈希功能。
嵌入式设备:低功耗设备上需要快速且低内存占用的加密算法。
密码学协议:适用于需要灵活哈希功能的协议,尤其是在资源受限的环境中。
7. 优势与挑战
优势:
轻量级:Spongent 设计简洁,适合于资源受限的设备。
灵活性:算法可以根据不同的需求调整输出长度和安全级别。
高效性:特别适合硬件实现,具有较低的延迟和较小的资源消耗。
挑战:
相对较新的算法:作为一个相对较新的密码学算法,Spongent 可能在广泛的安全性审查和应用上还不如一些经典算法(如 SHA-2,SHA-3)成熟。
标准化进程:虽然 Spongent 提供了优秀的性能,但它还没有广泛被应用于实际的国际标准中。
8. 总结
Spongent 是一个基于海绵构造的轻量级哈希算法,旨在提供高效且灵活的加密功能,特别适合硬件实现和资源受限的环境。它的设计既注重性能优化,也注重算法的安全性,适合用于各种需要快速和高效加密的场合。尽管它具有许多优点,但仍需在实际应用中经过更多的验证和评估,以确保其长期的安全性。
核心代码:
clc;clear;close all;tic;%% 基本参数r=8;%比特率n=88;%输出的hash位数c=80;%容量b=r+c;rou=45;%循环参数
global s;global t;s=[1 0 1 0 0 0]; %反向的0xfb(s(0)是低位)t=[6 5];%LSFR参数%% 生成基础数据mfilename = sprintf('test_data_matlab.txt');fid1=fopen(filename,'rb');%打开文件句柄m = fread(fid1);m=m-48;
% m=rand(8,1);% m=round(m);%随机l=length(m);%原始数据的长度
%a=sum(m)
%% 填充阶段q=ceil(l/r);%向上取整,得到填充后的m的组数l_new=r*q;%填充后的数据长度l_change=l_new-l;m_fill=zeros(l_change,1);% m_fill(1)=1;%m_new=zeros(l_new,1);%填充后的数据m_new=[m;m_fill];m_cut=zeros(q,r);for i=1:q m_cut(i,:)=m_new((i-1)*r+1:i*r);end
m_cut=fliplr(m_cut);
m_cut_count=zeros(q,b);% m_cut_count(:,b-r+1:b)=m_cut(:,:);%填充至state的长度,方便下一部分计算m_cut_count(:,1:r)=m_cut(:,:);%填充至state的长度,方便下一部分计算
%% 吸收阶段state=zeros(b,1);%产生空的state阶段for i=1:q state=bitxor(state,m_cut_count(i,:)'); for j=1:rou state=round_add(j,state);%轮常数填充 state =Sbox(state); state=bit_change(state); end tocend%% 榨取阶段p=n/r;%榨取的次数h=zeros(p,r);ticfor i=1:p h(i,:)=state(1:r);% h(i,:)=state(b-r+1:b); for j=1:rou state=round_add(j,state);%轮常数填充 toc state =Sbox(state); toc state=bit_change(state); toc endendtoc; |
|