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

news/2024/7/25 20:34:52/文章来源:https://blog.csdn.net/qq_34217861/article/details/139268700

一、源码


#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的算出来结果多少都有差异,干脆直接自己撸一套来调,这套代码中对类型和字节严格定义,即便是跨平台也可以用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1053029.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ Primer 第五版 第十三章 拷贝控制

当定义一个类时&#xff0c;我们显式地或隐式地指定在此类型的对象拷贝、移动、赋值和销毁时做什么。一个类通过定义五种特殊的成员函数来控制这些操作&#xff0c;包括&#xff1a;拷贝构造函数&#xff08;copy constructor&#xff09;、拷贝赋值运算符&#xff08;copy-ass…

9、C#【进阶】特性

特性 文章目录 1、特性概念2、自定义特性 Attribute3、特性的使用4、限制自定义特性的使用范围5、系统自带特性1、过时特性2、调用者信息特性3、条件编译特性4、外部dll包函数特性 1、特性概念 特性是一种允许我们向程序的程序集添加元数据的语言结构 它是用于保存程序机构信息…

全网首发!精选32个最新计算机毕设实战项目(附源码),拿走就用!

Hi 大家好&#xff0c;马上毕业季又要开始了&#xff0c;陆陆续续又要准备毕业设计了&#xff0c;有些学生轻而易举就搞定了&#xff0c;有些学生压根没有思路怎么做&#xff0c;可能是因为技术问题&#xff0c;也可能是因为经验问题。 计算机毕业相关的设计最近几年类型比较多…

Docker 开启 SSL 验证

最近看 OJ 项目的远程开发阶段&#xff0c;然后踩坑踩了 2 天&#x1f602; Docker 版本&#xff1a;在 CentOS 安装 sudo yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io Client: Docker Engine - CommunityVersion: 20.10.9API version: …

如何远程访问Redis?

远程访问Redis是一种常见的需求&#xff0c;特别是在分布式系统或跨地域网络中。通过远程访问&#xff0c;我们可以轻松地对远程的Redis数据库进行操作和管理。 天联保障数据安全 对于远程访问Redis的安全性问题&#xff0c;我们可以借助天联来保障数据的安全。天联是一种基于…

Pytorch创建张量

文章目录 1.torch.from_numpy()2. torch.zeros()3. torch.ones()4. torch.arange()5. torch.linspace()6. torch.logspace()7. torch.eye()8. torch.empty()9. torch.full()10. torch.complex()10. torch.rand()10. torch.randint()11. torch.randn12. torch.normal()13. torch…

概率分布函数与误差函数的关系

正态函数&#xff08;高斯分布&#xff09; 对其求[b,x]区间的积分 标准误差函数 以下两个方程相等&#xff08;a,b取值任意&#xff09; 两个函数重合 可知正态函数 f(t) 在[b,x]的区间上积分等于 引用desmos计算器&#xff1a;Desmos | Lets learn together.

9.4 Go语言入门(运算符)

Go语言入门&#xff08;运算符&#xff09; 目录三、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 其他运算符7. 运算符优先级 目录 Go 语言&#xff08;Golang&#xff09;是一种静态类型、编译型语言&#xff0c;由 Google 开发&#xff0c;专注…

他用AI,抄袭了我的AI作品

《大话西游》里面有一句经典台词&#xff1a;每个人都有一个妈&#xff0c;但是“你妈就一定是你妈吗&#xff1f;” 用AI创作的艺术作品&#xff0c;也走进类似的困境&#xff1a;如何证明你用AI生成的作品&#xff0c;就是你的作品&#xff1f; 近日&#xff0c;腾讯科技独…

编程-辅助工具-Git下载

文章目录 1、前言2、Git官网地址3、迅雷下载 1、前言 采用Git能下载github上的代码&#xff0c;其下载是采用官网下载的&#xff0c;但是下载速度比较慢&#xff0c;网上也推荐了镜像的方式&#xff0c;但是有些链接失效了&#xff0c;突然有一天想起用迅雷是不是合适&#xf…

【Sql Server】随机查询一条表记录,并重重温回顾下存储过程的封装和使用

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言随机查询语…

AI办公自动化:用kimi批量将word文档部分文件名保存到Excel中

文件夹中有很多个word文档&#xff0c;现在只要英文部分的文件名&#xff0c;保存到一个Excel文件中。 可以在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;…

Linux IO模型深度解析与实战应用

linux的5种IO模型 一、这里IO是什么 操作系统设有用户态与内核态,确保系统安全。应用程序默认在用户态运行,而执行如IO操作等底层任务时,需切换至内核态以高效执行。 服务器从网络接收的大致流程如下: 1、数据通过计算机网络来到了网卡 2、把网卡的数据读取到 socket 缓…

将 KNX 接入 Home Assistant 之一 准备硬件

不久前有人小伙伴买了usb转knx ,详情请看 一个 usb 转 knx 的模块 然后想通过这个设备接入 Home Assistant。 后来了解了一下 Home Assistant 并不直接支持 usb转KNX的接入&#xff0c;需要通过KNXD插件转接才行。 然而尝试了很多次叶没有成功&#xff0c;使用西门子的usb接口以…

Android面试题之Kotlin常见集合操作技巧

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 list 创建和修改 不可变list,listOf var list listOf("a","d","f") println(list.getOrElse(3){"Unkn…

关于高性能滤波器和普通型滤波器的区别说明

高性能滤波器和普通型滤波器在性能和滤波效果上存在显著差异。以三安培为代表分析高性能滤波器和普通型滤波器的区别&#xff1a; 从上图曲线可看出&#xff1a; 1.高性能滤波器和普通型滤波器的滤波范围不同。普通型滤波器有效滤波范围为 150KHz~30MHz&#xff0c;而高性能滤…

蓝牙Mesh模块多跳大数据量高带宽传输数据方法

随着物联网技术的飞速发展&#xff0c;越来越多的设备需要实现互联互通。蓝牙Mesh网络作为一种低功耗、高覆盖、易于部署的无线通信技术&#xff0c;已经成为物联网领域中的关键技术之一。在蓝牙Mesh网络中&#xff0c;节点之间可以通过多个跳数进行通信&#xff0c;从而实现大…

剪画小程序:”霸屏各大平台“的黏土滤镜是怎么制作的呢?

最近&#xff0c;网上出现大量“黏土”风格的人物照片。尤其是在社交平台&#xff0c;这类型的分享数量急剧上升。 这是马斯克开车的样子 还有这张是周杰伦七里香的专辑图片 一张照片&#xff0c;十几秒钟&#xff0c;就能还原出你在黏土世界的样子。 以上这些照片是用-【剪画…

解决SpringBoot中插入汉字变成?(一秒解决)

在这里url后面加一行配置即可&useUnicodetrue&characterEncodingUTF-8即可 解释 spring.datasource.url: 这里包含了数据库的URL&#xff0c;以及额外的参数如useUnicodetrue用于启用Unicode字符集支持&#xff0c;characterEncodingUTF-8用于指定字符编码为UTF-8&…

idea2024 nacos中文报错

idea2024 nacos中文报错 报错提示为&#xff1a;Input length 1 报错原因&#xff1a;项目启动编码与nacos编码不一致。 处理方式 添加启动参数utf8修改项目编码格式为utf8 修改idea.vmoptions Help -> Edit Custom 添加一行&#xff1a;-Dfile.encodingUTF-8