openssl+sha256开发实例(C++)

文章目录

  • 一、 sha256介绍
  • 二、sha256原理
  • 三、openssl sha256实现

一、 sha256介绍

SHA-256(Secure Hash Algorithm 256-bit)是一种哈希算法,属于 SHA-2(Secure Hash Algorithm 2)家族的一员。SHA-256 产生的哈希值是一个256位(32字节)的二进制数字,通常以64个十六进制字符的形式表示。

以下是 SHA-256 的一些关键特点和应用:

  1. 安全性: SHA-256 被广泛认为是安全的哈希算法。对于理论上的攻击者来说,找到两个不同的输入产生相同的 SHA-256 哈希值(碰撞)的难度应该是极大的。

  2. 固定输出长度: SHA-256 生成的哈希值始终是256位,不论输入的长度如何。这种固定的输出长度使其在各种应用中易于处理。

  3. 抗碰撞性: SHA-256 具有良好的抗碰撞性,即使对输入进行微小的改动,输出的哈希值也应该发生很大的变化。

  4. 广泛应用: SHA-256 在数字签名、密码学协议、区块链等许多领域得到广泛应用。在比特币和以太坊等区块链中,SHA-256 被用于生成区块的哈希值。

  5. 不可逆性: SHA-256 是一个单向哈希函数,即从哈希值不能逆向推导出原始输入。这种性质对于存储密码的安全性很重要,因为即使泄露了哈希值,攻击者也难以还原出原始密码。

  6. 快速计算: SHA-256 的计算速度通常比较快,使其适用于对大量数据进行哈希的场景。

SHA-256 不仅仅是密码学领域的重要组成部分,它还在数据完整性验证、数字证书生成、文件校验等方面得到了广泛的应用。在使用 SHA-256 或其他哈希算法时,重要的是要理解其适用范围和局限性,以及在具体场景中的正确使用方式。

二、sha256原理

SHA-256(Secure Hash Algorithm 256-bit)是一种密码哈希函数,用于产生固定长度的哈希值,通常是256位(32字节)。SHA-256 属于 SHA-2(Secure Hash Algorithm 2)家族,设计用于替代较旧的 SHA-1。

SHA-256 的原理可以概括如下:

  1. 数据填充: SHA-256 接受的输入是任意长度的二进制数据。首先,将输入数据进行填充,以确保其长度符合 SHA-256 的处理规范。填充的方法包括在数据末尾添加比特位以指示原始数据的长度。

  2. 初始常量: SHA-256 使用一组初始常量,这些常量是 SHA-256 算法中固定的初始值。

  3. 初始哈希值: SHA-256 使用一个256位的初始哈希值,这些哈希值是 SHA-256 算法中的初始状态。这个初始哈希值通常是通过对预定的常量应用某些操作而生成的。

  4. 消息分块: 输入数据被分割成若干个固定大小的块。每个块经过一系列的处理步骤。

  5. 压缩函数: SHA-256 使用一个称为压缩函数的函数对每个块进行处理。这个压缩函数涉及了位运算、逻辑运算和基本的数学运算。

  6. 迭代运算: 对每个块应用压缩函数,并将其结果与前一块的输出(或初始哈希值)结合,形成下一轮迭代的输入。

  7. 最终结果: 经过所有块的处理后,最终的输出即为 SHA-256 的哈希值。

SHA-256 的设计考虑了对碰撞性的要求,即找到两个不同的输入产生相同的哈希值的难度非常大。这是通过在设计中引入复杂的位运算和逻辑运算来实现的。

总体而言,SHA-256 是一个单向函数,即无法从哈希值逆向还原出原始数据。这使得它在密码学中有广泛的应用,包括数字签名、密码验证、数据完整性验证等。SHA-256 的安全性建立在对其算法的数学性质的困难性推断上。

三、openssl sha256实现

