参考:《密码学引论》第二版 武汉大学出版社

SHA-1简介

SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。(源自百度百科)

具体实现

数据填充

填充数据的母的是使数据长度与448模512同余(这里是指位数)。若数据本身已经满足上述长度要求,让需要进行填充(例如,若数据长度为448位,则仍需要填充512位使其长度变为960,原因最后一组填充需要在数据后附加一个1(8位)以及填充前数据的长度(64位),因此最后一组长度最长为440(输入为字符串格式下)),因此填充位数在1~512之间。

填充方法为在数据后附加一个1和若干个0,然后附上表示填充前数据长度的64位数据(最高有效位在前)。

以"this is a test"为例:

填充前:

填充后(0x70表示输入字符串的位数):

其他情况详见代码

初始化缓冲区

Hash函数中间结果和最终结果都保存于160位的缓冲区中,缓冲区由5个32位寄存器组成,将这些寄存器初始化为下列32为的整数值。

unsigned int h[5]={0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0};

1

需要注意的是,在SHA-1中,字的最高有效字节存于低地址字节位置。

执行算法主循环

如图所示:

每次循环处理一个512位的分组,故循环次数位填充后的数据分组数。

具体代码

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define rol(x,y) ((x<<y)|(x>>(32-y))) //循环左移

//一次循环过程,str为填充后的数据或是数据中的一部分

void round(unsigned char str[64],unsigned int h[5]){

unsigned int a, b, c, d, e,tmp,w[80];

unsigned int i;

for(i=0;i<16;i++){

w[i]=((unsigned int)str[i*4]<<24)|(((unsigned int)str[i*4+1])<<16)|

(((unsigned int)str[i*4+2])<<8)|(((unsigned int)str[i*4+3])<<0);

}

for (i=16;i<80;i++ ){

tmp = w[i-3]^w[i-8]^w[i-14]^w[i-16];

w[i]=rol(tmp,1);

}

a=h[0];b=h[1];c=h[2];d=h[3];e=h[4];

for(i=0;i<80;i++){

switch(i/20){

case 0:tmp=rol(a,5)+((b&c)|(d&~b))+e+w[i]+0x5a827999;break;

case 1:tmp=rol(a,5)+(b^c^d)+e+w[i]+0x6ed9eba1;break;

case 2:tmp=rol(a,5)+((b&c)|(b&d)|(c&d))+e+w[i] +0x8f1bbcdc;break;

case 3:tmp=rol(a,5)+(b^c^d)+e+w[i] + 0xca62c1d6;break;

}

e=d;d=c;

c=rol(b,30);

b=a;a=tmp;

}

h[0]+=a;h[1]+=b;h[2]+=c;h[3]+=d;h[4]+=e;

}

//sha-1算法

void sha1(unsigned char*input,long long len,unsigned char*output){

unsigned char temp[64];

unsigned int h[5]={0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0};

unsigned int i,n=len,tmp;

while(n>=64){

memcpy(temp,input+len-n,64);

round(temp,h);

n-=64;

}

if(n>=56){

memset(temp,0,64);

memcpy(temp,input+len-n,n);temp[n]=128;

round(temp,h);

memset(temp,0,64);

for(i=56;i<64;i++)

temp[i]=((len*8)>>(63-i)*8)&0xff;

round(temp,h);

}

else{

memset(temp,0,64);

memcpy(temp,input+len-n,n);temp[n]=128;

for(i=56;i<64;i++)

temp[i]=((len*8)>>(63-i)*8)&0xff;

round(temp,h);

}

for(i=0;i<20;i++){

tmp=(h[i/4]>>((3-i%4)*8))&0xff;

sprintf((char*)output+2*i,"%02x",tmp);

}

}

//测试

int main(){

unsigned char input[]="this is a test aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",output[40]={0};

sha1(input,strlen((char*)input),output);

printf("%s\n",output);

}

在线工具网址:http://ctf.ssleye.com/hash.html

工具求hash结果

————————————————

版权声明:本文为CSDN博主「混z」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_44310495/article/details/110929971

