与MD5算法类似,SHA-1算法也是在接收到消息后产生消息摘要,能够用来验证数据的完整性。

不同的是SHA1会产生一个160位的消息摘要(MD5产生的是128位)。

其它的性质之类的不多说(请參考前面MD5算法),直接上SHA-1算法的步骤

1、补位

首先要进行补位,使得补位后信息的长度对512求余为448。

即数据扩展至

K*512+448(bit),即K*64+56(byte)。K为自然数。

详细补位操作:先补一个1。后面补0至满足上述要求。最少要补1bit,最多补512bit。



2、补长度

在K*64+56(byte)的基础上补上8byte,这8byte是用来保存原始信息的长度。



3、使用的常量

一系列的常量字K(0), K(1), ... , K(79),假设以16进制给出。

它们例如以下:

Kt = 0x5A827999  (0 <= t <= 19)

Kt = 0x6ED9EBA1 (20 <= t <= 39)

Kt = 0x8F1BBCDC (40 <= t <= 59)

Kt = 0xCA62C1D6 (60 <= t <= 79)

初始化缓冲常量

H0 = 67452301

H1 = EFCDAB89

H2 = 98BADCFE

H3 = 10325476

H4 = C3D2E1F0

4、辅助函数与加密函数

首先定义4个辅助函数:

(0<=t<20):f(B,C,D,t)=(B & C) | ((~B) & D);

(20<=t<40):f(B,C,D,t)=B ^ C ^ D;

(40<=t<60):f(B,C,D,t)=(B & C) | ((B & D) | (C & D));

(60<=t<80):f(B,C,D,t)=B ^ C ^ D;

C++代码例如以下

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
using namespace std; unsigned circleShift(const unsigned& word,const int& bits){
return (word<<bits) | ((word)>>(32-bits));
} unsigned sha1Fun(const unsigned& B,const unsigned& C,const unsigned& D,const unsigned& t){ switch (t/20){
case 0: return (B & C) | ((~B) & D);
case 2: return (B & C) | (B & D) | (C & D);
case 1:
case 3: return B ^ C ^ D;
} return t;
} string sha1(const string& strRaw){ string str(strRaw); str+=(unsigned char)(0x80); // 每一个字节8位,所以要乘8,左移3位
while (str.size()<<3 % 512 != 448){
str+=(char)0;
} // 写入原始数据长度
for (int i(56);i>=0;i-=8){
str+=(unsigned char)((((unsigned __int64)strRaw.size())<<3) >> i);
} const unsigned K[4]={0x5a827999,0x6ed9eba1,0x8f1bbcdc,0xca62c1d6};
unsigned A(0x67452301),B(0xefcdab89),C(0x98badcfe),D(0x10325476),E(0xc3d2e1f0),T(0);
unsigned W[80]={0}; // 每次处理64字节,共512位
for (unsigned i(0);i!=str.size();i+=64){
// 前16个字为原始数据
for (unsigned t(0);t!=16;++t){
// 将4个8位数据放入一个32位变量中
W[t]=((unsigned)str[i+4*t] & 0xff)<<24 |
((unsigned)str[i+4*t+1] & 0xff)<<16 |
((unsigned)str[i+4*t+2] & 0xff)<<8 |
((unsigned)str[i+4*t+3] & 0xff);
} // 填充
for (unsigned t(16);t!=80;++t){
W[t]=circleShift(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16],1);
} for (unsigned t(0);t!=80;++t){
T=circleShift(A,5) + sha1Fun(B,C,D,t) + E + W[t] + K[t/20];
E=D;
D=C;
C=circleShift(B,30);
B=A;
A=T;
} A+=0x67452301;
B+=0xefcdab89;
C+=0x98badcfe;
D+=0x10325476;
E+=0xc3d2e1f0;
} stringstream ss;
ss<<setw(8)<<setfill('0')<<hex<<A<<B<<C<<D<<E;
ss>>str; return str;
} int main(int argc,char *argv[]){ string str(""); cout<<"in put a string :"<<endl;
getline(cin,str); cout<<"raw string: "<<str<<endl
<<"sha1 encode: "<<sha1(str)<<endl;
system("pause");
return 0;
}

