国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SHA-256算法的原理與C/C++實現(xiàn)

這篇具有很好參考價值的文章主要介紹了SHA-256算法的原理與C/C++實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、原理

SHA-256 是一種加密哈希函數(shù),旨在將任意大小的數(shù)據(jù)映射到一個固定大小的哈希值,通常是 256 位(32 字節(jié))。它屬于 SHA-2(安全哈希算法 2)家族,旨在提供更高的安全性。

SHA-256 的設(shè)計原則包括以下關(guān)鍵步驟:

  • 消息填充:輸入消息的位數(shù)必須是 512 的倍數(shù)。因此,第一步是對輸入消息進行填充。填充包括在消息末尾附加一個 '1',然后追加足夠的零,使消息長度對 512 取模后余 448。
  • 追加消息長度:填充后,將原始的 64 位消息長度追加到消息的末尾。這確保了哈希值受到消息長度的影響,增強了安全性。
  • 哈希值的初始化:SHA-256 使用 8 個 32 位字作為初始哈希值。這些值是使用前 8 個素數(shù)的平方根的小數(shù)部分來設(shè)置的。
  • 消息分塊:對填充后的消息分為 512 位的塊,每個塊包含 16 個 32 位字。
  • 消息調(diào)度:依次處理每個塊,生成 64 個擴展的 32 位字。這些字大部分基于之前的字和哈希值,通過一系列邏輯函數(shù)和位運算計算得出。
  • 壓縮函數(shù):SHA-256 使用一種包含 64 輪的壓縮函數(shù),每一輪應(yīng)用不同的邏輯函數(shù)和常數(shù)。每一輪都會修改哈希值的不同部分,引入新的數(shù)據(jù)。
  • 最終哈希值:處理完所有塊后,最終的 8 個 32 位字被連接起來形成 256 位的哈希值。

二、C/C++實現(xiàn)

SHA-256.h

#pragma once
#ifndef SHA_256_H
#define SHA_256_H

#include <stdlib.h>
#include <stdint.h>

typedef struct hash_context {
    uint8_t buffer[64];
    uint32_t state[8];
    uint32_t total[2];
} hash_context;

void hash_start(hash_context* ctx);
void hash_update(hash_context* ctx, uint8_t* input, size_t ilen);
void hash_finish(hash_context* ctx, uint8_t* output);
static void sha256_transform(hash_context* ctx, const uint8_t data[]);

#endif // SHA_256_H

SHA-256.cpp

#include <cstdint>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <time.h>
#include <cstdlib>
#include "SHA-256.h"
using namespace std;

typedef unsigned int uint32_t;
typedef unsigned char uint8_t;

//typedef struct hash_context {
//    uint8_t buffer[64];
//    uint32_t state[8];
//    uint32_t total[2];
//} hash_context;

// SHA-256 算法的宏定義
#define ROTRIGHT(word, bits) (((word) >> (bits)) | ((word) << (32 - (bits))))
#define CH(x, y, z) (((x) & (y)) ^ (~(x) & (z)))
#define MAJ(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
#define EP0(x) (ROTRIGHT(x, 2) ^ ROTRIGHT(x, 13) ^ ROTRIGHT(x, 22))
#define EP1(x) (ROTRIGHT(x, 6) ^ ROTRIGHT(x, 11) ^ ROTRIGHT(x, 25))
#define SIG0(x) (ROTRIGHT(x, 7) ^ ROTRIGHT(x, 18) ^ ((x) >> 3))
#define SIG1(x) (ROTRIGHT(x, 17) ^ ROTRIGHT(x, 19) ^ ((x) >> 10))

// SHA-256 常量
static const uint32_t K[64] = {
    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
};

 函數(shù)聲明
//void hash_start(hash_context* ctx);
//void hash_update(hash_context* ctx, uint8_t* input, size_t ilen);
//void hash_finish(hash_context* ctx, uint8_t* output);
//static void sha256_transform(hash_context* ctx, const uint8_t data[]);


