密码学-SHA-1算法
实验七 SHA-1
一、实验目的
熟悉SHA-1算法的运行过程,能够使用C++语言编写实现SHA-1算法程序,增
加对摘要函数的理解。
二、实验要求
(1)理解SHA-1轮函数的定义和工作过程。
(2)利用VC++语言实现SHA- 1算法。
(3)分析SHA- 1算法运行的性能。
三、实验原理
SHA-1对任意长度明文的分组预处理完后的明文长度是512位的整数倍,值得注意的是,SHA-1的原始报文长度不能超过2的64次方,然后SHA-1生成160位的报文摘要。SHA-1算法简单且紧凑,容易在计算机上实现。图6-1所示为SHA-1对单个512位分组的处理过程。
1.实验环境
普通计算机Intel i5 3470@3.2GHz, 4GB RAM,Windows 7 Professional Edition, VS平台。
2.算法实现步骤
1)将消息摘要转换成位字符串
因为在SHA- 1算法中,它的输入必须为位,所以首先要将其转化为位字符串。以“abc”字符串来说明问题,因为'a'=97, 'b'=98, 'c'=99,所以将其转换为位串后为01100001 01100010 01100011
2)对转换后的位字符串进行补位操作
SHA-1算法标准规定,必须对消息摘要进行补位操作,即将输入的数据进行填充,使得数据长度对512求余的结果为448,填充比特位的最高位补一个1,其余位补0,如果在补位之前已经满足对512取模余数为448,则要进行补位,在其后补一位1。总之,补位是至少补一位,最多补512位。依然以“abc”为例,其补位过程如下:初始的信息摘要: 01100001 01100010 01100011第一步补位:01100001 01100010 011000111,最后一位补位: 01100001 01100010 01100011 10...0(后面补了423个0)
之后将补位操作后的信,息摘要转换为十六进制:
61626380 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000
3)附加长度值
在信息摘要后面附加64比特的信息,用来表示原始信息摘要的长度,在这步操作之后,信息报文便是512比特的倍数。通常来说用一个64位的数据表示原始消息的长度,如果消息长度不大于2,那么前32比特就为0,在进行附加长度值操作后,其“abc"数据报文即变成如下形式:
61 62638000000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 0000001 8
因为“abc”占3个字节,即24位,所以换算为十六进制后为0x18。
4)初始化缓存
一个160位MD缓冲区用以保存中间和最终散列函数的结果。它可以表示为5个32
位的寄存器(H0,H1,H2,H3,H4)。初始化如下:
HO = 0x67452301
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0
如果大家对MD-5不陌生的话,会发现一个重要的现象,其前四个与MD-5一样,
但不同之处是存储为Big-EndienFormat。
四、算法实现
(2)利用VC++语言实现SHA- 1算法。
#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>
#include <Windows.h>
#include <wincrypt.h>// 函数声明
std::string sha1(const std::string& input);int main() {std::string data = "Hello, SHA-1!";std::string hash = sha1(data);std::cout << "SHA-1 Hash: " << hash << std::endl;return 0;
}// SHA-1算法实现
std::string sha1(const std::string& input) {HCRYPTPROV hCryptProv;HCRYPTHASH hHash;BYTE rgbHash[20];DWORD cbHash = 20;if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))return "";if (!CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash)) {CryptReleaseContext(hCryptProv, 0);return "";}if (!CryptHashData(hHash, (const BYTE*)input.c_str(), input.length(), 0)) {CryptReleaseContext(hCryptProv, 0);CryptDestroyHash(hHash);return "";}if (!CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) {CryptReleaseContext(hCryptProv, 0);CryptDestroyHash(hHash);return "";}std::stringstream ss;for (int i = 0; i < cbHash; i++) {ss << std::hex << std::setw(2) << std::setfill('0') << (int)rgbHash[i];}CryptDestroyHash(hHash);CryptReleaseContext(hCryptProv, 0);return ss.str();
}
运行结果:
(3) 分析SHA-1算法的性能:
SHA-1是一种哈希算法,通常用于数据完整性验证和数字签名。然而,随着时间的推移,SHA-1的性能和安全性受到了挑战,因此在实际应用中要谨慎使用。
性能分析包括以下方面:
a. 计算速度:SHA-1的计算速度通常较快,适用于快速生成哈希值。
b. 安全性:SHA-1不再被认为是安全的哈希算法,因为已经出现了碰撞攻击,可以生成两个不同的输入,它们产生相同的SHA-1哈希值。这使得SHA-1不适合用于敏感数据的加密或签名。
c. 应用领域:SHA-1仍然可以用于一些非安全性要求严格的应用,例如在校验数据完整性时。但对于需要高安全性的应用,应该选择更安全的哈希算法,如SHA-256或SHA-3。
五、实验心得
SHA-1是一个基于位运算和逻辑运算的哈希算法,它将输入数据转化为固定长度(160位)的哈希值。SHA-1在性能方面通常表现良好,但已不再被认为是安全的哈希算法。因此,建议在应用中使用更安全的哈希算法,特别是需要保护敏感数据的情况。SHA-256和SHA-3等算法提供了更高的安全性,可以满足更严格的安全要求。在实现SHA-1算法时,需要将输入字符串转换为适当格式,并填充数据,以确保数据长度满足SHA-1算法的要求。包括位填充和附加数据长度。通过实验我了解SHA-1算法中的各个步骤,包括信息的分块、扩展消息、初始化哈希值、迭代运算等。这有助于更好地理解SHA-1的内部工作原理。此次实验使我加深了对哈希算法的理解,提高了编程能力。
相关文章:

密码学-SHA-1算法
实验七 SHA-1 一、实验目的 熟悉SHA-1算法的运行过程,能够使用C语言编写实现SHA-1算法程序,增 加对摘要函数的理解。 二、实验要求 (1)理解SHA-1轮函数的定义和工作过程。 (2)利用VC语言实现SHA- 1算法。 (3)分析SHA- 1算法运行的性能。 三、实验…...
Android View拖拽/拖放DragAndDrop自定义View.DragShadowBuilder,Kotlin(2)
Android View拖拽/拖放DragAndDrop自定义View.DragShadowBuilder,Kotlin(2) import android.graphics.Canvas import android.graphics.Point import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.util…...
翻页视图ViewPager
ViewPager控件允许页面在水平方向左右滑动,就像翻书、翻报纸,Android提供了已经分装好的控件。对于ViewPager来说,一个页面就是一个项(相当于ListView的一个列表项),许多页面组成ViewPager的页面项。 List…...

【可视化Java GUI程序设计教程】第4章 布局设计
4.1 布局管理器概述 右击窗体,单击快捷菜单中的Set Layout 4.1.2 绝对布局(Absolute Layout) 缩小窗口发现超出窗口范围的按钮看不见 Absolute Layout 4.1.2 空值布局(Null Layout) 4.1.3 布局管理器的属性和组件布…...
Elasticsearch配置文件
一 前言 在elasticsearch\config目录下,有三个核心的配置文件: elasticsearch.yml,es相关的配置。jvm.options,Java jvm相关参数的配置。log4j2.properties,日志相关的配置,因为es采用了log4j的日志框架。这里以elasticsearch6.5.4版本为例,并且由于版本不同,配置也不…...

运维:mysql常用的服务器状态命令
目录 1、查询当前服务器运行的进程 2、查询最大链接数 3、查询当前链接数 4、展示当前正在执行的sql语句 5、查询当前MySQL当中记录的慢查询条数 6、展示Mysql服务器从启动到现在持续运行的时间 7、查询数据库存储占用情况 8、查询服务器启动以来的执行查询的总次数 9…...

k8s中kubectl陈述式资源管理
1、 理论 1.1、 管理k8s核心资源的三种基本方法 : 1.1.1陈述式的资源管理方法: 主要依赖命令行工具kubectl进行管理 1.1.1.1、优点: 可以满足90%以上的使用场景 对资源的增、删、查操作比较容易 1.1.1.2、缺点: 命令冗长&…...

11 个最值得推荐的 Windows 数据恢复软件
您可能已经尝试过许多免费的恢复程序,但它们都不起作用,对吧?这就是您正在寻找最好的数据恢复软件的原因。 个人去过那里。根据个人的经验,大多数免费软件并不能解决这个问题。有时,当个人在 PC 上运行恢复程序时&…...