详细C++实现算法下载


加密散列算法——SHA-1的更多相关文章

  1. 个人理解c#对称加密 非对称加密 散列算法的应用场景

    c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 ...

  2. [转帖]什么是安全散列算法SHA256?

    什么是安全散列算法SHA256? http://8btc.com/article-136-1.html 发布者: 无主之地 发表于: 2013-10-1 01:31 78152 2 分享   安全散列 ...

  3. 什么是安全散列算法SHA256?

    安全散列算法SHA(Secure Hash Algorithm)是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1.SHA-224.S ...

  4. Android数据加密之SHA安全散列算法

    前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...

  5. SHA安全散列算法简析

    1 SHA算法简介 1.1 概述 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散 ...

  6. PKI和加密,散列算法

    Day 11-PKI和加密,散列算法 PKI(Public Key Infrastructure公钥基础设施) 1 PKI(Public Key Infrastructure公钥基础设施)回顾学习 - ...

  7. shiro中自定义realm实现md5散列算法加密的模拟

    shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...

  8. 加密算法和MD5等散列算法的区别(转)

    本文转自http://www.cnblogs.com/eternalwt/archive/2013/03/21/2973807.html 感谢作者 1.在软件开发的用户注册功能中常出现MD5加密这个概 ...

  9. Shiro入门学习之散列算法与凭证配置(六)

    一.散列算法概述 散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5.SHA等,一般进行散列时最好提供一个salt(“盐”),什么意思?举个栗子 ...

随机推荐

  1. [GXOI/GZOI2019]与或和(单调栈)

    想了想决定把这几题也随便水个解题报告... bzoj  luogu 思路: 首先肯定得拆成二进制30位啊 此后每一位的就是个01矩阵 Q1就是全是1的矩阵个数 Q2就是总矩阵个数减去全是0的矩阵个数 ...

  2. 黑马毕向东Java基础知识总结

    Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记    侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...

  3. OpenCV+Python实现视频文件裁剪功能

    Python编程实现对视频文件进行剪切的功能.截取指定长度的视频并保存,运行后首先选择要裁剪的视频,然后输入开始时间点和停止时间点即可.将剪切后的视频保存为output.avi文件 所属网站分类: 资 ...

  4. Fiddler基本用法:手机抓包

    from:https://blog.csdn.net/gld824125233/article/details/52588275 电脑最好是笔记本,这样能和手机保持统一局域网内:其他不多说,直接说步骤 ...

  5. Java面向对象学习-----类的成员变量

    类的成员变量: 猜数字游戏:一个类A有一个成员变量v,通过随机产生一个100内的整数给v赋值.定义一个方法,对A类的成员变量v进行猜.   没有猜对的情况下提示如果大了则提示大了,小了则提示小了,并且 ...

  6. 编程数学(A-1)-(B-1)-一个数的负次方怎么算

    一个数的负几次方就是这个数的几次方的倒数.当这个数是正整数时,也就是说一个数的负n次方就是这个数的n次方分之一.例如: 2的-2次方=2的2次方分之1=4分之13的-2次方=3的2次方分之1=9分之1 ...

  7. **PHP分步表单提交思路(分页表单提交)

    Q: 我用php做了3张表单 分布在3个页面 想在最后一页 再插入数据库 并且:在插入数据库之前 3个页面 后退 前进 表单的内容会被保留 以便随时更改能实现吗?想过session 感觉内容太多 给服 ...

  8. HDU4325 树状数组+离散化

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4325 Flowers Time Limit: 4000/2000 MS (Java/Others)   ...

  9. 洛谷 P3137 [USACO16FEB]圆形谷仓Circular Barn_Silver

    P3137 [USACO16FEB]圆形谷仓Circular Barn_Silver 题目描述 Being a fan of contemporary architecture, Farmer Joh ...

  10. 图片在 canvas 中的 选中/平移/缩放/旋转,包含了所有canvas的2D变化,让你认识到数学的重要性

    1.介绍 canvas 已经出来好久了,相信大家多少都有接触. 如果你是前端页面开发/移动开发,那么你肯定会有做过图片上传处理,图片优化,以及图片合成,这些都是可以用 canvas 实现的. 如果你是 ...