static void sha256_transform(hash_context* ctx, const uint8_t data[]) {
    uint32_t a, b, c, d, e, f, g, h, i, j, t1, t2, m[64];

    for (i = 0, j = 0; i < 16; ++i, j += 4)
        m[i] = (data[j] << 24) | (data[j + 1] << 16) | (data[j + 2] << 8) | (data[j + 3]);
    for (; i < 64; ++i)
        m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16];

    a = ctx->state[0];
    b = ctx->state[1];
    c = ctx->state[2];
    d = ctx->state[3];
    e = ctx->state[4];
    f = ctx->state[5];
    g = ctx->state[6];
    h = ctx->state[7];

    for (i = 0; i < 64; ++i) {
        t1 = h + EP1(e) + CH(e, f, g) + K[i] + m[i];
        t2 = EP0(a) + MAJ(a, b, c);
        h = g;
        g = f;
        f = e;
        e = d + t1;
        d = c;
        c = b;
        b = a;
        a = t1 + t2;
    }

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

void hash_start(hash_context* ctx) {
    ctx->state[0] = 0x6a09e667;
    ctx->state[1] = 0xbb67ae85;
    ctx->state[2] = 0x3c6ef372;
    ctx->state[3] = 0xa54ff53a;
    ctx->state[4] = 0x510e527f;
    ctx->state[5] = 0x9b05688c;
    ctx->state[6] = 0x1f83d9ab;
    ctx->state[7] = 0x5be0cd19;

    ctx->total[0] = 0;
    ctx->total[1] = 0;
}

void hash_update(hash_context* ctx, uint8_t* input, size_t ilen) {
    size_t fill;
    uint32_t left;

    if (ilen == 0)
        return;

    left = ctx->total[0] & 0x3F;
    fill = 64 - left;

    ctx->total[0] += (uint32_t)ilen;
    ctx->total[0] &= 0xFFFFFFFF;

    if (ctx->total[0] < (uint32_t)ilen)
        ctx->total[1]++;

    if (left && ilen >= fill) {
        memcpy((void*)(ctx->buffer + left), input, fill);
        sha256_transform(ctx, ctx->buffer);
        input += fill;
        ilen -= fill;
        left = 0;
    }

    while (ilen >= 64) {
        sha256_transform(ctx, input);
        input += 64;
        ilen -= 64;
    }

    if (ilen > 0) {
        memcpy((void*)(ctx->buffer + left), input, ilen);
    }
}

void hash_finish(hash_context* ctx, uint8_t* output) {
    uint32_t last, padn;
    uint32_t high, low;
    uint8_t msglen[8];
    high = (ctx->total[0] >> 29) | (ctx->total[1] << 3);
    low = (ctx->total[0] << 3);

    msglen[0] = (uint8_t)(high >> 24);
    msglen[1] = (uint8_t)(high >> 16);
    msglen[2] = (uint8_t)(high >> 8);
    msglen[3] = (uint8_t)(high);
    msglen[4] = (uint8_t)(low >> 24);
    msglen[5] = (uint8_t)(low >> 16);
    msglen[6] = (uint8_t)(low >> 8);
    msglen[7] = (uint8_t)(low);

    last = ctx->total[0] & 0x3F;
    padn = (last < 56) ? (56 - last) : (120 - last);

    hash_update(ctx, (uint8_t*)"\x80", 1);
    hash_update(ctx, (uint8_t*)(msglen + 1), padn - 1);
    hash_update(ctx, msglen, 8);

    for (int i = 0; i < 8; i++) {
        output[i * 4] = (uint8_t)(ctx->state[i] >> 24);
        output[i * 4 + 1] = (uint8_t)(ctx->state[i] >> 16);
        output[i * 4 + 2] = (uint8_t)(ctx->state[i] >> 8);
        output[i * 4 + 3] = (uint8_t)(ctx->state[i]);
    }
}



/************************** 宏定義 **************************/
//#define DATA_SIZE 1073741824
#define DATA_SIZE 1073741824ULL // 將數(shù)據(jù)大小定義為 unsigned long long
#define ROUNDS 1ULL // 將循環(huán)次數(shù)定義為 unsigned long long

