SHA-1.h
#ifndef _SHA1_H
#define _SHA1_H
#include<iostream>
using namespace std;
//4个函数
#define f1(B,C,D) ((B&C)|((~B)&D))
#define f2(B,C,D) (B^C^D)
#define f3(B,C,D) ((B&C)|(B&D)|(C&D))
#define f4(B,C,D) (B^C^D)
typedef unsigned int UInt32;
//信息摘要结构体
struct Message_Digest{
UInt32 H[];
};
//SHA-1类
class SHA1
{
public:
SHA1(){INIT();};
~SHA1(){};
Message_Digest DEAL(UInt32 W[]);//以512bit块为单位处理
private:
void INIT(); //初始杂凑值
UInt32 ROTL(int k,UInt32 W);//循环左移k比特给定的32比特字
//信息摘要
Message_Digest MD;
}; #endif

SHA-1.cpp

#include"SHA-1.h"
//
const UInt32 K[] = {0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6};
//初始化
void SHA1::INIT(){
MD.H[] = 0x67452301;
MD.H[] = 0xefcdab89;
MD.H[] = 0x98badcfe;
MD.H[] = 0x10325476;
MD.H[] = 0xc3d2e1f0;
}
//
Message_Digest SHA1::DEAL(UInt32 M[]){
int i;
UInt32 temp;
UInt32 W[];
UInt32 A,B,C,D,E;
INIT();//每次都初始化
for(i=;i<;i++){
W[i] = M[i];
}
for(i=;i<;i++){
W[i] = ROTL(,(W[i-]^W[i-]^W[i-]^W[i-]));
}
//初始寄存器
A = MD.H[];
B = MD.H[];
C = MD.H[];
D = MD.H[];
E = MD.H[];
cout<<"初始:"<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<endl;
for(i=;i<;i++){
temp = ROTL(,A) + f1(B,C,D) + E + W[i] + K[];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = ROTL(,B);
B = A;
A = temp;
cout<<dec<<i<<":";
cout<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<endl;
}
for(i=;i<;i++){
temp = ROTL(,A) + f2(B,C,D) + E + W[i] + K[];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = ROTL(,B);
B = A;
A = temp;
cout<<dec<<i<<":";
cout<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<endl;
}
for(i=;i<;i++){
temp = ROTL(,A) + f3(B,C,D) + E + W[i] + K[];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = ROTL(,B);
B = A;
A = temp;
cout<<dec<<i<<":";
cout<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<endl;
}
for(i=;i<;i++){
temp = ROTL(,A) + f4(B,C,D) + E + W[i] + K[];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = ROTL(,B);
B = A;
A = temp;
cout<<dec<<i<<":";
cout<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<endl;
}
MD.H[] = (MD.H[]+A) & 0xFFFFFFFF;
MD.H[] = (MD.H[]+B) & 0xFFFFFFFF;
MD.H[] = (MD.H[]+C) & 0xFFFFFFFF;
MD.H[] = (MD.H[]+D) & 0xFFFFFFFF;
MD.H[] = (MD.H[]+E) & 0xFFFFFFFF; return MD;
}
//循环左移
UInt32 SHA1::ROTL(int k,UInt32 W){
return ((W << k) & 0xFFFFFFFF) | (W) >> (-(k));
}

TEST.cpp

#include<iostream>
#include"SHA-1.h"
using namespace std;
//
typedef unsigned int UInt32;
typedef unsigned __int64 UInt64;
typedef unsigned char UChar;
#define Max 1000//最大字符数
SHA1 sha1=SHA1();
Message_Digest M_D;
UInt32 W[Max/];//整型
UInt32 M[]; //存分组信息
//压缩+显示
void compress(){ M_D = sha1.DEAL(W);
cout<<"哈希值: ";
cout<<hex<<M_D.H[]<<" ";
cout<<hex<<M_D.H[]<<" ";
cout<<hex<<M_D.H[]<<" ";
cout<<hex<<M_D.H[]<<" ";
cout<<hex<<M_D.H[];
cout<<endl;
}
//添加填充位+添加长度
void PAD(UChar Y[Max]){
//x+1+d+l=|x|
UInt32 i,j;
UInt32 T1=,T2=,T3=,T4=;
UChar temp[Max]={};
UInt64 x = strlen((char *)Y);//数据长度
UInt32 d = abs(-x) % ; //填充长度
UInt32 n = (x+)/+; //分组数
UInt32 m = x%; //最后组数据长度
UInt32 l = ;
cout<<"数据长度x:"<<int(x)<<" ";
cout<<"填充长度d:"<<d<<" ";
cout<<"分组数量n:"<<n<<" ";
cout<<"最后长度m:"<<m<<endl;
//不填充
for(i=;i<x;i++){
temp[i] = Y[i];
}
//填充1次1000 0000
temp[x] = 0x80;
//填充d次0000 0000
for(i=x+;i<x+d+;i++){
temp[i] = 0x00;
}
//填充长度的63-0位
for(i=;i<=l;i++){
temp[(n*)-i] = (UChar)(*x>>(i-)*);
}
//无符号字符转换为无符号整型
for(i=;i<Max/;i++){
for(j=;j<;j++){
if(j==)
T1 = temp[*i+j];
if(j==)
T2 = temp[*i+j];
if(j==)
T3 = temp[*i+j];
if(j==)
T4 = temp[*i+j];
}
W[i] = (T1<<) + (T2<<) + (T3<<) +T4;
}
//显示16进制数据
cout<<"16进制数据:";
for(i=;i<n*;i++){
cout<<hex<<" "<<W[i];
}
cout<<endl;
//分组处理
for(i=;i<n;i++){
cout<<"分组处理:"<<i+<<endl;
for(j=;j<;j++){
M[j] = W[(i*)+j];
}
compress();//sha-1压缩
}
}
//主函数
int main(){
UChar Y[Max];
cout<<"请输入要加密的字符串(最大"<<Max<<"个):"<<endl;
cin>>Y;
PAD(Y); system("pause");
return ;
}

