shapp——一个计算sha256的命令行小工具的实现

该博客介绍了如何从openssl源码中提取相关代码,创建一个简单的SHA256计算工具。作者提供了包含头文件sha256.h、源文件sha256.cpp以及main文件的实现过程。
摘要由CSDN通过智能技术生成

此工具从openssl源码中抠出部分代码,实现了一个类sha256。代码是匆匆从openssl里面抠出来的,没有经过细心整理。

头文件:sha256.h

#pragma once 
#include <string>  

#define SHA_LONG unsigned int  
#define SHA_LBLOCK  16
//#define SHA_LAST_BLOCK  (SHA_CBLOCK-8) 
#define SHA256_CBLOCK   (SHA_LBLOCK*4)  /* SHA-256 treats input data as a
                     * contiguous array of 32 bit
                     * wide big-endian values. */
#define SHA256_DIGEST_LENGTH    32  
#define DATA_ORDER_IS_BIG_ENDIAN  

typedef struct SHA256state_st
    {
    SHA_LONG h[8];
    SHA_LONG Nl,Nh;
    SHA_LONG data[SHA_LBLOCK];
    unsigned int num,md_len;
    } SHA256_CTX;

//替换定义于通用算法里面的那些宏
#define HASH_LONG               SHA_LONG  
#define HASH_CTX                SHA256_CTX
#define HASH_CBLOCK             SHA256_CBLOCK  

#define MD32_REG_T long  
#define X(i)    XX##i  

#define HASH_MAKE_STRING(c,s)   do {    \
    unsigned long ll;       \
    unsigned int  nn;       \
    for (nn=0;nn<SHA256_DIGEST_LENGTH/4;nn++)   \
        {   ll=(c)->h[nn]; (void)HOST_l2c(ll,(s));   }  \
    } while (0)  



//来源于md32_common.h的定义,用于大端对齐DATA_ORDER_IS_BIG_ENDIAN
#define HOST_c2l(c,l)   (l =(((unsigned long)(*((c)++)))<<24),        \
             l|=(((unsigned long)(*((c)++)))<<16),        \
             l|=(((unsigned long)(*((c)++)))<< 8),        \
             l|=(((unsigned long)(*((c)++)))       ),       \
             l)  
#define HOST_l2c(l,c)   (*((c)++)=(unsigned char)(((l)>>24)&0xff),    \
             *((c)++)=(unsigned char)(((l)>>16)&0xff),    \
             *((c)++)=(unsigned char)(((l)>> 8)&0xff),    \
             *((c)++)=(unsigned char)(((l)    )&0xff),  \
             l)  

class sha256
{
public:
    sha256(void);
    ~sha256(void);

public:
    void sha(const std::string& src, std::string& out);
private:
    int init(SHA256_CTX *c);
    int update(SHA256_CTX *c, const void *data_, size_t len);
    int final(unsigned char *md, HASH_CTX *c);
    void sha256_block_data_order (SHA256_CTX *c, const void *p, size_t num);
};

源文件sha256.cpp

#include "StdAfx.h"
#include "sha256.h"
#include <sstream>
#include <iomanip>

sha256::sha256(void)
{
}

sha256::~sha256(void)
{
}

void sha256::sha(const std::string& src, std::string& out) {
    SHA256_CTX c;  
    unsigned char m[SHA256_DIGEST_LENGTH];  
    memset(m,0,sizeof(m)); 

    init(&c); 
    update(&c,src.c_str(),src.length());  
    final(m,&c);  
    //OPENSSL_cleanse(&c,sizeof(c));  
    std::stringstream  hex;
    char buf[3]= {
  0};
    for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
        memset(buf,0,sizeof(buf)); 
        sprintf_s(buf,sizeof(buf),"%02X",m[i]);
        hex<<buf;
    }
    out = hex.str();
}

int sha256::init(SHA256_CTX *c) { 
    memset (c,0,sizeof(*c));
    c->h[0]=0x6a09e667UL;   c->h[1]=0xbb67ae85UL;
    c->h[2]=0x3c6ef372UL;   c->h[3]=0xa54ff53aUL;
    c->h[4]=0x510e527fUL;   c->h[5]=0x9b05688cUL;
    c->h[6]=0x1f83d9abUL;   c->h[7]=0x5be0cd19UL;
    c->md_len=SHA256_DIGEST_LENGTH;
    return 1;
}

//通用的算法,定义于openssl/md32_common.h 的HASH_UPDATE
#define HASH_BLOCK_DATA_ORDER   sha256_block_data_order
int sha256::update(SHA256_CTX *c, const void *data_, size_t len) {
    const unsigned char *data=
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值