Docker从入门到实战
Docker基本概念 1、解决的问题 1、统一标准 应用构建 ○ Java、C、JavaScript ○ 打成软件包 ○ .exe ○ docker build … 镜像应用分享 ○ 所有软件的镜像放到一个指定地方 docker hub ○ 安卓,应用市场应用运行 ○ 统一标准的 镜像 ○ docker run 容器化技术 …...

UE4 材质实操记录
TexCoord的R通道是从左到右的递增量,G通道是从上到下的递增量,R通道减去0.5,那么左边就是【-0.5~0】区间,所以左边为全黑,Abs取绝对值,就达到一个两边向中间的一个递减的效果,G通道同理…...
http协议和Fiddler
文章目录 一、http协议的报文结构1.1http请求和http响应之间的区别1.2http请求1.2.1URL1.2.2方法1.2.3请求头1.2.3.1Host1.2.3.2Content-Length、Content-Type1.2.3.3User-Agent(简称UA)1.2.3.4Referer1.2.3.5Cookie 1.3http响应1.3.1响应状态码1.3.2响应头1.3.2.1Content-Leng…...

李宇航
该篇文章仅用作能直接在百度搜索到我的csdn,进入我的主页,没有实际意义. 进入李宇航博客方法 通过百度搜索"李宇航" 链接: https://blog.csdn.net/llllyh812 1.电脑端进入方法 输入网址链接: https://blog.csdn.net/llllyh812 或者 进入csdn主页,搜索"李宇…...

【JAVA学习笔记】38 - 单例设计模式-静态方法和属性的经典使用
项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/final_ 一、什么是设计模式 1.静态方法和属性的经典使用 2.设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格以及解决问题的思考方式。设计模式就像是…...

m1 安装 cocoapods
其实最终解决问题很简单,麻烦的是如果找到解决问题的答案。 前提条件: 命令行工具,不能以rosetta方法打开。 首先安装homebrew 这里不多说了,自行解决。 使用brew安装cocoapods brew install cocoapods, pod --ver…...

【大数据】Kafka 实战教程(一)
Kafka 实战教程(一) 1.Kafka 介绍1.1. 主要功能1.2. 使用场景1.3 详细介绍1.3.1 消息传输流程1.3.2 Kafka 服务器消息存储策略1.3.3 与生产者的交互1.3.4 与消费者的交互 2.Kafka 生产者3.Kafka 消费者3.1 Kafka 消费模式3.1.1 At-most-once(…...

求臻医学:肺癌患者就诊指南及基因检测意义
2023年国家癌症中心公布的最新的数据显示,中国癌症新发病例数前十的癌症分别是:肺癌82万,结直肠癌56万,胃癌48万,乳腺癌42万,肝癌41万,食管癌32万,甲状腺癌22万,胰腺癌12…...

【项目管理】项目中如何进行风险管理
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...
【算法题】得到K个半回文串的最小修改次数
题目: 给你一个字符串 s 和一个整数 k ,请你将 s 分成 k 个 子字符串 ,使得每个 子字符串 变成 半回文串 需要修改的字符数目最少。 请你返回一个整数,表示需要修改的 最少 字符数目。 注意: 如果一个字符串从左往…...
C# 通过IP获取Mac地址(ARP)
C# 通过IP获取Mac地址 [DllImport("Iphlpapi.dll")] private static unsafe extern int SendARP(Int32 dest, Int32 host, ref Int32 mac, ref Int32 length);[DllImport("Ws2_32.dll")] private static extern Int32 inet_addr(string ip);public static…...

【QT】信号和槽
一、前置示例代码 main.cpp #include "widget.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv); // 应用程序对象a,在Qt中,应用程序对象,有且仅有一个。Widget w; // 窗口对…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...
自定义线程池1.2
自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本,将线程池中的线程数量交给使用者决定,并且将线程的创建延迟到任务提交的时候,在本文中我们将对这个版本进行如下的优化: 在新建线程时交给线程一个任务。让线程在某种情况下…...

华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手
华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…...