密码学-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算法。

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

相关推荐
网安INF11 天前
公钥加密与签名算法计算详解(含计算题例子)
网络·算法·网络安全·密码学
电院工程师12 天前
基于机器学习的侧信道分析(MLSCA)Python实现(带测试)
人工智能·python·嵌入式硬件·安全·机器学习·密码学
电院工程师13 天前
SM3算法C语言实现(无第三方库,带测试)
c语言·算法·安全·密码学
小七mod15 天前
【BTC】密码学原理
web3·区块链·密码学·比特币·btc·肖臻·北大区块链
电院工程师20 天前
轻量级密码算法PRESENT的C语言实现(无第三方库)
c语言·算法·安全·密码学
电院工程师20 天前
轻量级密码算法CHAM的python实现
python·嵌入式硬件·算法·安全·密码学
电院工程师21 天前
SM3算法Python实现(无第三方库)
开发语言·python·算法·安全·密码学
网安INF21 天前
SHA-1算法详解:原理、特点与应用
java·算法·密码学
渗透好难24 天前
CTF show 数学不及格
安全·系统安全·密码学
网安INF25 天前
ElGamal加密算法:离散对数难题的安全基石
java·网络安全·密码学