SHA-256算法实现

2023-11-07

SHA-256 算法输入报文的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,产生 

的输出是一个256-bit 的报文摘要。该算法处理包括以下几步: 


STEP1:附加填充比特。对报文进行填充使报文长度与448 模512 同余(长度=448 mod 512), 
填充的比特数范围是1 到512,填充比特串的最高位为1,其余位为0。
就是先在报文后面加一个 1,再加很多个0,直到长度 满足 mod 512=448.
为什么是448,因为448+64=512. 第二步会加上一个 64bit的 原始报文的 长度信息。


STEP2:附加长度值。将用64-bit 表示的初始报文(填充前)的位长度附加在步骤1 的结果 
后(低位字节优先)。


STEP3:初始化缓存。使用一个256-bit 的缓存来存放该散列函数的中间及最终结果。 
该缓存表示为A=0x6A09E667 , B=0xBB67AE85 , C=0x3C6EF372 , D=0xA54FF53A, 
E=0x510E527F , F=0x9B05688C , G=0x1F83D9AB , H=0x5BE0CD19 。


STEP4:处理512-bit(16 个字)报文分组序列。该算法使用了六种基本逻辑函数,由64 
步迭代运算组成。每步都以256-bit 缓存值ABCDEFGH 为输入,然后更新缓存内容。 
每步使用一个32-bit 常数值Kt 和一个32-bit Wt。 

常数K为


六种基本函数如下:




就像上图一样,参与运算的都是 32 bit的数,Wt 是 分组之后的报文,512 bit=32bit*16. 也就是 Wt t=1,2..16 由 该组报文产生。
Wt t=17,18,..,64 由 前面的Wt按递推公式 计算出来。Wt递推公式为:


Kt t=1,2..64 是已知的常数。


上面的计算就是不断更新 a,b,c…h这 32bit*8 。在每个512bit的分组里面迭代计算64次。


STEP5:所有的512-bit分组处理完毕后,对于SHA-256算法最后一个分组产生的输出便是256-bit的报文摘要。


实现代码

SHA256.h

#ifndef _SHA_256_H
#define _SHA_256_H
#include<iostream>
using namespace std;
typedef unsigned int UInt32;
//六个逻辑函数
#define Conditional(x,y,z) ((x&y)^((~x)&z))
#define Majority(x,y,z) ((x&y)^(x&z)^(y&z))
#define LSigma_0(x) (ROTL(x,30)^ROTL(x,19)^ROTL(x,10))
#define LSigma_1(x) (ROTL(x,26)^ROTL(x,21)^ROTL(x,7))
#define SSigma_0(x) (ROTL(x,25)^ROTL(x,14)^SHR(x,3))
#define SSigma_1(x) (ROTL(x,15)^ROTL(x,13)^SHR(x,10))
//信息摘要结构
struct Message_Digest{
    UInt32 H[8];
};
//SHA256类
class SHA256
{
public:
    SHA256(){INIT();};
    ~SHA256(){};
    Message_Digest DEAL(UInt32 W[16]);//处理512比特数据,返回信息摘要
private:
    void INIT();                //初始杂凑值
    UInt32 ROTR(UInt32 W,int n);//右旋转
    UInt32 ROTL(UInt32 W,int n);//左旋转
    UInt32 SHR(UInt32 W,int n); //右移位
private:
    //信息摘要
    Message_Digest MD;
};

#endif


SHA256.cpp