#include <iostream>
#include <iomanip>
#include <openssl/sha.h>std::string sha256(const std::string& input) {unsigned char hash[SHA256_DIGEST_LENGTH];SHA256_CTX sha256;SHA256_Init(&sha256);SHA256_Update(&sha256, input.c_str(), input.length());SHA256_Final(hash, &sha256);std::stringstream ss;for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(hash[i]);}return ss.str();
}int main() {std::string input = "Hello, SHA-256!";std::string hashed = sha256(input);std::cout << "Input: " << input << std::endl;std::cout << "SHA-256 Hash: " << hashed << std::endl;return 0;
}

在这个示例中,sha256 函数接受一个字符串作为输入,计算其 SHA-256 散列,并返回十六进制表示的散列值。

编译时请确保正确链接 OpenSSL 库,使用的链接选项通常包括 -lssl -lcrypto

你可以使用类似以下的命令编译:

g++ -o sha256_example sha256_example.cpp -lssl -lcrypto

然后运行生成的可执行文件:

./sha256_example

输出应该会显示输入字符串的 SHA-256 散列。请注意,这里的代码简化了错误处理和其他边缘情况,真实的应用中可能需要更加健壮的实现。

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

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

相关文章

Redis使用Pipeline(管道)批量处理

Redis 批量处理 在开发中&#xff0c;有时需要对Redis 进行大批量的处理。 比如Redis批量查询多个Hash。如果是在for循环中逐个查询&#xff0c;那性能会很差。 这时&#xff0c;可以使用 Pipeline (管道)。 Pipeline (管道) Pipeline (管道) 可以一次性发送多条命令并在执…

【操作系统】考研真题攻克与重点知识点剖析 - 第 3 篇:内存管理

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

Git 服务器上的 LFS 下载

以llama为例&#xff1a; https://huggingface.co/meta-llama/Llama-2-7b-hf Github # 1. 安装完成后&#xff0c;首先先初始化&#xff1b;如果有反馈&#xff0c;一般表示初始化成功 git lfs install ​ # 2. 如果刚刚下载的那个项目没啥更改&#xff0c;重新下一遍&#x…

TP触摸屏调试

此处以MT6739 1g版本敦泰TP为例(kernel 4.19),主要修改点如下: 1. 两个配置文件defconfig: kernel-4.19\arch\arm\configs\k39tv1_bsp_1g_k419_debug_defconfig: kernel-4.19\arch\arm\configs\k39tv1_bsp_1g_k419_defconfig: CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCRE…

一文了解游戏行业(数据分析)

一.概况 1.基本术语 游戏行业基础术语——持续更新ing... 2.产业链 包括游戏开发&#xff0c;发行和销售等环节 ①游戏开发 上游环节是游戏产业链的核心环节&#xff0c;包括游戏策划&#xff0c;美术设计&#xff0c;程序开发等&#xff0c;是决定游戏质量与内容的关键因…

Leetcode刷题详解—— 有效的数独

1. 题目链接&#xff1a;36. 有效的数独 2. 题目描述&#xff1a; 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的…

sass 封装媒体查询工具

背景 以往写媒体查询可能是这样的&#xff1a; .header {display: flex;width: 100%; }media (width > 320px) and (width < 480px) {.header {height: 50px;} }media (width > 480px) and (width < 768px) {.header {height: 60px;} }media (width > 768px) …

解决ios向mac复制文字不成功的一种方法

### 环境&#xff1a; ios: 16.7.2 macos: 13.6.1 ### 问题现象&#xff1a; 从ios复制了文字&#xff0c;在mac上粘贴总是不成功&#xff0c;总是粘贴出mac上复制的内容。 ### 问题分析&#xff1a; 可能是mac复制的内容优先级比ios复制的内容优先级高&#xff0c;所以不清…

Python实战 | 使用 Python 和 TensorFlow 构建卷积神经网络(CNN)进行人脸识别

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

链表的逆置

方法1&#xff1a; 依次将指针反向&#xff0c;最后令头指针指向尾元素。 逆置过程如下&#xff1a; 当q指针为空时&#xff0c;循环结束。 //试写一算法&#xff0c;对单链表实现就地逆置&#xff0c; void Reverse1(List plist)//太复杂,不用掌握 {assert(plist ! NULL);i…