shal 哈希算法软件实现!相关推荐

  1. .NET平台开源项目速览(12)哈希算法集合类库HashLib

    阅读目录 1.哈希算法介绍 2.HashLib功能介绍 .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部 ...

  2. 一致性哈希算法 应用

    互联网创业中大部分人都是草根创业,这个时候没有强劲的服务器,也没有钱去买很昂贵的海量数据库.在这样严峻的条件下,一批又一批的创业者从创业中获得成 功,这个和当前的开源技术.海量数据架构有着必不可分的关 ...

  3. 21 | 哈希算法(上):如何防止数据库中的用户信息被脱库?

    问题:对于用户信息中的密码,你会如何存储用户密码?仅仅 MD5 加密一下存储就够了吗?--哈希算法 什么是哈希算法 哈希算法的定义和原理:将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规 ...

  4. 一致性哈希算法 应用场景

    一致性哈希算法 应用场景(转) 原创文章,转载请注明: 转载自LANCEYAN.COM 本文链接地址: 一致性hash和solr千万级数据分布式搜索引擎中的应用 互联网创业中大部分人都是草根创业,这个 ...

  5. 哈希算法(哈希函数)的基本使用

    哈希算法(哈希函数)的基本使用 什么是哈希? 哈希的原理和特点 数组与哈希表 哈希函数 哈希函数的冲突与碰撞 哈希算法 哈希的应用 什么是哈希? 如果我们需要誊抄一本新华字典,那么有什么方法呢?比如当 ...

  6. 【Hash篇】HashTab一款可扩展资源管理器的哈希校验软件

    [Hash篇]HashTab一款可扩展资源管理器的哈希校验软件 ​ HashTab是一款非常优秀的Windows资源管理器扩展程序,它在资源管理器的属性窗口中添加了"文件校验"的标 ...

  7. 万字长文,详述TRIDENT: Poseidon 哈希算法的硬件加速与实现!

    本文主要介绍了DatenLord团队在今年的Xilinx全球自适应计算挑战赛上获得 Big Data Analytics赛道一等奖的作品--TRIDENT: Poseidon哈希算法的硬件实现与加速. ...

  8. data_structure_and_algorithm -- 哈希算法(上):如何防止数据库中的用户被脱库?

    最近写的文章有点杂,看上去东一点西一点,最后会在博客目录中捋顺的. 今天主要看一下哈希算法的应用,主要参考:前谷歌工程师王争的课程,感兴趣可以通过下面方式微信扫码购买: 还记得 2011 年 CSDN ...

  9. 哈希算法(一)---如何防止数据库中的用户信息被脱库?

    目录 什么是哈希算法? 应用一:安全加密 应用二:唯一标识 应用三:数据校验 应用四:散列函数 解答开篇 内容小结 课后思考 还记得 2011 年 CSDN 的"脱库"事件吗?当时 ...

最新文章

  1. 在这个问题上,能看出 Java 工程师的真实水平
  2. Pytorch:深度学习中pytorch/torchvision版本和CUDA版本最正确版本匹配、对应版本安装之详细攻略
  3. 数字证书及CA的扫盲介绍
  4. POJ2279-Mr. Young's Picture Permutations【线性dp】
  5. ROS学习笔记三:创建ROS软件包
  6. html文档的三大元素,html文件构成-HTML文档的三大组成元素不包括?HTML文档的三大组成元素不包 爱问知识人...
  7. C语言回调函数callback
  8. 网秦任命两位新董事 成立投资委员会
  9. mysql select 列名_Mysql查询出所有列名
  10. python if语句怎么结束_【Python】IF 条件语句总结
  11. 电动汽车动力电池SOC估算模型电池参数辨识模型【10例】
  12. Code Review之前中后
  13. php getcwd文件件,PHP目录函数 getcwd (取得当前工作目录)
  14. 【微信朋友圈,如何测】
  15. 看MindSpore加持下,如何「炼出」首个千亿参数中文预训练语言模型?
  16. 学习日志--1.html
  17. libcurl 使用记录2(curl_muli的使用)
  18. Rust的面向对象(五)——面向对象
  19. 无法启用IE代理,EasyConnect不支持自动检测设置,请手动配置代理服务器的IP和端口后重试
  20. Java基础(数据类型、字符串)

热门文章

  1. 金融科技创新监管试点与“监管沙箱”探索研讨会成功举办
  2. Android Studio 默认配置路径修改
  3. latex常用数学符号整理
  4. C++ ——一文读懂:关联容器
  5. C++外卖店优先级(模拟)
  6. 王者荣耀s14服务器维护时间,王者荣耀s14赛季结束时间详解一览
  7. 关于Postman的报错问题
  8. 文件损坏怎么修复?3种方法帮您恢复损坏的文件
  9. XML格式字符串 与 FarPoint互转
  10. 蓝桥杯python每日一题——十六进制转十进制