int main()
{
    hash_context ctx;

    uint8_t hash[32]; // SHA-256 輸出長度為 32 字節(jié)
    clock_t start, end;

    // 初始化隨機數(shù)生成器
    srand(static_cast<unsigned int>(time(NULL)));

    uint8_t* data = (uint8_t*)malloc(DATA_SIZE); // 分配數(shù)據(jù)緩沖區(qū)

    // 生成隨機數(shù)據(jù)填充到 data 數(shù)組中
    for (unsigned long long i = 0; i < DATA_SIZE; i++) // 使用 unsigned long long
    {
        data[i] = rand() & 0xFF;
    }

    // 開始計時
    start = clock();
    for (unsigned long long i = 0; i < ROUNDS; i++) // 使用 unsigned long long
    {
        hash_start(&ctx);
        hash_update(&ctx, data, DATA_SIZE);
        hash_finish(&ctx, hash);
    }
    // 結(jié)束計時
    end = clock();

    // 釋放分配的內(nèi)存
    free(data);

    // 計算總運行時間和每秒處理的數(shù)據(jù)量
    double time = (double)(end - start) / CLOCKS_PER_SEC;
    double computing_speed = (DATA_SIZE * ROUNDS * (unsigned long long)8 / 1000 / 1000) / time;

    printf("運行時間: %f seconds\n", time);
    printf("運算速度: %f Mbps\n", computing_speed);

    return 0;
}

三、運行結(jié)果

sha256的c++實現(xiàn),算法,c語言,c++文章來源地址http://www.zghlxwxcb.cn/news/detail-854603.html

