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系 ...
随机推荐
- .NET Core中的认证管理解析
.NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...
- Elasticsearch之java的基本操作一
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
- EntityFramework Core Raw SQL
前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- AI人工智能系列随笔
初探 AI人工智能系列随笔:syntaxnet 初探(1)
- .NET CoreCLR开发人员指南(上)
1.为什么每一个CLR开发人员都需要读这篇文章 和所有的其他的大型代码库相比,CLR代码库有很多而且比较成熟的代码调试工具去检测BUG.对于程序员来说,理解这些规则和习惯写法非常的重要. 这篇文章让所 ...
- CSS中强悍的相对单位之em(em-and-elastic-layouts)学习小记
使用相对单位em注意点 1.浏览器默认字体是16px,即1em = 16px,根元素设置如下 html{ font-size: 100%; /* WinIE text resize correctio ...
- Html 制作相册
本文主要讲述采用Html5+jQuery+CSS 制作相册的小小记录. 主要功能点: Html5进行布局 调用jQuery(借用官网的一句话:The Write Less, Do More)极大的简化 ...
- BPM配置故事之案例2-文本默认值
Boss感觉方便了很多,然而采购部采购员阿海却还是有点意见,他跑来找小明. 阿海:现在申请都是我在提交,申请人和申请部门能不能不要每次都要填写啊,好麻烦的. 小明:没问题,这个简单. 小明在表单中把申 ...
- SQL字符串函数
LEN() :计算字符串长度(字符的个数.)datalength();//计算字符串所占用的字节数,不属于字符串函数.测试varchar变量与nvarchar变量存储字符串a的区别.见备注1.LOWE ...