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

密码学 - SHA-2

实验八  SHA-2

1.实验目的

熟悉SHA – 2算法的运行过程,能够使用C++语言编写实现SHA-2算法程序,增加对摘要函数的理解。

2、实验任务

(1)理解SHA-2轮函数的定义和常量的定义。

(2)利用VC++语言实现SHA-2算法。

(3)分析SHA-2算法运行的性能。

3、实验原理

SHA-256算法输入报文的最大长度不超过2“比特,输入按512比特分组进行处理,产生的输出是一个256比特的报文摘要。该算法处理包括以下几步:

(1)附加填充比特。对报文进行填充使报文长度与448模512同余(长度=448 mod512),填充的比特数范围是1~512,填充比特串的最高位为l,其余位为0。

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

(3)初始化缓存。使用一个256比特的缓存来存放该散列函数的中间及最终结果。该缓存表示为A=0x6A09E667,B=0xBB67AE85,C=Оx3C6EF372,D=0xA54FF53A,E=0x510E527F,F=0x9B05688C,G=0xlF83D9AB,H=0x5BEOCD19。

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

4、实验过程

SHA-2是一组密码学哈希函数,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224和SHA-512/256。SHA-2轮函数定义了SHA-2算法中的核心操作。SHA-2算法使用了不同的轮函数,具体取决于哈希函数的变种。SHA-256的轮函数包括以下步骤:

 a. 消息预处理:原始消息被填充为512位的多个块。然后,消息长度被附加到消息的末尾,通常以64位的二进制表示。

b. 初始化Hash值:SHA-256使用8个32位的初始化Hash值(A, B, C, D, E, F, G, H),这些值是根据黄金分割数来确定的,通常使用前256位的平方根的小数部分的前32位。

c. 消息分块:原始消息被分成512位的块,依次处理。

d. 消息调度:512位块被分成16个32位的字,然后根据一定规则,生成额外的字(W[16]到W[63]),用于轮函数的迭代。

e. 轮函数迭代:SHA-256算法包括64轮迭代,每轮使用不同的常量K和轮函数,对Hash值进行更新。

f. 生成哈希值:最后,合并所有Hash值(A, B, C, D, E, F, G, H)并输出。

SHA-2常量K是每轮中使用的常量值,每个常量K的值是SHA-256算法中的一个根号数的小数部分的前32位。这些常量K的值在SHA-256算法中是固定的。

#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <sstream>
#include <vector>
#include <cstdint>// SHA-256 Constants
const uint32_t K[] = {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
};#define ROTR(x, n) ((x >> n) | (x << (32 - n)))
#define SHR(x, n) (x >> n)uint32_t Ch(uint32_t x, uint32_t y, uint32_t z) {return (x & y) ^ (~x & z);
}uint32_t Maj(uint32_t x, uint32_t y, uint32_t z) {return (x & y) ^ (x & z) ^ (y & z);
}uint32_t Sigma0(uint32_t x) {return ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22);
}uint32_t Sigma1(uint32_t x) {return ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25);
}uint32_t sigma0(uint32_t x) {return ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3);
}uint32_t sigma1(uint32_t x) {return ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10);
}// SHA-256 
void sha2(const std::string &message) {std::vector<uint8_t> data(message.begin(), message.end());uint64_t messageLength = data.size() * 8;data.push_back(0x80); while ((data.size() + 8) % 64 != 0) {data.push_back(0x00);}for (int i = 0; i < 8; ++i) {data.push_back((messageLength >> (56 - i * 8)) & 0xFF);}uint32_t h[8] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19};for (size_t i = 0; i < data.size(); i += 64) {uint32_t w[64];for (int t = 0; t < 16; ++t) {w[t] = (data[i + t * 4] << 24) | (data[i + t * 4 + 1] << 16) | (data[i + t * 4 + 2] << 8) | data[i + t * 4 + 3];}for (int t = 16; t < 64; ++t) {w[t] = sigma1(w[t - 2]) + w[t - 7] + sigma0(w[t - 15]) + w[t - 16];}uint32_t a = h[0];uint32_t b = h[1];uint32_t c = h[2];uint32_t d = h[3];uint32_t e = h[4];uint32_t f = h[5];uint32_t g = h[6];uint32_t j = h[7];for (int t = 0; t < 64; ++t) {uint32_t t1 = j + Sigma1(e) + Ch(e, f, g) + K[t] + w[t];uint32_t t2 = Sigma0(a) + Maj(a, b, c);j = g;g = f;f = e;e = d + t1;d = c;c = b;b = a;a = t1 + t2;}h[0] += a;h[1] += b;h[2] += c;h[3] += d;h[4] += e;h[5] += f;h[6] += g;h[7] += j;}for (int i = 0; i < 8; ++i) {std::cout << std::hex << std::setfill('0') << std::setw(8) << h[i];}std::cout << std::dec << std::endl;
}int main() {std::string message = "Hello, SHA-2!";sha2(message);return 0;
}