#include"SHA-256.h"
//64个32比特字的常数(前64个素数的立方根小数前32位)
const UInt32 K[64] = {
        0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
        0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
        0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
        0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
        0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
        0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
        0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
        0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
};
//初始化杂凑值(前8个素数的平方根小数前32位)
void SHA256::INIT(){
    MD.H[0] = 0x6a09e667;
    MD.H[1] = 0xbb67ae85;
    MD.H[2] = 0x3c6ef372;
    MD.H[3] = 0xa54ff53a;
        MD.H[4] = 0x510e527f;
    MD.H[5] = 0x9b05688c;
    MD.H[6] = 0x1f83d9ab;
    MD.H[7] = 0x5be0cd19;
}
//处理512比特数据,返回信息摘要
Message_Digest SHA256::DEAL(UInt32 M[16]){
    int i;
    UInt32 T1=0,T2=0;
    UInt32 W[64]={0};
    UInt32 A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;
    for(i=0;i<16;i++){
        W[i] = M[i];
    }
    for(i=16;i<64;i++){
        W[i] = SSigma_1(W[i-2])+W[i-7]+SSigma_0(W[i-15])+W[i-16];
    }
    A = MD.H[0];
    B = MD.H[1];
    C = MD.H[2];
    D = MD.H[3];
    E = MD.H[4];
    F = MD.H[5];
    G = MD.H[6];
    H = MD.H[7];
    cout<<"初始:";
    cout<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<" "<<F<<" "<<G<<" "<<H<<endl;
    for(i=0;i<64;i++){
        T1 = H + LSigma_1(E) + Conditional(E, F, G) + K[i] + W[i];
        T2 = LSigma_0(A) + Majority(A, B, C);
        H = G;
        G = F;
        F = E;
        E = D + T1;
        D = C;
        C = B;
        B = A;
        A = T1 + T2;
        cout<<dec<<i<<":";
        cout<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<" "<<F<<" "<<G<<" "<<H<<endl;
    }
    MD.H[0]=(MD.H[0]+A) & 0xFFFFFFFF;
    MD.H[1]=(MD.H[1]+B) & 0xFFFFFFFF;
    MD.H[2]=(MD.H[2]+C) & 0xFFFFFFFF;
    MD.H[3]=(MD.H[3]+D) & 0xFFFFFFFF;
    MD.H[4]=(MD.H[4]+E) & 0xFFFFFFFF;
    MD.H[5]=(MD.H[5]+F) & 0xFFFFFFFF;
    MD.H[6]=(MD.H[6]+G) & 0xFFFFFFFF;
    MD.H[7]=(MD.H[7]+H) & 0xFFFFFFFF;

    return MD;
}
//右旋转
UInt32 SHA256::ROTR(UInt32 W,int n){
    return ((W >> n) & 0xFFFFFFFF) | (W) << (32-(n));
}
//左旋转
UInt32 SHA256::ROTL(UInt32 W,int n){
    return ((W << n) & 0xFFFFFFFF) | (W) >> (32-(n));
}
//右移位
UInt32 SHA256::SHR(UInt32 W,int n){
    return ((W >> n) & 0xFFFFFFFF);
}

TEST.CPP

#include<iostream>
#include"SHA-256.h"
using namespace std;

typedef unsigned int UInt32;
typedef unsigned __int64 UInt64;
typedef unsigned char UChar;
#define Max 1000//最大字符数
SHA256 sha256=SHA256();
Message_Digest M_D;
UInt32 W[Max/4];//整型
UInt32 M[16];   //存分组信息
//压缩+显示
void compress(){
    int i;
    M_D = sha256.DEAL(M);
    cout<<"哈希值: ";
    for(i=0;i<8;i++){
        cout<<hex<<M_D.H[i]<<" ";
    }
    cout<<endl;
}
//添加填充位+添加长度
void PAD(UChar Y[Max]){
    //x+1+d+l=|x|
    UInt32 i,j;
    UInt32 T1=0,T2=0,T3=0,T4=0;
    UChar temp[Max]={0};
    UInt64 x = strlen((char *)Y);//数据长度
    UInt32 d = abs(55-x) % 64;   //填充长度
    UInt32 n = (x+8)/64+1; //分组数
    UInt32 m = x%64;       //最后组数据长度
    UInt32 l = 8;      
    cout<<"数据长度x:"<<int(x)<<" ";
    cout<<"填充长度d:"<<d<<" ";
    cout<<"分组数量n:"<<n<<" ";
    cout<<"最后长度m:"<<m<<endl;
    //不填充
    for(i=0;i<x;i++){
        temp[i] = Y[i];
    }
    //填充1次1000 0000
        temp[x] = 0x80;
    //填充d次0000 0000
    for(i=x+1;i<x+d+1;i++){
        temp[i] = 0x00;
    }
    //填充长度的63-0位
    for(i=1;i<=l;i++){
        temp[(n*64)-i] = (UChar)(8*x>>(i-1)*8);
    }
    //无符号字符转换为无符号整型
    for(i=0;i<Max/4;i++){
        for(j=0;j<4;j++){
            if(j==0)
                T1 = temp[4*i+j];
            if(j==1)
                T2 = temp[4*i+j];
            if(j==2)
                T3 = temp[4*i+j];
            if(j==3)
                T4 = temp[4*i+j];
        }
        W[i] = (T1<<24) + (T2<<16) + (T3<<8) +T4;
    }
    //显示16进制数据
    cout<<"16进制数据:";
    for(i=0;i<n*16;i++){
        cout<<hex<<" "<<W[i];
    }
    cout<<endl;
    //分组处理
    for(i=0;i<n;i++){
        cout<<"分组处理:"<<i+1<<endl;
        for(j=0;j<16;j++){
            M[j] = W[(i*16)+j];
        }
        compress();//sha-256压缩
    }
}
//主函数
int main(){
    UChar Y[Max];
    cout<<"请输入要加密的字符串(最大"<<Max<<"个):"<<endl;
    cin>>Y;
    PAD(Y);

    system("pause");
    return 0;
}


