由于网上代码测试出现很多错误,而且很多都是C++,C语言代码,头文件无法在内核态使用,故自己根据网上相关代码以及openssl标准库代码写了一个在内核态使用的SHA256代码,其中保留了openssl库的借口,可以直接使用!

/* SHA256.h  算法实现 */#include <linux/types.h>
#include <linux/skbuff.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/time.h>#define SHA256_BLOCK_SIZE 32typedef unsigned char BYTE;
typedef unsigned int  WORD;typedef struct {BYTE ctxdata[64];WORD datalen;unsigned long long bitlen;WORD state[8];
} SHA256_CTX;void SHA256_Init(SHA256_CTX *ctx);
void SHA256_Update(SHA256_CTX *ctx, const BYTE data[], WORD len);
void SHA256_Final(SHA256_CTX *ctx, BYTE hash[]);
int sha256_test(void);#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))#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))static const unsigned int 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
};void sha256_transform(SHA256_CTX *ctx, const BYTE databuf[])
{unsigned int 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] = (databuf[j] << 24) | (databuf[j + 1] << 16) | (databuf[j + 2] << 8) | (databuf[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 SHA256_Init(SHA256_CTX *ctx)
{ctx->datalen = 0;ctx->bitlen = 0;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;
}void SHA256_Update(SHA256_CTX *ctx, const BYTE databuf[], WORD len)
{unsigned int i;for (i = 0; i < len; ++i) {ctx->ctxdata[ctx->datalen] = databuf[i];ctx->datalen++;if (ctx->datalen == 64) {sha256_transform(ctx, ctx->ctxdata);ctx->bitlen += 512;ctx->datalen = 0;}}
}void SHA256_Final(SHA256_CTX *ctx, BYTE hash[])
{unsigned int i;int j;i = ctx->datalen;if (ctx->datalen < 56) {ctx->ctxdata[i++] = 0x80;  // pad 10000000 = 0x80while (i < 56)ctx->ctxdata[i++] = 0x00;}else {ctx->ctxdata[i++] = 0x80;while (i < 64)ctx->ctxdata[i++] = 0x00;sha256_transform(ctx, ctx->ctxdata);memset(ctx->ctxdata, 0, 56);}ctx->bitlen += ctx->datalen * 8;ctx->ctxdata[63] = ctx->bitlen;ctx->ctxdata[62] = ctx->bitlen >> 8;ctx->ctxdata[61] = ctx->bitlen >> 16;ctx->ctxdata[60] = ctx->bitlen >> 24;ctx->ctxdata[59] = ctx->bitlen >> 32;ctx->ctxdata[58] = ctx->bitlen >> 40;ctx->ctxdata[57] = ctx->bitlen >> 48;ctx->ctxdata[56] = ctx->bitlen >> 56;sha256_transform(ctx, ctx->ctxdata);for (i = 0; i < 4; ++i) {hash[i]      = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff;hash[i + 4]  = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff;hash[i + 8]  = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff;hash[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff;hash[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff;hash[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff;hash[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff;hash[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff;}}

在内核函数中进行测试:

Makefile文件:

obj-m := tt.o  KERNELBUILD :=/lib/modules/$(shell uname -r)/builddefault:  make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:  rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions

测试结果:

http://www.ttmd5.com/hash.php?type=9在线SHA256加密网站进行测试

可以看出代码测试正确!

如有错误,还望指正!

SHA256 算法实现相关推荐

  1. 讨论帖:比特币中的SHA256算法的实现与标准的SHA256算法实现是否相同?

    近日阅读了比特币源码中与哈希相关的部分,对于其中一些细节还是有不清晰的地方. 于是我写了一个小的测试demo:sha256_test,代码下载 分别测试了三个版本对于SHA-256算法的实现: Bit ...

  2. c#使用SHA256算法实现对文件的加密和解密

    全栈工程师开发手册 (作者:栾鹏) c#教程全解 c#使用SHA256算法实现对文件的加密和解密 将当期目录的test.txt加密成文件test1.txt,再将加密后的test1.txt文件解密成te ...

  3. C语言实现一个区块链,区块链学习(1) sha256算法 c语言实现-Go语言中文社区

    sha256算法,网上有很多的介绍,摘抄一段如下: SHA-256 算法输入报文的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,产生的输出是一个256-bit 的报文摘要.该算法 ...

  4. SHA-256算法实现

    SHA-256 算法输入报文的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,产生 的输出是一个256-bit 的报文摘要.该算法处理包括以下几步: STEP1:附加填充比特.对报 ...

  5. SHA-256 算法-java实现

    SHA安全加密标准,是至今世界上使用最广泛且安全的压缩算法之一,随着密码学研究的不断深入和计算机技术的快速发展,SHA-256算法得到全面推广应用. java代码实现: package com.cao ...

  6. HASH和HMAC(4):SHA-224和SHA-256算法原理

    协议标准:https://csrc.nist.gov/CSRC/media/Publications/fips/180/2/archive/2002-08-01/documents/fips180-2 ...

  7. JavaScript:实现加密哈希SHA-256 算法(附完整源码)

    JavaScript:实现加密哈希SHA-256 算法 // main variables const CHAR_SIZE = 8const K = [0x428a2f98, 0x71374491, ...

  8. 什么是SHA256?比特币是如何应用SHA256算法的?

    SHA 256算法是一种具有确定性的单向哈希函数 算法是执行操作的一系列步骤或过程 哈希函数是种数学函数,输入的长度任意,但是输出长度固定,可以理解为文件的数字指纹,同一个输入值,总是得相同的输出 S ...

  9. openssl——sha256算法源码

    openssl中关于sha256算法最关键的代码文件有sha.h, sha256.c,md32_common.h,crypto.h等等. 1.sha256算法最关键的文件sha256.c. 查看这个文 ...

  10. lua sha256算法函数封装

    module(..., package.seeall)--sha256算法 function sha256(str)local resty_sha256 = require "resty.s ...

最新文章

  1. BZOJ 2748: [HAOI2012]音量调节【二维dp,枚举】
  2. 数据库中字段类型对应的C#中的数据类型
  3. 看麻了!35岁奥地利总理辞职当码农
  4. 介绍一位高级数据分析师,告诉你数据分析原来这么好玩
  5. mysql查询递增列_mysql在查询结果列表前添加一列递增的序号列(最简)
  6. JavaSE基础知识(5)—面向对象(Object类)
  7. linux_NandFlash_driver_超详细分析 .
  8. linux之gdb基本调试命令和使用总结
  9. huffman编码的程序流程图_Huffman编码实现压缩解压缩
  10. windows server 2003 出错提示请求的资源在使用中解决方案
  11. php通过字符串生存hashCode
  12. 8 一点就消失_消失的莉莉安(25)
  13. Shiro学习总结(10)——Spring集成Shiro
  14. stm32代码_MATLAB(STM32MATTARGET) 自动生成STM32工程代码
  15. 盘点2016年炙手可热的TV BOX电视盒子
  16. Dll入口函数参数详解...
  17. 我的2011--衣带渐宽终不悔,为伊消得人憔悴
  18. S.M.A.R.T原则:目标管理概念 - 让你的管理规范化
  19. Android虚拟sdcard
  20. 乐高魔方机器人编程及图纸_魔方机器人教程图纸程序下载【Reinhard Grafl】作品...

热门文章

  1. 消化系统疾病病人的护理题库
  2. 设计模式—清晰头脑写代码赚金币
  3. 计算机的正确配置文件,Windows10电脑系统如何正确配置显示器颜色配置文件
  4. Python技能树的测评和CSDN Markdown编辑器的测评
  5. 机器学习基础概念——过拟合和欠拟合
  6. Qt实现多摄像头的识别、显示、截图、分辨率帧率设置等功能
  7. 基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第三篇)故障保护及问题诊断
  8. 新一配:iPod及其配置介绍【转载】
  9. 用网页打开本地exe程序
  10. 用JS实现一个秒表计时器