【SHA256】sha256加解密算法源码,亲测可用,纯C跨平台

2024-05-29 03:04

本文主要是介绍【SHA256】sha256加解密算法源码,亲测可用,纯C跨平台,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、源码


#include "sha256.h"#define rightrotate(w, n) ((w >> n) | (w) << (32 - (n)))
#define copy_uint32(p, val) *((uint32_t *)p) = (val)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 };
unsigned int s_htonl(unsigned val)
{unsigned char tmp0 = val >> 0 & 0xff;unsigned char tmp1 = val >> 8 & 0xff;unsigned char tmp2 = val >> 16 & 0xff;unsigned char tmp3 = val >> 24 & 0xff;unsigned int ans = 0;ans |= tmp0 << 24;ans |= tmp1 << 16;ans |= tmp2 << 8;ans |= tmp3 << 0;return ans;
}
void sha256(const char *data, size_t len, unsigned char *out)
{uint32_t h0 = 0x6a09e667;uint32_t h1 = 0xbb67ae85;uint32_t h2 = 0x3c6ef372;uint32_t h3 = 0xa54ff53a;uint32_t h4 = 0x510e527f;uint32_t h5 = 0x9b05688c;uint32_t h6 = 0x1f83d9ab;uint32_t h7 = 0x5be0cd19;int r = (int)(len * 8 % 512);int append = ((r < 448) ? (448 - r) : (448 + 512 - r)) / 8;unsigned int new_len = len + append + 8; // ԭʼ    +   +64bitλ  unsigned char *buf = (unsigned char *)malloc(new_len);memset(buf + len, 0, append);if (len > 0){memcpy(buf, data, len);}buf[len] = (unsigned char)0x80;uint64_t bits_len = len * 8;for (int i = 0; i < 8; i++){buf[len + append + i] = (bits_len >> ((7 - i) * 8)) & 0xff;}uint32_t w[64];memset(w, 0, 64);size_t chunk_len = new_len / 64; //  512bit    for (unsigned int idx = 0; idx < chunk_len; idx++){// printf("**start idx=%d\n", idx);uint32_t val = 0;for (int i = 0; i < 64; i++){ //    ֽ Ϊ16  32-bit  big-endian   ֣   Ϊw[0],   , w[15]// printf("val figure1:i=%d val=%x \n", i, val);unsigned char buffer_data = *(buf + idx * 64 + i);unsigned int shift_number = 8 * (3 - i % 4);unsigned int fix_number = buffer_data << shift_number;// printf("val figure2:i=%d buffer_data=%c shift_number=%d fix_number=%x \n", i, buffer_data, shift_number, fix_number);val = val | fix_number;// printf("val figure3:i=%d val=%x \n", i, val);if (i % 4 == 3){w[i / 4] = val;// printf("w[i] figure:i=%d w[%d]=%x \n", i, i / 4, val);val = 0;}}for (int i = 16; i < 64; i++){ //ǰ16    ֱ          Ϣ ĵ i    ֽ õ               µ     ʽ õ   uint32_t s0 = rightrotate(w[i - 15], 7) ^ rightrotate(w[i - 15], 18) ^ (w[i - 15] >> 3);uint32_t s1 = rightrotate(w[i - 2], 17) ^ rightrotate(w[i - 2], 19) ^ (w[i - 2] >> 10);w[i] = w[i - 16] + s0 + w[i - 7] + s1;}uint32_t a = h0;uint32_t b = h1;uint32_t c = h2;uint32_t d = h3;uint32_t e = h4;uint32_t f = h5;uint32_t g = h6;uint32_t h = h7;// printf("h0=%x h1=%x h2=%x h3=%x h4=%x h5=%x h6=%x h7=%x \n", h0, h1, h2, h3, h4, h5, h6, h7);for (int i = 0; i < 64; i++){ //uint32_t s_1 = rightrotate(e, 6) ^ rightrotate(e, 11) ^ rightrotate(e, 25);uint32_t ch = (e & f) ^ (~e & g);uint32_t temp1 = h + s_1 + ch + k[i] + w[i];uint32_t s_0 = rightrotate(a, 2) ^ rightrotate(a, 13) ^ rightrotate(a, 22);uint32_t maj = (a & b) ^ (a & c) ^ (b & c);uint32_t temp2 = s_0 + maj;// printf("temp1 figure:h=%x s_1=%x ch=%x w[%d]=%x\n", h, s_1, ch, i, w[i]);// printf("temp2 figure:s_0=%x maj=%x\n", s_0, maj);h = g;g = f;f = e;e = d + temp1;d = c;c = b;b = a;a = temp1 + temp2;// printf("i=%d\n", i);// printf("a=%x b=%x c=%x d=%x e=%x f=%x g=%x h=%x \n", a, b, c, d, e, f, g, h);}h0 += a;h1 += b;h2 += c;h3 += d;h4 += e;h5 += f;h6 += g;h7 += h;// printf("h0=%x h1=%x h2=%x h3=%x h4=%x h5=%x h6=%x h7=%x \n", h0, h1, h2, h3, h4, h5, h6, h7);}// printf("The ho is %x\n",h0);h0 = s_htonl(h0);h1 = s_htonl(h1);h2 = s_htonl(h2);h3 = s_htonl(h3);h4 = s_htonl(h4);h5 = s_htonl(h5);h6 = s_htonl(h6);h7 = s_htonl(h7);copy_uint32(out, h0);copy_uint32(out + 1, h1);copy_uint32(out + 2, h2);copy_uint32(out + 3, h3);copy_uint32(out + 4, h4);copy_uint32(out + 5, h5);copy_uint32(out + 6, h6);copy_uint32(out + 7, h7);/*for(int i=0;i<32;i++){printf("%x",out[i]);}*/
}

啥也不用介绍了,把这代码存成c文件直接编译就能用,跟那些在线加解密工具的结果是一致的,最近在网上找了些资料,以及gpt,发现直接copy的算出来结果多少都有差异,干脆直接自己撸一套来调,这套代码中对类型和字节严格定义,即便是跨平台也可以用。

这篇关于【SHA256】sha256加解密算法源码,亲测可用,纯C跨平台的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012461

相关文章

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2