参考:

http://www.iwar.org.uk/comsec/resources/cipher/sha256-384-512.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SHA-256算法实现 的相关文章

  • 关于区块链技术的3大特点,你都了解吗?--甲由

    跟着区块链技术的开展 全球引起了比特币的张狂影响 如果说互联网是信息的高速公路 那么区块链便是金钱的高速公路 它甚至可以加快人们通往财富之路的速度 那么 什么是区块链 区块链起源于中本聪的比特币 作为比特币的底层技术 本质上是一个去中心化的
  • 以太坊(一)——概述

    一 以太坊出现的原因 比特币的不足 交易速度慢 出块时间为10分钟 采用POW算法 拼的是计算机的算力 耗电量大 会释放大量的温室气体 仅仅完成了货币的去中心化 以太坊的解决方法 交易速度加快 出块时间为15秒 以太币为10分钟 采用POW
  • 北京大学肖臻老师《区块链技术与应用》公开课 笔记目录

    北京大学肖臻老师 区块链技术与应用 公开课学习笔记 分章节进行整理 持续更新中 该系列文章中如有任何侵权内容请及时与我个人联系删除或修改 北京大学肖臻老师 区块链技术与应用 视频链接 点击这里 文章目录 01 课程介绍 点击这里 BTC 0
  • 【以太坊傻瓜教程】在私链上发布第一个合约

    以太坊傻瓜教程 在私链上发布第一个合约 教程简介 本教程将介绍如何编写合约 编译合约以及如何将合约发布到自己的私链上并调用 开发环境 本教程开发环境 操作系统 Windows10 Ethereum客户端 Windows版Geth 可以从这里
  • 区块链技术在网络安全中的应用

    区块链是一个现代的数字分类账本 不仅记录货币交易 还可以记录任何有价值的东西 输入的数字数据在Blockchain上作为相互共享的和永久记录的数据库 利用系统本身去中心化的特性具有明显的优势 区块链数据库不存储在集中位置 这意味着记录确实是
  • 区块链技术2---BTC的数据结构

    1 Hash pointers 哈希指针 和普通指针相比 哈希指针除了保存地址还保存哈希值 2 Block chain 区块链中的区块通过哈希指针相连 这里的哈希指针的哈希值是对前一个区块的整体取哈希值 包括前一个区块的哈希指针 因此区块链
  • 【虾说区块链】4个概念解析区块链

    欢迎收听 虾说区块链 现在区块链这个概念在互联网上相当火热 这里简单做一个普及 不涉及项目推广投资 单纯地对区块链相关基础知识概念作一个说明讲解 本人区块链技术爱好者 结合相关区块链资料总结整理了 虾说区块链 也是自己一个学习笔记 涉及相关
  • BTC-协议

    防范 double spending attack Distribute consensus distributed hash table 分布式共识 FLP impossibility result 在一个异步的系统里 网络时延没有上限
  • 为什么说区块链的性能严重不足?

    现如今 性能过低是当前区块链技术面临的主要挑战之一 区块链的性能指标主要包括交易吞吐量和延时 交易吞吐量表示在固定时间能处理的交易数 延时表示对交易的响应和处理时间 在实际应用中 需要综合两个要素进行考察 只使用交易吞吐量而不考虑延时是不正
  • 《北京市政务服务领域区块链应用创新蓝皮书(第一版)》正式发布

    为加快推动区块链技术和产业创新发展 北京市政务服务管理局 北京市科委 北京市经济和信息化局组织相关单位抓紧推进政务服务领域区块链应用建设 取得阶段性成果 在此基础上 北京市区块链工作专班专家组编制了 北京市政务服务领域区块链应用创新蓝皮书
  • 独角访谈

    1 序言 从比特币和区块链诞生的那天起 去中心化这个词就进入了大家的视野 技术极客们也纷纷开始研究这一开创性的技术及其应用 其中包括开发去中心化的数字货币交易所 然而这种交易所目前还未被大众熟知 原因有很多 比如大家目前还不够理解区块链技术
  • 区块链23问,你想知道的都在这里了

    本文将以一问一答的方式给大家送上一篇关于区块链的科普文 区块链是比特币吗 金融领域为什么要使用区块链技术 所有的区块链都需要挖矿吗 区块链和大数据什么关系 这些问题本文将会一一解答 前方高能 问 什么是区块链 答 区块链 Blockchai
  • 区块链技术5--BTC网络

    1BTC网络的工作过程 用户将交易发布到BTC网络上 节点收到交易后打包到区块 然后将区块发布到BTC网络上 2BTC网络的工作原理 比特币工作于网络应用层 其底层 网络层 是一个P2P Overlay network P2P覆盖网络 比特
  • 区块链系统面临哪些风险以及有哪些防范措施

    区块链是涉及多方的开放系统 早期的应用又与虚拟加密货币相关 由此使得区块链系统所内含的和面对的风险得以暴露 同时各种安全措施也得以被及时使用和验证 但区块链在真实世界的大规模应用尚未展开 因此区块链所内含以及面临的风险暴露尚不完全 预防措施
  • 朱嘉明:区块链成为经济转型、形成产业新业态的技术手段

    文章来自巴比特https www 8btc com live 14 在港珠澳大桥开通 以及粤港澳大湾区规划发展的效应下 珠海和澳门的城市发展进入到一个里程碑式的协同新阶段 尤其是拥有中央战略定位加持的国家级新区 横琴 早已吹响创新发展的号角
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记【01-课程简介】

    北大肖臻老师 区块链技术与应用 点击这里 全系列文章链接 点击这里 该系列文章中如有任何侵权内容请及时与我个人联系删除或修改 一 区块链的本质是什么 有人说区块链是下一代的价值互联网 也有人说它是世界上最慢的数据库 区块链出生以来就饱受争议
  • 区块链数据不可篡改的详细解释

    区块链数据不可篡改的详细解释 背景介绍 本人新人一枚 学习区块链的过程中 在网上看到了很多讨论区块链区块数据不可篡改的文章 以比特币为例哈 主要存在2种解释 解释1 由于哈希指针的存在 假设存在某节点修改的了当前区块数据 带来的后果就是其后
  • 解读:新基建为区块链带来的新机遇

    导读 区块链作为融合点对点传输 共识机制 加密算法等技术的分布式数据库技术 目前已渗透到数字金融 供应链管理 数字资产交易等多个领域 2019年10月 中共中央政治局集体学习区块链技术发展现状及趋势 2020年3月4日 中共中央政治局常务委
  • 农业掀起“上链”潮 区块链等数字技术正成为乡村振兴新动力

    目前区块链等数字技术已经广泛应用于农业全链条环节 近日 由中国宏观经济研究院课题组撰写的 数字技术赋能乡村产业发展报告 下简称 报告 指出 长期以来困扰乡村产业发展的难点 堵点正在逐渐被区块链等数字技术所消弭和破解 中国宏观经济研究院所做的
  • 在区块链世界中的token到底是什么?

    token的概念很广泛 在计算机领域中 无论是基础的网络架构还是服务系统的身份验证等 都有涉及到token的概念 然而在这里我想阐述的是在区块链世界中的token是什么 相信对区块链有些了解的朋友 都或多或少的听过或者看过关于token的描