5、实验心得

        SHA-2算法是一种广泛使用的密码学哈希函数,用于计算数据的消息摘要。SHA-2包括一系列不同长度的哈希函数,如SHA-224、SHA-256、SHA-384和SHA-512,分别输出224位、256位、384位和512位的消息摘要。本次实验采用SHA-256实现算法,SHA-2算法是一种强大的哈希算法,通常用于数据完整性验证、数字签名等应用。

相关文章:

密码学 - SHA-2

实验八 SHA-2 1.实验目的 熟悉SHA – 2算法的运行过程&#xff0c;能够使用C语言编写实现SHA-2算法程序&#xff0c;增加对摘要函数的理解。 2、实验任务 &#xff08;1&#xff09;理解SHA-2轮函数的定义和常量的定义。 &#xff08;2&#xff09;利用VC语言实现SHA-2算…...

Vins-Fusion、Vins-Mono(之前那个编译通过但是没有这个好用)

ROS的catkin_make不要修改,暂时没有理由&#xff0c;理由就是两次一个改了一个没改&#xff0c;没改的成功了以成功为准。 另外docker也没用成功&#xff0c;原本的逻辑来说&#xff0c;docker肯定不能出问题的&#xff0c;但是由于roscore通信的原因可能没有将结果显示&#x…...

每日自动化提交git

目前这个功能&#xff0c;有个前提&#xff1a; 这个git代码仓库&#xff0c;是一个人负责&#xff0c;所以不存在冲突问题 我这个仓库地址下载后的本地路径是&#xff1a;D:\Projects\Tasks 然后我在另外一个地方新建了一个bat文件&#xff1a; bat文件所在目录为&#xff1a…...

【Linux进程】再谈软件—操作系统(Operator System)

目录 操作系统(Operator System) 概念 设计OS的目的 如何理解 "管理"——先描述再组织 系统调用和库函数概念 总结 操作系统(Operator System) 概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。 笼统的理解&#xff0c;操作系统…...

创建超过1G内存大小的程序

正常情况一个进程最大占用内存为1G一下&#xff0c;如果程序有需求要使用超过1G大小的程序&#xff0c;可进行如下操作 VS修改设置&#xff1a;属性--->链接器--->系统--->启用大地址 【选择是】 测试申请堆内存代码 #include <stdlib.h> #include <stdio…...

如何本地部署Jellyfin影音服务器并实现在公网访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…...

docker fixuid

docker fixuid 一、fixuid是什么二、使用场景三、问题dockerfiledocker run 一、fixuid是什么 fixuid是用go语言编写的&#xff0c;当容器起来后可以修改容器中非root用户的UID/GID和文件权限。 项目地址&#xff1a;https://github.com/boxboat/fixuid 二、使用场景 当容器…...

MySQL笔记--SQL语句

目录 1--SQL的通用语法 2--SQL语句的分类 3--DDL语句 3-1--数据库操作 3-2--表操作 3-3--数据类型 3-4--修改和删除 4--DML语句 4-1--插入数据 4-2--修改数据 4-3--删除数据 5--DQL语句 5-1--基本查询 5-2--条件查询 5-3--聚合函数 5-4--分组查询 5-5--排序查…...

线扫相机DALSA-相机平场矫正详细步骤

在相机视野下铺放白色亚克力板或纯白纸&#xff0c;采集图像。打开曲线图。 选择 Line Profile 模式。调节好相应所需的曝光时间、光源、增益和镜头光圈&#xff0c;让白平衡纸显示出来的灰度值大概在 150-200 左右。 在Calibration Algorithm 中将显示的数值设置好。 先暗场…...

求购供应发布农业副业产品市场行情小程序开发

