密码学 - SHA-2

这篇具有很好参考价值的文章主要介绍了密码学 - SHA-2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验八  SHA-2

1.实验目的

熟悉SHA – 2算法的运行过程,能够使用C++语言编写实现SHA-2算法程序,增加对摘要函数的理解。

2、实验任务

(1)理解SHA-2轮函数的定义和常量的定义。

(2)利用VC++语言实现SHA-2算法。

(3)分析SHA-2算法运行的性能。

3、实验原理

SHA-256算法输入报文的最大长度不超过2“比特,输入按512比特分组进行处理,产生的输出是一个256比特的报文摘要。该算法处理包括以下几步:

(1)附加填充比特。对报文进行填充使报文长度与448模512同余(长度=448 mod512),填充的比特数范围是1~512,填充比特串的最高位为l,其余位为0。

(2)附加长度值。将用64比特表示的初始报文(填充前)的位长度附加在步骤1的结果后(低位字节优先)。

(3)初始化缓存。使用一个256比特的缓存来存放该散列函数的中间及最终结果。该缓存表示为A=0x6A09E667,B=0xBB67AE85,C=Оx3C6EF372,D=0xA54FF53A,E=0x510E527F,F=0x9B05688C,G=0xlF83D9AB,H=0x5BEOCD19。

(4)处理512比特(16个字)报文分组序列。该算法使用了六种基本逻辑函数,由64步迭代运算组成。每步都以256比特缓存值ABCDEFGH为输入,然后更新缓存内容。每步使用一个32比特常数值Kt和一个32比特Wt。

4、实验过程

SHA-2是一组密码学哈希函数,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224和SHA-512/256。SHA-2轮函数定义了SHA-2算法中的核心操作。SHA-2算法使用了不同的轮函数,具体取决于哈希函数的变种。SHA-256的轮函数包括以下步骤:

 a. 消息预处理:原始消息被填充为512位的多个块。然后,消息长度被附加到消息的末尾,通常以64位的二进制表示。

b. 初始化Hash值:SHA-256使用8个32位的初始化Hash值(A, B, C, D, E, F, G, H),这些值是根据黄金分割数来确定的,通常使用前256位的平方根的小数部分的前32位。

c. 消息分块:原始消息被分成512位的块,依次处理。

d. 消息调度:512位块被分成16个32位的字,然后根据一定规则,生成额外的字(W[16]到W[63]),用于轮函数的迭代。

e. 轮函数迭代:SHA-256算法包括64轮迭代,每轮使用不同的常量K和轮函数,对Hash值进行更新。

f. 生成哈希值:最后,合并所有Hash值(A, B, C, D, E, F, G, H)并输出。

SHA-2常量K是每轮中使用的常量值,每个常量K的值是SHA-256算法中的一个根号数的小数部分的前32位。这些常量K的值在SHA-256算法中是固定的。

#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <sstream>
#include <vector>
#include <cstdint>

// SHA-256 Constants
const uint32_t K[] = {
    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
};

#define ROTR(x, n) ((x >> n) | (x << (32 - n)))
#define SHR(x, n) (x >> n)


uint32_t Ch(uint32_t x, uint32_t y, uint32_t z) {
    return (x & y) ^ (~x & z);
}

uint32_t Maj(uint32_t x, uint32_t y, uint32_t z) {
    return (x & y) ^ (x & z) ^ (y & z);
}

uint32_t Sigma0(uint32_t x) {
    return ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22);
}

uint32_t Sigma1(uint32_t x) {
    return ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25);
}

uint32_t sigma0(uint32_t x) {
    return ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3);
}

uint32_t sigma1(uint32_t x) {
    return ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10);
}

// SHA-256 
void sha2(const std::string &message) {
    std::vector<uint8_t> data(message.begin(), message.end());

    
    uint64_t messageLength = data.size() * 8;
    data.push_back(0x80); 
    while ((data.size() + 8) % 64 != 0) {
        data.push_back(0x00);
    }


    for (int i = 0; i < 8; ++i) {
        data.push_back((messageLength >> (56 - i * 8)) & 0xFF);
    }


    uint32_t h[8] = {
        0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
        0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
    };


    for (size_t i = 0; i < data.size(); i += 64) {
        uint32_t w[64];
        for (int t = 0; t < 16; ++t) {
            w[t] = (data[i + t * 4] << 24) | (data[i + t * 4 + 1] << 16) | (data[i + t * 4 + 2] << 8) | data[i + t * 4 + 3];
        }
        for (int t = 16; t < 64; ++t) {
            w[t] = sigma1(w[t - 2]) + w[t - 7] + sigma0(w[t - 15]) + w[t - 16];
        }

        uint32_t a = h[0];
        uint32_t b = h[1];
        uint32_t c = h[2];
        uint32_t d = h[3];
        uint32_t e = h[4];
        uint32_t f = h[5];
        uint32_t g = h[6];
        uint32_t j = h[7];

        for (int t = 0; t < 64; ++t) {
            uint32_t t1 = j + Sigma1(e) + Ch(e, f, g) + K[t] + w[t];
            uint32_t t2 = Sigma0(a) + Maj(a, b, c);
            j = g;
            g = f;
            f = e;
            e = d + t1;
            d = c;
            c = b;
            b = a;
            a = t1 + t2;
        }

        h[0] += a;
        h[1] += b;
        h[2] += c;
        h[3] += d;
        h[4] += e;
        h[5] += f;
        h[6] += g;
        h[7] += j;
    }


    for (int i = 0; i < 8; ++i) {
        std::cout << std::hex << std::setfill('0') << std::setw(8) << h[i];
    }
    std::cout << std::dec << std::endl;
}