Spark Job优化

1 Map端优化 1.1 Map端聚合 map-side预聚合&#xff0c;就是在每个节点本地对相同的key进行一次聚合操作&#xff0c;类似于MapReduce中的本地combiner。map-side预聚合之后&#xff0c;每个节点本地就只会有一条相同的key&#xff0c;因为多条相同的key都被聚合起来了。其他节…

基于轻量级卷积神经网络CNN开发构建打架斗殴识别分析系统

在很多公共场合中&#xff0c;因为一些不可控因素导致最终爆发打架斗殴或者大规则冲突事件的案例层出不穷&#xff0c;基于视频监控等技术手段智能自动化地识别出已有或者潜在的危险行为对于维护公共场合的安全稳定有着重要的意义。本文的核心目的就是想要基于CNN模型来尝试开发…

Mathtype公式自动转Word自带公式

Mathtype公式自动转Word自带公式 前言/word技巧探索过程参考资料&#xff08;有效与无效&#xff09;全自动方案/代码/教程 前言/word技巧 word公式 用ALT号可以输入简单latex显示公式&#xff1b;复杂度&#xff0c;需要引入latex包的不行&#xff1b;显示不出来的话按一下en…

CentOS指令学习

目录 一、常用命令 1、ls 2、cd_pwd 3、touch_mkdir_rmdir_rm 4、cp_mv 5、whereis_which_PATH 6、find 7、grep 8、man_help 9、关机与重启 二、压缩解压 1、zip_unzip 2、gzip_gunzip 3、tar 三、其他指令 1、查看用户登录信息 2、磁盘使用情况 3、查看文件…

本地部署_语音识别工具_Whisper

1 简介 Whisper 是 OpenAI 的语音识别系统&#xff08;几乎是最先进&#xff09;&#xff0c;它是免费的开源模型&#xff0c;可供本地部署。 2 docker https://hub.docker.com/r/onerahmet/openai-whisper-asr-webservice 3 github https://github.com/ahmetoner/whisper…

74HC165 并入串出

/******************************************************** 程序名&#xff1a;main.C 版 本&#xff1a;Ver1.0 芯 片&#xff1a;AT89C51或STC89C51 晶 体&#xff1a;片外12MHz 编 程: Joey 日 期&#xff1a;2023-11-13 描 述&#xff1a;通过 74HC165 对 16 按键…

Radius是什么意思? 安当加密

Radius是什么意思&#xff1f; RADIUS&#xff08;Remote Authentication Dial In User Service&#xff09;是一种远程用户拨号认证系统&#xff0c;它由RFC 2865和RFC 2866定义&#xff0c;是应用最广泛的AAA&#xff08;Authentication、Authorization、Accounting&#xf…

Codeforces Round 788 (Div. 2) E. Hemose on the Tree(树上构造)

题目 t(t<5e4)组样例&#xff0c;每次给定一个数p&#xff0c; 表示一棵节点数为的树&#xff0c; 以下n-1条边&#xff0c;读入树边 对于n个点和n-1条边&#xff0c;每个点需要赋权&#xff0c;每条边需要赋权&#xff0c; 权值需要恰好构成[1,2n-1]的排列 并且当你赋…

MATLAB算法实战应用案例精讲-【图像处理】人脸识别

目录 前言 算法原理 什么是人脸识别? 人脸识别步骤 人脸识别技术优势及局限性

《网络协议》04. 应用层(DNS DHCP HTTP)

title: 《网络协议》04. 应用层&#xff08;DNS & DHCP & HTTP&#xff09; date: 2022-09-05 14:28:22 updated: 2023-11-12 06:55:52 categories: 学习记录&#xff1a;网络协议 excerpt: 应用层、DNS、DHCP、HTTP&#xff08;URI & URL&#xff0c;ABNF&#xf…