农业副业产品求购供应发布市场行情小程序H5开源版开发 后台同步&#xff1a;一键获取全国近200家农产品批发市场的商品价格&#xff0c;包括蔬菜、水果、水产、粮油和农副产品等。 实时更新和同步市场价格动态&#xff0c;保障信息的准确性和时效性。 前端VIP权益功能&…...

框架安全-CVE 复现SpringStrutsLaravelThinkPHP漏洞复现

目录 服务攻防-框架安全&CVE 复现&Spring&Struts&Laravel&ThinkPHP概述PHP-开发框架安全-Thinkphp&Laravel漏洞复现Thinkphp-3.X RCEThinkphp-5.X RCELaravel框架安全问题- CVE-2021-3129 RCE JAVAWEB-开发框架安全-Spring&Struts2Struts2框架安全…...

【腾讯云 HAI域探秘】宝妈也能快速入门AI绘画

活动背景 本次活动是由腾讯云和CSDN联合推出的开发者技术实践活动。我通过技术交流直播、动手实验、征文等形式&#xff0c;深入沉浸式体验腾讯云高性能应用服务 HAI。从活动中汲取到技术上的精华。在本次活动中&#xff0c;只要完成各个环节任务&#xff0c;不仅可以参与 AIGC…...

归并排序,自顶向下

归并排序主要两步&#xff0c;一步是划分区间&#xff0c;另一步是合并两个区间 这个算法的稳定性更好&#xff0c;对比快排这种&#xff0c;如果整体是倒序的话&#xff0c;快排的复杂度会达到o(n^2)&#xff0c;归并会更稳定。 划分区间主要是递归去实现&#xff0c;下面给…...

【案例】3D地球(vue+three.js)

需要下载插件 <template><div class"demo"><div id"container" ref"content"></div></div> </template> <script> import * as THREE from three; // import mapJSON from ../map.json; import { Or…...

C语言中float byte char uint_8 转换方法

1.float转Byte[] #include <stdio.h>int main() {float floatValue 3.141592; // 浮点数值// 存储到字节数组unsigned char *byteArr (unsigned char *)&floatValue;// 打印字节数组for (int i 0; i < sizeof(float); i) {printf("Byte %d: 0x%02X\n&q…...

瑞明达:脚踏实地,为实体经济贡献“瑞明达”力量

实体经济是指以实际物质生产和经营为主要特征的经济形态&#xff0c;是经济发展的基础和主体。瑞明达团队一直关注着实体经济的发展&#xff0c;也在不断探索如何运用科技手段和管理经验助力实体经济的发展。团队将从几个方面介绍瑞明达团队的看法和实践经验。 实体经济在国家经…...

ChatGPT-自然语言处理模型

前言 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种自然语言处理模型&#xff0c;具有强大的文本生成和理解能力。 使用场景 它可以用于各种场景&#xff0c;包括但不限于&#xff1a; 1. 自动文本生成&#xff1a;GPT可以生成连贯、流畅的文章、故…...

Apache Dolphinscheduler如何不重启解决Master服务死循环

个人建议 Apache Dolphinscheduler作为一个开源的调度平台&#xff0c;目前已经更新到了3.X版本&#xff0c;4.0版本也已经呼之欲出。3.0版本作为尝鲜版本&#xff0c;新添加了许多的功能&#xff0c;同时也存在非常多的隐患&#xff0c;本人使用3.0版本作为生产调度也踩了很多…...

绝对好用!一个浏览器插件解决跨设备同步问题,吊打文件传输助手!

在数字化的时代&#xff0c;我们所接触的信息呈现指数级的增长。无论是办公资料、学习资源&#xff0c;还是各种生活中的点滴&#xff0c;所有这些信息以各种形式——文本、图片、视频、音乐等——出现在我们面前&#xff0c;如何有效地同步和管理这些内容成为一个挑战。 就跨…...

阿昌教你如何优雅的数据脱敏

阿昌教你如何优雅的数据脱敏 Hi&#xff0c;我是阿昌&#xff0c;最近有一个数据脱敏的需求&#xff0c;要求用户可自定义配置数据权限&#xff0c;并对某种类型数据进行脱敏返回给前端 一、涉及知识点 SpringMVCJava反射Java自定义注解Java枚举 二、方案选择 1、需求要求…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...