int main() {
    std::string message = "Hello, SHA-2!";
    sha2(message);
    return 0;
}

5、实验心得

        SHA-2算法是一种广泛使用的密码学哈希函数,用于计算数据的消息摘要。SHA-2包括一系列不同长度的哈希函数,如SHA-224、SHA-256、SHA-384和SHA-512,分别输出224位、256位、384位和512位的消息摘要。本次实验采用SHA-256实现算法,SHA-2算法是一种强大的哈希算法,通常用于数据完整性验证、数字签名等应用。文章来源地址https://www.toymoban.com/news/detail-737534.html

到了这里,关于密码学 - SHA-2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 密码学基本原理和发展——近代密码学

    目录 1 密码机通信模型 2 Enigma密码机构造 3 Enigma密码机加解密过程 3.1 加密过程 3.2 解密过程 4 Enigma密码机的安全性 5 Enigma密码机破解 5.1 波兰雷耶夫斯基破解 5.2 图灵破解        近代密码一般指20世纪初~20世纪70年代期间的密码技术。20 世纪初电报的出现第一次使远距离

    2024年02月06日
    浏览(48)
  • 【密码学-1】一文入门非对称密码学

    本文共1932字,完成阅读约需6分钟。 犹记得2021年年初的一波区块链热潮让无数人第一次了解到了“公钥”和“私钥”的概念,那么,究竟什么是公钥私钥呢?和常见的密钥又有什么区别和联系呢?本文目的在用尽可能短的时间和简洁的语言,带你快速了解非对称密码学的基本

    2023年04月08日
    浏览(81)
  • 【密码学】python密码学库pycryptodome

    记录了一本几乎是10年前的书(python绝技–用python成为顶级黑客)中过时的内容 里面提到了python标准库中自带的crypt库,经验证Python 3.12.1中并没有这个自带的库,密码学相关的库目前(2024.1.12)是一个自包含库pycryptodome,导入的是 import Crypto pypi库的页面 可以在文档中查看详

    2024年01月17日
    浏览(53)
  • 程序猿成长之路之密码学篇-密码学简介

    在阅读本文前需要了解的术语: 授权人/非授权人:授权人指获取了查看数据权限的用户,非授权人则是指未获取到权限的用户。 明文/密文:明文指没有加密的数据内容,密文是指加密后的数据内容 CIA(密码学中不是美国中情局的意思,是信息安全三要素): C-Confidentiality 机

    2024年02月04日
    浏览(38)
  • 【密码学】量子安全的密码学算法以及原理介绍

    (1)“代数格密码套件”(CRYSTALS)包含两个密码原语Kyber和Dilithium。Kyber是一种抗适应性选择密文攻击(IND-CCA2)安全密钥封装机制,Dilithium是一种高度不可伪造性(EUF-CMA)安全数字签名算法。两种密码都是为了应对量子计算机的攻击,并且在操作过程中只需更改几个参数即

    2024年02月11日
    浏览(59)
  • 密码学:公钥密码.(非对称密码)

    公钥密码 (Public Key Cryptography),又称为 非对称密码 ,其最大特征是 加密和解密不再使用相同的密钥 ,而使用不同的密钥。使用者会将一个密钥公开,而将另一个密钥私人持有,这时这两个密钥被称为 公钥和私钥 。一般来说,公钥和私钥是难以互相计算的,但它们可以互相

    2024年02月03日
    浏览(53)
  • 凯撒密码——密码学

      代码如下:

    2024年02月02日
    浏览(34)
  • 密码学复习-2 分组密码

    分组密码:将一个明文块作为一个整体来处理,并用来产出等长的密文块的一种密码。 流密码:对数字流一次加密一位或者一个字节的密码。 Feistel建议使用乘积密码的概念来逼近理想分组密码。 乘积密码:是指依次使用两个或两个以上的基本密码,所得结果的密码强度将强

    2023年04月26日
    浏览(50)
  • 密码学入门——环游密码世界

    图解密码技术 第三版 1.1 本书主要角色 1.2 加密与解密 加密 解密 密码破译 2.1 密钥 加密,解密与密钥 2.2 对称密码和公钥密码 1.对称密码是指在加密和解密时使用同一密钥的方式。 2.公钥密码是指在加密和解密时使用不同密钥的方式。因此,公钥密码又称非对称密码。 2.3 混

    2024年02月10日
    浏览(36)
  • 应用密码学实验 古典密码

    实验一 古典密码 单表代替、多表代替 实验目的 通过实验熟悉掌握凯撒密码原理和多表代替密码的实现方法,编译实现加密算法,提高程序设计能力,掌握穷举破译的方法。 实验要求 输入任意的一段明文,对其进行加密并输出密文。 输入一段密文,利用穷举法进行唯密文攻

    2023年04月15日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包