密码学-SHA-1算法

news2024/9/25 21:27:51

实验七 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的内部工作原理。此次实验使我加深了对哈希算法的理解,提高了编程能力。

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

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

相关文章

统计文本词频的几种方法(Python)

目录 1. 单句的词频统计 2. 文章的词频统计 方法一&#xff1a;运用集合去重方法 方法二&#xff1a;运用字典统计 方法三&#xff1a;使用计数器 词频统计是自然语言处理的基本任务&#xff0c;针对一段句子、一篇文章或一组文章&#xff0c;统计文章中每个单词出现的次数…

HttpClient远程使用大全

一 HttpClient简介 1.1 概述 HttpClient只能以编程的方式通过其API用于传输和接受HTTP消息。主要实现功能&#xff1a; 实现了所有 HTTP 的方法&#xff08;GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等&#xff09; 支持 HTTPS 协议 支持代理服务器&#xff08;Nginx…

语法复习之C语言与指针

内存是如何存储数据的&#xff1f; 在C语言中定义一个变量后&#xff0c;系统就会为其分配内存空间。这个内存空间包括了地址和长度。将变量赋值后&#xff0c;该值就被写入到了指定的内存空间中。内存空间的大小一般以字节作为基本单位。   普通变量存放的是数据&#xff0c…

75 应急响应-数据库漏洞口令检索应急取证箱

必须知识点 1.第三方应用由于是选择性安装&#xff0c;如何做好信息收集和漏洞探针也是获取攻击者思路的重要操作&#xff0c;除去本身漏洞外&#xff0c;提前预知或口令相关攻击也要进行筛选 2.排除三方应用攻击行为&#xff0c;自查漏洞分析攻击者思路&#xff0c;人工配合工…

Qt 项目实战 | 多界面文本编辑器

Qt 项目实战 | 多界面文本编辑器 Qt 项目实战 | 多界面文本编辑器界面设计创建子窗口类实现菜单的功能更新菜单状态与新建文件操作实现打开文件操作添加子窗口列表实现其他菜单功能 完善程序功能保存窗口设置自定义右键菜单其他功能 小结项目源码 官方博客&#xff1a;https://…

初试Shiro

Shiro是一个用于身份验证、授权和会话管理的Java安全框架。它提供了一套易于使用的API&#xff0c;可以帮助开发人员构建安全性强大的应用程序。 环境准备 添加依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</ar…

vueDay04——v-if else show

一、v-if的使用 我们可以像c语言一样去使用v-if结构 比如单用v-if&#xff0c;连用v-if v-else&#xff0c;或者是v-if v-else-if v-else 注意&#xff1a; 1.v-if v-else-if需要绑定值,而v-else不需要绑定值 2.if结构可以用在不同的标签类型之间 <div v-if"fir…

【MATLAB源码-第57期】基于matlab的IS95前向链路仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 IS-95&#xff0c;也被称为cdmaOne&#xff0c;是第一代的CDMA&#xff08;Code Division Multiple Access&#xff0c;码分多址&#xff09;数字蜂窝通信标准。IS-95的全称是Interim Standard-95&#xff0c;最初由Qualcomm…

灵活、可用、高扩展,EasyMR 带来全新 Yarn 的队列管理功能及可视化配置

YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Hadoop 生态系统中的资源调度器&#xff0c;主要用于资源管理和作业调度。YARN 自身具备队列管理功能&#xff0c;通过对 YARN 资源队列进行配置和管理&#xff0c;实现集群资源的分配&#xff0c;以满足不同应…

Doceker-compose——容器群集编排管理工具

目录 Docker-compose 1、Docker-compose 的三大概念 2、YAML文件格式及编写注意事项 1&#xff09;使用 YAML 时需要注意下面事项 2&#xff09;ymal文件格式 3&#xff09;json格式 3、Docker Compose配置常用字段 4、Docker-compose的四种重启策略 5、Docker Compos…

[微服务]Spring Cloud Sleuth全链路追踪

Spring Cloud Sleuth全链路追踪 全链路追踪组件追踪的数据遵循的规则: 1,Span:基本单元; 执行一次服务调用就生成一个span,用于记录当时的情况 ,以一个64位ID作为唯一标识.span还有其他数据标识如摘要,时间戳信息,关键tag等; 2,Trace:一次请求; 以一个64位ID为唯一标识,可以…

各品牌PLC存储器寻址的规则

在PLC编程时&#xff0c;字节或多字节的变量一般支持绝对地址寻址&#xff08;比如&#xff0c;IW0、MD4等&#xff09;。要想正确寻址&#xff0c;则必须要搞清楚寻址的规则。目前常见的规则有两种&#xff1a;字节寻址和字寻址。下图清晰地表达了两种规则的编号情况&#xff…

AI:WEB 1 靶机

1.找ip地址 2.检测端口 3.上文件检索 发现是apache 的组件 4.漏洞扫描攻击 nikto -h 网站 扫描网站漏洞 目录爆破 5.利用发现敏感目录 6.登录 发现 都是403 使用上层发现ok 这是一个查询功能点 7.敏感目录 sql注入 检验 详细信息 检测到注入方式 查看数…

系统架构设计师之RUP软件开发生命周期

系统架构设计师之RUP软件开发生命周期

EasyAR使用

EazyAR后台管理&#xff0c;云定位服务 建模 需要自行拍摄360度视频&#xff0c;后台上传&#xff0c;由EazyAR工作人员完成构建。 标注数据 需要在unity安装EazyAR插件&#xff0c;在unity场景编辑后&#xff0c;上传标注数据。 uinity标注数据 微信小程序中使用&#x…

Kali Linux 安装使用远程桌面连接远程服务器

1. 安装远程桌面连接软件 目前为止&#xff0c;我们已经可以通过其它机器以远程桌面的方式连接 Kali Linux&#xff0c;但想要使用 Kali Linux 远程连接其它机器还无法做到&#xff0c;下面就看看如何实现。 更新软件源列表&#xff1b; $ sudo apt-get update $ sudo apt-g…

二、可行性分析与需求分析

文章目录 概念考点练习题一、可行性分析与需求分析1.可行性分析的任务2.可行性研究3.甘特图4.数据流图5.数据字典数据字典的内容 6.需求分析7. 实体联系ER图8. 状态转换图 二、练习题 概念考点练习题 一、可行性分析与需求分析 1.可行性分析的任务 用最小的代价在尽可能短的时…

Xilinx MicroBlaze定时器中断无法返回主函数问题解决

最近在使用Xilinx 7系列FPGA XC7A100T时&#xff0c;运行MicroBlaze软核处理器&#xff0c;添加了AXI TIMER IP核&#xff0c;并使能定时器溢出中断&#xff0c;发现定时器触发中断后&#xff0c;无法返回主函数的问题&#xff0c;最后发现修改编译器优化等级就正常了。 FPGA型…

量子力学的基础公设

量子力学的基础公设 - 知乎

MySQL---JDBC编程

文章目录 什么是JDBC&#xff1f;JDBC的工作原理JDBC的使用添加依赖创建数据源DataSource创建数据库连接Connection创建操作命令Statement执行SQL指令释放资源 通过JDBC演示CRUD新增查询修改删除 什么是JDBC&#xff1f; JDBC&#xff1a;Java Database Connectivity&#xff…