21xrx.com
2024-12-22 23:04:54 Sunday
登录
文章检索 我的文章 写文章
C++实现SHA256加密算法
2023-07-05 09:03:45 深夜i     --     --
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的深入了解和实现,对提高计算机安全和信息加密方面的技能有很大帮助。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复