SHA-1算法
#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算法的更多相关文章
- BASE64,MD5,SHA,HMAC加密與解密算法(java)
package com.ice.webos.util.security; import java.io.UnsupportedEncodingException; import java.math.B ...
- 密码学系列之:NIST和SHA算法
目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. N ...
- 数据摘要算法的测试效率(SHA、MD5和CRC32)
1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...
- PHP中各种Hash算法性能比较
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- [区块链] 密码学中Hash算法(基础)
在介绍Hash算法之前,先给大家来个数据结构中对hash表(散列表)的简单解释,然后我再逐步深入,讲解一下hash算法. 一.Hash原理——基础篇 1.1 概念 哈希表就是一种以 键-值(key-i ...
- 【区块链】【一】Hash 算法【转】
问题导读1.哈希算法在区块链的作用是什么?2.什么是哈希算法?3.哈希算法是否可逆?4.比特币采用的是什么哈希算法? 作用在学习哈希算法前,我们需要知道哈希在区块链的作用哈希算法的作用如下:区块链通过 ...
- Hash算法总结(转)
1. Hash是什么,它的作用先举个例子.我们每个活在世上的人,为了能够参与各种社会活动,都需要一个用于识别自己的标志.也许你觉得名字或是身份证就足以代表你这个人,但是这种代表性非常脆弱,因为重名的人 ...
- 信息摘要算法之七:SHA在区块链中的应用
最近几年比特币的火爆带动了人们对区块链技术的研究.当然我们在这里并不讨论区块链技术本身,而是讨论一下区块链中的SHA算法的应用.对于SHA系列算法我们已经在前面作了说明,在这里也不再重复. 1.区块链 ...
- 比特币算法——SHA256算法介绍
SHA256是安全散列算法SHA(Secure Hash Algorithm)系列算法之一,其摘要长度为256bits,即32个字节,故称SHA256.SHA系列算法是美国国家安全局 (NSA) 设计 ...
- MAC算法
MAC算法 (Message Authentication Codes) 带秘密密钥的Hash函数:消息的散列值由只有通信双方知道的秘密密钥K来控制.此时Hash值称作MAC. 原理:在md与sha系 ...
随机推荐
- Angular2入门系列教程3-多个组件,主从关系
上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...
- PHP实现RTX发送消息提醒
RTX是腾讯公司推出的企业级即时通信平台,大多数公司都在使用它,但是我们很多时候需要将自己系统或者产品的一些通知实时推送给RTX,这就需要用到RTX的服务端SDK,建议先去看看RTX的SDK开发文档( ...
- SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]
目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...
- SQL Server相关书籍
SQL Server相关书籍 (排名不分先后) Microsoft SQL Server 企业级平台管理实践 SQL Server 2008数据库技术内幕 SQL Server性能调优实战 SQL S ...
- Unity 序列化
Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...
- 利用XAG在RAC环境下实现GoldenGate自动Failover
概述 在RAC环境下配置OGG,要想实现RAC节点故障时,OGG能自动的failover到正常节点,要保证两点: 1. OGG的checkpoint,trail,BR文件放置在共享的集群文件系统上,R ...
- 伪共享(false sharing),并发编程无声的性能杀手
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...
- Xamarin+Prism开发详解二:Xaml文件如何简单绑定Resources资源文件内容
我们知道在UWP里面有Resources文件xxx.resx,在Android里面有String.Xml文件等.那跨平台如何统一这些类别不一的资源文件以及Xaml设计文件如何绑定这些资源?应用支持多国 ...
- pt-heartbeat
pt-heartbeat是用来监测主从延迟的情况的,众所周知,传统的通过show slave status\G命令中的Seconds_Behind_Master值来判断主从延迟并不靠谱. pt-hea ...
- Docker与CI持续集成/CD
背景 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制 ...