随机推荐

  • RTT下移植LVGL到W601_文件系统移植

    RTT下移植LVGL到W601 显示驱动移植 声明 个人学习笔记 不保证正确 参考资料 移植参考 DFS参考 图片 图片在线转换 环境 win10 keil5 硬件 正点原子w601开发板 步骤流程 1 在显示驱动移植完成的基础上添加tf卡
  • 初次使用vscode配置方法

    从vs换到vscode 花了一天时间终于把各种问题解决 吐血整理 如有疑问 可以在评论区交流 1 安装c c 扩展 安装v1 8 4版 稳定 2 安装code runner 右键即可运行代码 操作简单 3 安装mingw 安装在线版会出现
  • 计算机视觉论文-2021-06-22

    本专栏是计算机视觉方向论文收集积累 时间 2021年6月22日 来源 paper digest 欢迎关注原创公众号 计算机视觉联盟 回复 西瓜书手推笔记 可获取我的机器学习纯手推笔记 直达笔记地址 机器学习手推笔记 GitHub地址 1 T
  • Mysql-DDL(数据定义语言)

    show databases 查看所有数据库 create databse 数据库名 创建数据库 use database 数据库名 使用数据库 删除表格如果存在 drop table if exists mumber1 create TA
  • Angular快速上手--创建Hero类

    0 前言 真实的英雄当然不止一个名字 在 src app 文件夹中为 Hero 类创建一个文件 并添加 id 和 name 属性 1 操作 src app app component ts复制并修改内容 export class Hero
  • ensp设计校园网,期末作业,课程设计报告

    1 实现功能 基本实现如下网络核心功能 1 三层架构设计 本课题按照三层网络结构 接入层 汇聚层 核心层 进行设计和规划 接入层要求提供较多的网络入口 汇聚层实现对接入层网络的互联 核心层完成校园内部和外部数据的交换 并实现路由和安全功能
  • 怎么查看vue源码

    有很多同学和我一样使用一段时间 vue 框架后 对它的源码就有了兴趣 但是不知道在哪里找 vue js 源码 随意创建一个vue项目 或者已有项目 找到根路径平级的 node modules 文件夹 往下拉 拉多一下 在文件夹尾巴一截的地方
  • SpringBoot笔记

    目录 开发准备 导出 常用注解 导出excel到指定位置 导出excel到指定web 导入 将指定位置Excel导入并显示至web 使用ExcelWriter基于模板导出 开发准备 1 导入依赖
  • Bar函数--Matplotlib

    函数Bar 用于绘制柱状图 使用bar绘制柱状图的过程中涉及到中文字体的显示问题 使用动态参数配置方法 指定了中文黑体 import matplotlib as mpl mpl rcParams font sans serif SimHei
  • web端播放m3u8视频流注意事项

    项目上有一个播放实时视频 直播 的需求 后端童鞋直接传过来一个类似 https live m3u8的视频流地址 让我自行播放 拿到地址的我一脸懵逼 下面开始我的探索 baidu 之路 HLS HTTP Live Streaming 介绍 m
  • Meta发布「分割一切」AI 模型,CV或迎来GPT-3时刻

    demo地址 Segment Anything Meta AI Meta 表示 这是第一个致力于图像分割的基础模型 自此 CV 也走上了 做一个统一某个 某些 全部 任务的全能模型 的道路 在此之前 分割作为计算机视觉的核心任务 已经得到广
  • java属性值注解

    查询条件开始时间 DateTimeFormat pattern yyyy MM dd HH mm ss JsonFormat pattern yyyy MM dd HH mm ss timezone GMT 8 private Date t
  • C# VS2010 Winform 查找链表的近邻值

    实现在类似数组中查找最接近目标值的数值 定义链表 定义链表 private List
  • 架构师进阶之路

    选择的范围太广 可以读的书太多 往往容易无所适从 我想就我自己读过的技术书籍中挑选出来一些 按照学习的先后顺序 推荐给大家 特别是那些想不断提高自己技术水平的Java程序员们 一 Java编程入门类 对于没有Java编程经验的程序员要入门
  • 随机森林建模

    在看datacastle的建模大赛 用r写了随机森林的二分类 上次代码用py跑的 这里想用交叉验证 但是跑了一天一夜也木有出来 还是把代码先保留下来吧 希望看到的人指正 rm list ls setwd D competitions dat
  • Android获取本地相册中图片视频

    权限
  • Linux多进程:exit——进程退出函数

    子进程结束释放自己的用户区数据 内核区数据由其父进程回收释放 pcb fd 等 进程退出函数 void exit int status status 是进程退出时的一个状态信息 父进程在回收子进程资源时可以获取 include
  • 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。

    这个是一个比较坑的题 但也是一个极其能查缺补漏的题 题目描述 求Sn 1 2 3 4 5 n 之值 其中n是一个数字 n不超过20 输入 n 输出 Sn的值 样例输入 5 样例输出 153 在这里插入代码片 乍一看很简单 一下就打好了 但开
  • C++ 结构体转json

    FdogSerialize FdogSerialize是一个用于C 序列化的开源库 采用非入侵方式 无需在原有结构体上进行修改 目前支持基础类型 基础类型数组 结构体 以及vector list map等数据类型的序列化 支持JSON和XM
  • SHA-256算法实现

    SHA 256 算法输入报文的最大长度不超过2 64 bit 输入按512 bit 分组进行处理 产生 的输出是一个256 bit 的报文摘要 该算法处理包括以下几步 STEP1 附加填充比特 对报文进行填充使报文长度与448 模512 同