到了這里,關(guān)于SHA-256算法的原理與C/C++實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • openssl+sha256開發(fā)實例(C++)

    openssl+sha256開發(fā)實例(C++)

    SHA-256(Secure Hash Algorithm 256-bit)是一種哈希算法,屬于 SHA-2(Secure Hash Algorithm 2)家族的一員。SHA-256 產(chǎn)生的哈希值是一個256位(32字節(jié))的二進制數(shù)字,通常以64個十六進制字符的形式表示。 以下是 SHA-256 的一些關(guān)鍵特點和應(yīng)用: 安全性: SHA-256 被廣泛認為是安全的哈希算法

    2024年01月17日
    瀏覽(22)
  • Android Apk簽名算法使用SHA256

    Android apk簽名算法使用SHA256 本文不介紹復(fù)雜的簽名過程,說一下Android簽名算法使用SHA256。 但是SHA1不是相對安全簽名算法,SHA256更加安全一些。 一般大公司才會有這種細致的安全要求。 如何查看apk簽名是否是SHA1還是SHA256 ··· 1、拿到apk文件,修改文件后綴為.jar 2、解壓文件

    2024年04月08日
    瀏覽(24)
  • 保障安全的散列算法 - SHA256

    保障安全的散列算法 - SHA256

    SHA-256是由美國國家安全局(NSA)開發(fā)的SHA-2密碼哈希函數(shù)之一,用于數(shù)字簽名和區(qū)塊鏈。在計算機科學(xué)和信息安全領(lǐng)域,SHA-256 (安全哈希算法 256位) 是廣受歡迎且常被使用的密碼學(xué)散列函數(shù)。SHA-256 產(chǎn)生一個唯一、定長的256位 (32字節(jié))散列值,不僅可以用于密碼學(xué)中信息的安全存

    2024年04月12日
    瀏覽(21)
  • Java工具集 Hex、Hmac算法(MD5、SHA1、SHA256、SHA384、SHA512)、雪花算法SnowflakeId、redis基于Springboot工具類

    Java工具集 Hex、Hmac算法(MD5、SHA1、SHA256、SHA384、SHA512)、雪花算法SnowflakeId、redis基于Springboot工具類

    ??作者主頁:青花鎖 ??簡介:Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者??、Java微服務(wù)架構(gòu)公號作者?? ??簡歷模板、學(xué)習(xí)資料、面試題庫、技術(shù)互助 ??文末獲取聯(lián)系方式 ?? 專欄 描述 Java項目實戰(zhàn) 介紹Java組件安裝、使用;手寫框架等 Aws服務(wù)器實戰(zhàn) Aws Linux服務(wù)器上操作nginx、git、JDK、Vue Jav

    2024年04月09日
    瀏覽(26)
  • Java實現(xiàn)計算指定文件的SHA256

    SHA-256(Secure Hash Algorithm 256-bit)是一種密碼學(xué)安全哈希算法,用于將任意長度的數(shù)據(jù)轉(zhuǎn)換為固定長度的哈希值,通常為256位(32字節(jié))。SHA-256是SHA-2(Secure Hash Algorithm 2)系列算法的一部分,被廣泛應(yīng)用于密碼學(xué)和數(shù)據(jù)完整性驗證等領(lǐng)域。 我們可以使用SHA-256驗證文件的完整性

    2024年01月25日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】04 哈希表 / 散列表 (哈希函數(shù)、哈希沖突、鏈地址法、開放地址法、SHA256)

    【數(shù)據(jù)結(jié)構(gòu)與算法】04 哈希表 / 散列表 (哈希函數(shù)、哈希沖突、鏈地址法、開放地址法、SHA256)

    一種很好用,很高效,又一學(xué)就會的數(shù)據(jù)結(jié)構(gòu),你確定不看看? 莫慌,每個概念都很好理解。 哈希表( Hash Table ),也稱為 散列表 ,是一種數(shù)據(jù)結(jié)構(gòu), 用于存儲鍵值對(key-value pairs) 。 鍵值對是一種數(shù)據(jù)結(jié)構(gòu),用于將鍵(key)與對應(yīng)的值(value)相關(guān)聯(lián)。在鍵值對中,鍵

    2024年02月09日
    瀏覽(27)
  • c++實現(xiàn)java的SHA1PRNG算法

    ?java AES 中出現(xiàn)的隨機算法?SHA1PRNG 生成key: 對應(yīng)C++來說,就是做了兩次sha1,流程如下: 1.生成安全密鑰: 1)要加密的key明文:假設(shè)為dplyjc 2).將加密的string字符串明文調(diào)用sha1哈希出字節(jié)流形式的key 3).將sha1重置后,再調(diào)用sha1,傳入字節(jié)流形式的key,生成字節(jié)流形式的k

    2024年02月11日
    瀏覽(21)
  • Android 獲取應(yīng)用sha1和sha256

    在 Android 應(yīng)用開發(fā)中,SHA-1(Secure Hash Algorithm 1)值是一種哈希算法,常用于生成應(yīng)用的數(shù)字簽名。這個數(shù)字簽名用于驗證應(yīng)用的身份,并確保應(yīng)用在發(fā)布到設(shè)備上時沒有被篡改。 以下是生成 Android 應(yīng)用的 SHA-1 值的步驟: 生成密鑰庫(KeyStore): 首先,你需要創(chuàng)建一個密鑰庫

    2024年02月07日
    瀏覽(22)
  • [虛幻引擎插件說明] DTSha – 藍圖SHA加密節(jié)點, SHA1, SHA224, SHA256, SHA384, SHA512加密

    [虛幻引擎插件說明] DTSha – 藍圖SHA加密節(jié)點, SHA1, SHA224, SHA256, SHA384, SHA512加密

    本插件可以在虛幻引擎中使用藍圖對字符串或者文件進行SHA加密。 目錄 1. 節(jié)點說明 SHA-1 Encrypt SHA-224 Encrypt SHA-256 Encrypt SHA-384 Encrypt SHA-512 Encrypt SHA-1 Of File SHA-224 Of File SHA-256 Of File SHA-384 Of File SHA-512 Of File 2. 案例演示??編輯 3. 插件下載 SHA-1 Encrypt 字符串進行SHA-1加密,字符串

    2024年02月16日
    瀏覽(29)
  • Python hashlib 加密方法(MD5、SHA1、SHA256、SHA52)

    Python 提供了 hashlib 模塊來進行加密操作。在下面的文章中,我們將介紹 hashlib 模塊的常用加密算法。 hashlib 模塊是 Python 中用于加密的標(biāo)準(zhǔn)庫。它包含了所有常見的哈希函數(shù),例如 SHA1、SHA224、SHA256、SHA384、SHA512、MD5 等。這些哈希函數(shù)都是單向的,即只能對信息進行加密,而

    2024年02月07日
    瀏覽(49)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包