21xrx.com
2025-03-26 11:56:28 Wednesday
文章检索 我的文章 写文章
C++实现SHA256加密算法
2023-07-05 09:03:45 深夜i     22     0
C++ SHA256 加密算法 哈希函数 消息摘要

SHA256(Secure Hash Algorithm 256)是一种加密算法,用于保护数据的完整性和安全性。SHA256使用256位的哈希算法,生成的哈希值具有很高的随机性和唯一性,可用于数字签名、密钥交换、认证和数据完整性检查。本文将介绍如何使用C++实现SHA256加密算法。

SHA256加密算法原理

SHA256加密算法是基于Hash算法的。Hash算法将任意长度的输入数据转换为固定长度的输出数据,称为哈希值。SHA256使用32位字作为哈希值,总长度为256位。SHA256加密算法具有以下特点:

1. 确定性:相同的输入数据产生相同的哈希值。

2. 不可逆性:无法从哈希值恢复出原始数据。

3. 散列性:数据的微小变化会导致完全不同的哈希值。

4. 唯一性:两个不同的输入数据产生不同的哈希值的概率极大。

SHA256加密算法实现

C++中实现SHA256加密算法需要用到以下头文件:

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <sstream>

具体实现步骤如下:

1. 定义SHA256结构体,包括一些常量和参数。

struct SHA256 {
  typedef unsigned char byte;
  typedef unsigned int word;
  static const int DIGEST_SIZE = 32;
  static const int BLOCK_SIZE = 64;
  static const int H[8];
  word m_tot_len;
  word m_len;
  byte m_block[2 * BLOCK_SIZE];
  word m_h[8];
  void init();
  void transform(const byte *msg, word len);
  void update(const byte *msg, word len);
  void final(byte *digest);
};

2. 定义常量。

const SHA256::word SHA256::H[8] = 0x3c6ef372;

3. 实现初始化函数init()。

void SHA256::init() {
  m_tot_len = 0;
  m_len = 0;
  m_h[0] = H[0];
  m_h[1] = H[1];
  m_h[2] = H[2];
  m_h[3] = H[3];
  m_h[4] = H[4];
  m_h[5] = H[5];
  m_h[6] = H[6];
  m_h[7] = H[7];
}

4. 实现哈希函数transform()。

void SHA256::transform(const byte *msg, word len) {
  word W[64];
  word Wv[8];
  const byte *p = msg;
  int i;
  for (i = 0; i < 16; i++) {
    W[i] = (((word)p[0]) << 24) | (((word)p[1]) << 16) | (((word)p[2]) << 8) | (((word)p[3]));
    p += 4;
  }
  for (i = 16; i < 64; i++) {
    W[i] = crypto::s_rr((W[i-2]), 17) ^ crypto::s_rr((W[i-2]), 19) ^ (W[i-2] >> 10);
    W[i] += W[i-7];
    W[i] += crypto::s_rr((W[i-15]), 7) ^ crypto::s_rr((W[i-15]), 18) ^ (W[i-15] >> 3);
    W[i] += W[i-16];
  }
  for (i = 0; i < 8; i++) {
    Wv[i] = m_h[i];
  }
  for (i = 0; i < 64; i++) {
    word t1 = Wv[7] + crypto::S_rr(Wv[4], 6) ^ crypto::S_rr(Wv[4], 11) ^ crypto::S_rr(Wv[4], 25);
    t1 += crypto::Ch(Wv[4], Wv[5], Wv[6]);
    t1 += crypto::K[i] + W[i];
    word t2 = crypto::S_rr(Wv[0], 2) ^ crypto::S_rr(Wv[0], 13) ^ crypto::S_rr(Wv[0], 22);
    t2 += crypto::Maj(Wv[0], Wv[1], Wv[2]);
    word tmp1 = Wv[7];
    Wv[7] = Wv[6];
    Wv[6] = Wv[5];
    Wv[5] = Wv[4];
    Wv[4] = Wv[3] + t1;
    Wv[3] = Wv[2];
    Wv[2] = Wv[1];
    Wv[1] = Wv[0];
    Wv[0] = t1 + t2;
  }
  for (i = 0; i < 8; i++) {
    m_h[i] += Wv[i];
  }
}

5. 实现更新函数update()。

void SHA256::update(const byte *msg, word len) {
  word block_nb = (m_len + len) / BLOCK_SIZE + 1;
  word new_len = block_nb * BLOCK_SIZE;
  word rem_len = new_len - m_len;
  word i, j;
  byte *p = m_block + m_len;
  const byte *q = msg;
  for (i = 0; i < rem_len; i++) {
    p[i] = q[i];
  }
  m_len += len;
  for (i = 0; i < block_nb; i++) {
    transform(m_block + (i * BLOCK_SIZE), BLOCK_SIZE);
  }
  for (i = 0; i < (m_len / BLOCK_SIZE); i++) {
    for (j = 0; j < BLOCK_SIZE; j++) {
      m_block[j] = m_block[(i * BLOCK_SIZE) + j];
    }
  }
  m_len %= BLOCK_SIZE;
}

6. 实现最终函数final()。

void SHA256::final(byte *digest) {
  word block_nb = (1 + ((BLOCK_SIZE - 9) < (m_len % BLOCK_SIZE)));
  word len_pad = (block_nb * BLOCK_SIZE) - m_len - 9;
  byte *p = m_block + m_len;
  *p++ = 0x80;
  word i;
  for (i = 0; i < len_pad; i++) {
    *p++ = 0x00;
  }
  m_tot_len += m_len;
  word bit_len = m_tot_len * 8;
  p = m_block + block_nb * BLOCK_SIZE - 8;
  *p++ = (bit_len >> 56) & 0xff;
  *p++ = (bit_len >> 48) & 0xff;
  *p++ = (bit_len >> 40) & 0xff;
  *p++ = (bit_len >> 32) & 0xff;
  *p++ = (bit_len >> 24) & 0xff;
  *p++ = (bit_len >> 16) & 0xff;
  *p++ = (bit_len >> 8) & 0xff;
  *p++ = bit_len & 0xff;
  transform(m_block, block_nb * BLOCK_SIZE);
  word i;
  for (i = 0; i < 8; i++) {
    digest[i] = (m_h[i] >> 24) & 0xff;
    digest[i+1] = (m_h[i] >> 16) & 0xff;
    digest[i+2] = (m_h[i] >> 8) & 0xff;
    digest[i+3] = m_h[i] & 0xff;
  }
}

7. 组合以上函数,实现完整的SHA256加密算法。

string sha256(string input) {
  SHA256 ctx;
  ctx.init();
  ctx.update((const byte*)input.c_str(), input.size());
  byte hash[SHA256::DIGEST_SIZE];
  ctx.final(hash);
  stringstream ss;
  for (int i = 0; i < SHA256::DIGEST_SIZE; i++) {
    ss << hex << setw(2) << setfill('0') << (int)hash[i];
  }
  return ss.str();
}

使用SHA256加密算法

使用实现的SHA256加密算法,可以对任意输入字符串进行加密,获得其哈希值。例如,下面的代码对字符串“Hello SHA256!”进行加密,输出其哈希值。

string input = "Hello SHA256!";
string output = sha256(input);
cout << output << endl;

输出结果为:

e2997decb6b74027e1245b1992f273d92c9f160d94d59edf74c2abea929f5ef4

以上就是使用C++实现SHA256加密算法的过程。SHA256是一种强大的加密算法,可用于保护数据的安全和完整性,常用于网络传输和数据存储中。对SHA256的深入了解和实现,对提高计算机安全和信息加密方面的技能有很大帮助。

  
  

评论区