SHA256算法学习

news2024/10/19 8:39:37

  SHA-256(Secure Hash Algorithm 256-bit)是一种常用的哈希算法,是SHA-2家族中的一种。它可以将任意长度的数据转换为一个固定长度的256位(32字节)哈希值。

算法特点

  • 固定长度输出:无论输入数据有多长,SHA-256总是输出一个256位(64个十六进制字符)的哈希值。
  • 单向不可逆:给定输出哈希值,难以反推出原始输入。

算法流程

消息预处理

  • 填充:将消息进行填充,使得填充后的消息长度对512取余为448。
    填充方式是在原始消息后面添加一个1,然后连续添加0,直到消息长度达到448比特(即接近512的整数倍)。
    填充的最后64位用于存储原始消息的长度(以比特为单位)。
  • 分块:将填充后的消息划分为多个512位(64字节)的块。

初始化缓冲区

SHA-256使用八个32位的初始哈希值,表示为H0到H7:

H0 = 0x6a09e667
H1 = 0xbb67ae85
H2 = 0x3c6ef372
H3 = 0xa54ff53a
H4 = 0x510e527f
H5 = 0x9b05688c
H6 = 0x1f83d9ab
H7 = 0x5be0cd19

循环压缩

对于每个512位的消息块,SHA-256进行64轮压缩运算。

  • 消息扩展
    将每个512位的消息块扩展为64个32位的字(W0到W63),前16个字直接来自于消息块,后48个通过非线性函数生成。

  • 主循环
    使用64个固定的常量K,这些常量是前64个素数的立方根的小数部分。
    对于每一轮运算,使用非线性函数(如Σ0、Σ1、Ch、Maj等)进行复杂的位运算,确保哈希函数的混淆性和扩散性。

  • 更新哈希值

H0 = H0 + a
H1 = H1 + b
H2 = H2 + c
H3 = H3 + d
H4 = H4 + e
H5 = H5 + f
H6 = H6 + g
H7 = H7 + h

输出哈希值

当所有的消息块处理完毕后,将最终的H0到H7值连接起来,得到最终的256位哈希值。

python调用

import hashlib
data = "Bileton"
data_hash = hashlib.sha256(data.encode("UTF-8")).hexdigest()
print(data_hash)
>>> b54bc358a78fb7bbfcb6bdcd79ba65436534c222ce67ebbc838e8a29df5b2b28

Java 调用

MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
String data = "Bileton";
sha256.update(data.getBytes());
byte[] data_sha256=sha256.digest();
String result = HexFormat.of().formatHex(data_sha256);
System.out.println(result);

>>> b54bc358a78fb7bbfcb6bdcd79ba65436534c222ce67ebbc838e8a29df5b2b28

Android Studio

MessageDigest sha256 = MessageDigest.getInstance("sha-256");
sha256.update(data.getBytes());
byte[] data_sha1 = sha256.digest();
String result = bytesToHex(data_sha1);
Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2218350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter assets配置加载本地图片报错

首选列出我在照着网上说的设置assets怎么搞都报错,错误如下,搞的我想骂娘。 flutter: uses-material-design: true assets: - assets/images 后来找到了下面这个教程,才终于解决,就是要在后面加一个"/" 。 flutter这个…

【JVM】—深入理解ZGC回收器—背景概念回收流程

深入理解ZGC回收器—背景概念&回收流程 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 文章目录 深入…

韩信走马分油c++

韩信走马分油c 题目算法代码 题目 把油桶里还剩下的10斤油平分,只有一个能装3斤的油葫芦和一个能装7斤的瓦罐。如何分。 算法 油壶编号0,1,2。不同倒法有:把油从0倒进0(本壶到本壶,无效)&…

YoloV9改进策略:主干网络改进|DeBiFormer,可变形双级路由注意力|全网首发

摘要 在目标检测领域,YoloV9以其高效和准确的性能而闻名。然而,为了进一步提升其检测能力,我们引入了DeBiFormer作为YoloV9的主干网络。这个主干网络的计算量比较大,不过,上篇双级路由注意力的论文受到很大的关注&…

Centos7搭建minio对象存储服务器

Centos7搭建minio对象存储服务器 安装二进制程序配置服务文件 安装二进制程序 参考:https://segmentfault.com/q/1010000042181876 minio中国版:https://www.minio.org.cn/download.shtml#/linux # 下载二进制程序 wget https://dl.min.io/server/min…

matlab相位图