SHA-1算法的更多相关文章

  1. BASE64,MD5,SHA,HMAC加密與解密算法(java)

    package com.ice.webos.util.security; import java.io.UnsupportedEncodingException; import java.math.B ...

  2. 密码学系列之:NIST和SHA算法

    目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. N ...

  3. 数据摘要算法的测试效率(SHA、MD5和CRC32)

    1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...

  4. PHP中各种Hash算法性能比较

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  5. [区块链] 密码学中Hash算法(基础)

    在介绍Hash算法之前,先给大家来个数据结构中对hash表(散列表)的简单解释,然后我再逐步深入,讲解一下hash算法. 一.Hash原理——基础篇 1.1 概念 哈希表就是一种以 键-值(key-i ...

  6. 【区块链】【一】Hash 算法【转】

    问题导读1.哈希算法在区块链的作用是什么?2.什么是哈希算法?3.哈希算法是否可逆?4.比特币采用的是什么哈希算法? 作用在学习哈希算法前,我们需要知道哈希在区块链的作用哈希算法的作用如下:区块链通过 ...

  7. Hash算法总结(转)

    1. Hash是什么,它的作用先举个例子.我们每个活在世上的人,为了能够参与各种社会活动,都需要一个用于识别自己的标志.也许你觉得名字或是身份证就足以代表你这个人,但是这种代表性非常脆弱,因为重名的人 ...

  8. 信息摘要算法之七:SHA在区块链中的应用

    最近几年比特币的火爆带动了人们对区块链技术的研究.当然我们在这里并不讨论区块链技术本身,而是讨论一下区块链中的SHA算法的应用.对于SHA系列算法我们已经在前面作了说明,在这里也不再重复. 1.区块链 ...

  9. 比特币算法——SHA256算法介绍

    SHA256是安全散列算法SHA(Secure Hash Algorithm)系列算法之一,其摘要长度为256bits,即32个字节,故称SHA256.SHA系列算法是美国国家安全局 (NSA) 设计 ...

  10. MAC算法

    MAC算法 (Message Authentication Codes) 带秘密密钥的Hash函数:消息的散列值由只有通信双方知道的秘密密钥K来控制.此时Hash值称作MAC. 原理:在md与sha系 ...

随机推荐

  1. ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”

    DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...

  2. 【WCF】使用“用户名/密码”验证的合理方法

    我不敢说俺的方法是最佳方案,反正这世界上很多东西都是变动的,正像老子所说的——“反(返)者,道之动”.以往看到有些文章中说,为每个客户端安装证书嫌麻烦,就直接采用把用户名和密码塞在SOAP头中发送,然 ...

  3. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  4. HTML块级元素

    前面的话   在HTML5出现之前,人们一般把元素分为块级.内联和内联块元素.本文将详细介绍HTML块级元素 h   标题(Heading)元素有六个不同的级别,<h1>是最高级的,而&l ...

  5. 用神奇的currentColor制作简洁的颜色动画效果

    先上一个兼容性总结图:老版本ie可以直接用复杂方法了,套用某表情包的话:  2016年了,做前端你还考虑兼容IE6?你这简直是自暴自弃! 好了,知道了兼容性,我们可以放心的使用了. 在CSS3中扩展了 ...

  6. 【Java每日一题】20170104

    20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  7. IT运维监控解决方案介绍

    现状 •小公司/ 创业团队< 500台服务器规模 开源方案:Zabbix.Nagios.Cacti- 云服务提供商:监控宝.oneAlert等 •BAT级别> 10万台服务器 投 ...

  8. js 入门级常见问题

    写在前面:以下是个人总结的关于js常见的入门级的问题一些总结. js是有 ECMAScript Dom Bom 三部分组成. 1,undefined,NaN,Null,infinity 1) unde ...

  9. linux下配置matlab运行环境(MCR)

    在安装好的matlab下有MCR(MatlabCompilerRuntime)在matlab2011/toolbox/compiler/deploy/glnxa64下找到MCRInstaller.zi ...

  10. 把int*传值给char*,打印出错误的数字

    首先进入debug模式查看i的地址也就是ptr的值 以16进制位小端模式存储(一个整型四个字节,8位16进制数)(根据系统位数情况) 紧接着因为ptr是char*型指针变量,读取数据时按照一个字节一个 ...