目录
SHA-256(安全哈希算法-256位)是SHA-2系列算法之一,由NSA设计。SHA-256将任意长度的输入(在本例中为图像数据)通过一系列复杂的运算转换成一个256位(32字节)的哈希值。这个哈希值几乎唯一地标识了输入数据:即使是微小的输入变化,也会导致输出哈希值的巨大变化。
1. SHA-256算法原理
SHA-256算法是Secure Hash Algorithm 2家族中的一员,是一种广泛应用的密码散列函数,特别适用于数字签名、数据完整性校验和消息认证码(MAC)等场景。其设计目标是将任意长度的输入(称作消息)映射成固定长度的输出(称为散列值或摘要),并且该映射过程具有高度的离散性和单向性(即很难从散列值推导出原始消息)。
SHA-256(Secure Hash Algorithm 256 bits)是一种安全散列算法,它将任意长度的消息数据转化为一个固定长度(256位)的散列值,这个过程是不可逆的。散列值用于验证数据的完整性,即所谓的“指纹”:
H(M)=SHA-256(M)
其中 M 是原始输入数据,H(M) 是256位的散列值。
SHA-256算法具体工作原理可以概括为以下几个核心步骤:
消息预处理:
填充:首先,将原始消息在其末尾添加一个“1”比特,然后补充0比特直到总长度达到最接近的比512比特的倍数且最后64比特等于原始消息长度的比特表示(以小端序)。
分组:填充后的消息被划分为多个512比特的数据块。
初始化变量:
SHA-256定义了八个32比特的初始常量(哈希值),它们是预先设定好的特定数值。
处理消息块:
对于每一个512比特的消息块,执行以下步骤:
将消息块划分为16个32比特的词(W0到W15)。
执行一系列循环操作,其中包括:
扩展操作:对每个词进行逻辑右移和循环左移操作,以及将相邻词异或起来,生成64个扩展词(W[i],i=16至63)。
压缩函数:将上述扩展词与当前的内部状态(也是一组32比特的词)进行一系列逻辑和算术运算,包括异或、与、非、加法等,最终更新内部状态。
输出摘要:
当所有的消息块都被处理过后,内部状态的8个32比特词合并得到最终的256比特散列值,即SHA-256摘要。
整个算法的设计确保了即使在输入消息仅改变一位的情况下,输出的散列值也会发生显著变化,从而满足了密码学上要求的雪崩效应。SHA-256至今尚未发现重大安全漏洞,在许多安全敏感的应用领域仍被认为是安全的散列函数之一。然而,随着计算能力的提升,针对SHA-256的暴力攻击逐渐变得更为可能,特别是在寻找碰撞的情况下,SHA-3族(如Keccak)已经取代SHA-2成为新的推荐标准,尽管SHA-256仍在广泛应用中保持安全有效。
2. 基于SHA-256的图像加密原理
图像分割:将图像分成若干个块(比如32x32像素大小的块)。
数据扩展:将每一块图像数据与密钥(或Genesis Block的某些特征)进行异或操作(XOR)加密:
散列嵌入:对加密后的每个块计算SHA-256散列值,并将散列值附加到下一个块的加密过程中,形成链式结构,类似区块链的区块链接机制。
循环迭代:每次迭代更新密钥,例如使用上一次散列值的一部分作为下一次加密的密钥,增加破解难度。
3.基于区块链的图像解密原理
解密过程实质上是加密过程的逆操作,但是因为采用了链式结构和密钥的迭代更新,所以不能直接逆运算。解密时需要正确的密钥顺序和来源(即区块链的结构):
密钥恢复:按照区块链的方式从最后一个加密块开始,使用已知的正确散列值(从区块链中获取)反推出相应的密钥。
图像块解密:根据恢复的密钥对加密块进行异或操作解密:
验证完整性:解密每个块后,使用该块的散列值与从区块链中提取的实际散列值进行对比,确认数据的完整性。
4.MATLAB核心程序
............................................................
% 加密过程
for i=1:m
for j=1:32:n
% 提取图像子块
temp=x(i,j:j+31);
% 使用 Genesis Block 与图像子块进行异或操作
y(i,j:j+31)=bitxor(Gb(k,:),x(i,j:j+31));
% 计算加密后的子块的 SHA256 哈希值作为新的 Genesis Block
Gb(k+1,:) = uint8(sha256hasher.ComputeHash(y(i,j:j+31)));k=k+1;
end
end
% 显示加密后的图像及直方图,并分别附上标题
figure,imshow(y); title('加密图像');
figure,imhist(y); title('加密图像直方图');
% 解密过程(注:该部分代码未启用计时功能)
Gb1(1)=Gb(1)+10;
y(1,1)=y(1,1)+7;% 对加密图像的某个位置进行修改
z=uint8(zeros(m,n));% 初始化解密后的图像矩阵 z 为与原图像相同尺寸的全零矩阵
k=1;
for i=1:m
for j=1:32:n
% 使用 Genesis Block 与加密子块进行异或操作以解密
Gb1(k+1,:) = uint8(sha256hasher.ComputeHash(y(i,j:j+31)));
z(i,j:j+31)=bitxor(Gb1(k,:),y(i,j:j+31));k=k+1;
end
end
% toc
figure,imshow(z); title('基于区块链解密后的图像');
figure,imhist(z); title('基于区块链解密后图像的直方图');
z1=z(:);
z2(Ind)=z1;
Z=reshape(z2,m,n);
isequal(X,Z)
figure,imshow(Z); title('解密后的图像');
figure,imhist(Z); title('解密后图像的直方图');
4061