% 清空工作空间和命令窗口 clear; clc; % 模拟生成时间t,位移y(t)和角位移theta(t) t linspace(0, 100, 1000); % 时间从0到100,包含1000个点 y 1e-5 * sin(2 * pi * 0.1 * t) .* exp(-0.01 * t); % 位移y(t) 振荡衰减 theta 1e-6 * cos(2 * pi * …

第8篇:网络安全基础

目录 引言 8.1 网络安全的基本概念 8.2 网络威胁与攻击类型 8.3 密码学的基本思想与加密算法 8.4 消息认证与数字签名 8.5 网络安全技术与协议 8.6 总结 第8篇:网络安全基础 引言 在现代信息社会中,计算机网络无处不在,从互联网到局…

如何将 Docker 镜像的 tar 文件迁移到另一台服务器并运行容器

在 Docker 容器化的世界里,我们经常需要将容器从一个环境迁移到另一个环境。这可能是因为开发、测试或生产环境的需求。本文将详细介绍如何将 Docker 镜像的 tar 文件从一台服务器迁移到另一台服务器(IP 地址为 192.168.100.10),并…

深度学习每周学习总结J3(DenseNet-121算法实战与解析 - 鸟类识别)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 DenseNet 与 ResNet1. 设计理念2. 网络结构3. 与CNN和ResNet的对比补充:一些网络结构对比的网站(重要&#x…

【C++基础篇】——逐步了解C++

【C基础篇】——逐步了解C 文章目录 【C基础篇】——逐步了解C前言一、C的第一个程序二、命名空间1.namespace的价值2.namespace的定义3.命名空间的使用 三、C的输入&输出四、缺省参数五、函数重载六、引用1.引用的概念和定义:2.引用的特性3.引用的使用4.const引…

标准/开源版本,长连接无法启动

在配置长链接的时候,有时候会出现无法正常启动的问题,下面介绍几种情况,并给出解决办法 1、启动入下图所示,是因为你的php的禁用函数没有解禁,按照配置文档中的解禁所有禁用函数 2、检查你的反向代理是否配置正确&…

华山论剑之Rust的Trait

华山论剑,群雄荟萃,各显神通。武林中人,各有所长,或剑法飘逸,或掌法刚猛,或轻功绝顶。这就好比Rust中的trait,它定义了一种武功套路,而不同的门派、不同的人,可以将这套武…

shell脚本宝藏仓库(基础命令、正则表达式、shell基础、变量、逻辑判断、函数、数组)

一、shell概述 1.1 shell是什么 Shell是一种脚本语言 脚本:本质是一个文件,文件里面存放的是特定格式的指令,系统可以使用脚本解析器、翻译或解析指令并执行(shell不需要编译) Shell既是应用程序又是一种脚本语言&…

5.12 向内核传递信息(2)

首先是 设置 loard_16.c 中的 boot_info 这个变量, 这里最初保存的是 读取到的内存的信息。 然后是 增加跳转的函数。 然后就是 去改动 内核代码。 由于内核的代码最终 调用的是 kernel_init. 最关键的就是 这里了, call kernel_init 相当于 在调用一个…

阿里巴巴达摩院|Chain of Ideas: 利用大型语言模型代理革新新颖创意开发的研究

阿里巴巴集团达摩院|Chain of Ideas: 利用大型语言模型代理革新新颖创意开发的研究 🎯 推荐指数:🌟🌟🌟 📖 title:Chain of Ideas: Revolutionizing Research in Novel Idea Develop…

C++ | Leetcode C++题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> constructRectangle(int area) {int w sqrt(1.0 * area);while (area % w) {--w;}return {area / w, w};} };

【十】Hyperf最简单的使用rabbitMQ

配置.env文件 AMQP_HOST192.168.86.102 AMQP_PORT5672 AMQP_USERrabbitmq AMQP_PASSWORDrabbitmq AMQP_VHOSTmy-test配置文件 生产者 消费者(注意&#xff1a;里面的num在实际使用的时候&#xff0c;至少为1&#xff0c;不然没有消费者队列来执行里面的操作) 调用&#xff0c;…

【在Linux世界中追寻伟大的One Piece】应用层自定义协议|序列化

目录 1 -> 应用层 2 -> 网络版计算器 3 -> 序列化与反序列化 4 -> 重新理解read、write、recv、send和tcp为什么支持全双工 5 -> 开始实现 5.1 -> 定制协议 5.2 -> 关于流式数据的处理 1 -> 应用层 应用层是OSI模型或TCP/IP模型中的最高层&…

【C++贪心】2712. 使所有字符相等的最小成本|1791

本文涉及知识点 C贪心 LeetCode2712. 使所有字符相等的最小成本 给你一个下标从 0 开始、长度为 n 的二进制字符串 s &#xff0c;你可以对其执行两种操作&#xff1a; 选中一个下标 i 并且反转从下标 0 到下标 i&#xff08;包括下标 0 和下标 i &#xff09;的所有字符&am…

软件设计模式------简单工厂模式

简单工厂模式&#xff08;Simple factory Pattern&#xff09;&#xff0c;又称静态工厂方法(Static Factory Method),属于创新型模式&#xff0c;但它不属于GoF23个设计模式其一。 一、模式动机&#xff1a; 有时需要创建一些来自相同父类的类的实例。 二、定义&#xff1a…