如题,不知道sha-1的自己百度吧。

 #include <iostream>
#include <vector> //定义vector数组
#include <string> //记录消息
using namespace std; const int NUM = ; //一个字由32比特(或者8个16进制数)
const int BIT = ; //消息认证码要以512比特一组 //字常量
string H0 = "";
string H1 = "EFCDAB89";
string H2 = "98BADCFE";
string H3 = "";
string H4 = "C3D2E1F0"; //定义SHA1(安全哈希算法)类
class SHA1
{
public:
//将一个字符串形式的字转化为vector数组
vector<int> hex_into_dec(string word); //将vector转化为string字符串形式
string num_into_message(vector<int> A); //两个字X和Y的逻辑"和"
vector<int> word_AND(vector<int> A,vector<int> B); //两个字X和Y的逻辑"或"
vector<int> word_OR(vector<int> A,vector<int> B); //两个字X和Y的逻辑"异或"
vector<int> word_XOR(vector<int> A,vector<int> B); //两个字X和Y的逻辑"补"
vector<int> word_COMPLEMENT(vector<int> A); //两个字X和Y的摸2^32整数加
vector<int> word_ADD(vector<int> A,vector<int> B); //将字X循环左移s个位置
vector<int> ROTL(vector<int> A,int s); //SHA-1的填充方案,我们设定msg由ASCII码组成
vector<vector<int> > SHA_1_PAD(string msg); //将SHA-1压成以字为单位
vector<vector<vector<int> > > compress(vector<vector<int> > result); //定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出
vector<int> Ft(int t,vector<int> B,vector<int> C,vector<int> D); //定义字常数K
vector<int> K(int t); //开始进行SHA-1(安全Hash算法)的加密
vector<vector<int> > SHA_1(string msg); }; //将vector转化为string字符串形式
string SHA1::num_into_message(vector<int> A)
{
int i;
string msg = "";
for(i = ;i < A.size();i++)
{
if(A[i] >= && A[i] <= )
msg += '' + A[i];
else if(A[i] >= && A[i] <= )
msg += 'A' + (A[i] - );
}
return msg;
} //将一个字符串形式的字转化为vector数组
vector<int> SHA1::hex_into_dec(string word)
{
int i;
vector<int> result(NUM,);
for(i = ;i < NUM;i++)
{
if(word[i] >= '' && word[i] <= '')
{
result[i] = word[i] - '';
}
else if(word[i] >= 'A' && word[i] <= 'F')
{
result[i] = + word[i] - 'A';
}
}
return result;
} //两个字X和Y的逻辑"和"
vector<int> SHA1::word_AND(vector<int> A,vector<int> B)
{
vector<int> result(NUM,);
int i;
for(i = ;i < NUM;i++)
{
result[i] = A[i] & B[i];
}
return result;
} //两个字X和Y的逻辑"或"
vector<int> SHA1::word_OR(vector<int> A,vector<int> B)
{
vector<int> result(NUM,);
int i;
for(i = ;i < NUM;i++)
{
result[i] = A[i] | B[i];
}
return result;
} //两个字X和Y的逻辑"异或"
vector<int> SHA1::word_XOR(vector<int> A,vector<int> B)
{
vector<int> result(NUM,);
int i;
for(i = ;i < NUM;i++)
{
result[i] = A[i] ^ B[i];
}
return result;
} //两个字X和Y的逻辑"补"
vector<int> SHA1::word_COMPLEMENT(vector<int> A)
{
vector<int> result(NUM,);
int i;
for(i = ;i < NUM;i++)
{
result[i] = - A[i];
}
return result;
} //两个字X和Y的摸2^32整数加
vector<int> SHA1::word_ADD(vector<int> A,vector<int> B)
{
vector<int> result(NUM,);
int i;
for(i = NUM - ;i >= ;i--)
{
result[i] = A[i] + B[i];
if(i != )
{
int temp = result[i] / ;
result[i-] += temp;
}
result[i] %= ;
}
return result;
} //将字X循环左移s个位置
vector<int> SHA1::ROTL(vector<int> A,int s)
{
vector<int> result = A;
vector<int> temp(NUM,);
int i,j;
for(i = ;i < s;i++)
{
for(j = NUM - ;j >= ;j--)
{
if(result[j] / >= )
{
temp[j] = ;
result[j] <<= ;
result[j] %= ;
if(j < NUM - )
result[j] += temp[j + ];
}
else if(result[j] / == )
{
temp[j] = ;
result[j] <<= ;
result[j] %= ;
}
}
result[NUM - ] += temp[];
}
return result;
} //SHA-1的填充方案,我们设定msg由ASCII码组成
vector<vector<int> > SHA1::SHA_1_PAD(string msg)
{
int len = msg.length();
int bit_num = len * ;
int i,j;
int num,lest = bit_num % ;
if(lest != ) //看消息长度是否超过512字节,我们需要将它补成512的倍数
num = bit_num / + ;
else
num = bit_num / ;
//首先我们以8位字节为一组保存到vector里面,512比特为一组,即一组里面有64位元素
vector<vector<int> > result;
result.resize(num);
for(i = ;i < num;i++)
{
result[i].resize();
}
for(i = ;i < num;i++)
{
for(j = ;j < && i * + j < len;j++)
{
result[i][j] = msg[i * + j];
}
}
//下面开始为未够512比特的消息分组进行补长度操作
if(lest != ){
int x = num - ,last_len = lest / ;
result[x][last_len] = ; //先补一个"1"
for(i = last_len + ;i < ;i++)
{
result[x][i] = ;
}
int last_l = lest;
j = ;
while(j >= )
{
result[x][j] = last_l % ;
last_l /= ;
j--;
}
}
return result;
} //将SHA-1压成以字为单位(三维数组有点复杂)
vector<vector<vector<int> > > SHA1::compress(vector<vector<int> > result)
{
vector<vector<int> > rr;
rr.resize(result.size());
int i,j;
for(i = ;i < rr.size();i++)
{
rr[i].resize();
}
for(i = ;i < result.size();i++)
{
for(j = ;j < result[i].size();j++)
{
rr[i][ * j] = result[i][j] / ;
rr[i][ * j + ] = result[i][j] % ;
}
}
vector<vector<vector<int> > > rrr;
rrr.resize(result.size());
for(i = ;i < rrr.size();i++)
{
rrr[i].resize();
}
for(i = ;i < rrr.size();i++)
{
for(j = ;j < ;j++)
{
rrr[i][j].resize();
}
}
for(i = ;i < rr.size();i++)
{
for(j = ;j < rr[i].size();j++)
{
rrr[i][j / ][j % ] = rr[i][j];
}
}
return rrr;
} //定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出
vector<int> SHA1::Ft(int t,vector<int> B,vector<int> C,vector<int> D)
{
vector<int> result;
if(t >= && t <= )
{
vector<int> a1 = word_AND(B,C);
vector<int> a2 = word_AND(word_COMPLEMENT(B),D);
result = word_OR(a1,a2);
}
else if((t >= && t <= ) || (t >= && t <= ))
{
vector<int> a1 = word_XOR(B,C);
result = word_XOR(a1,D);
}
else if(t >= && t <= )
{
vector<int> a1 = word_AND(B,C);
vector<int> a2 = word_AND(B,D);
vector<int> a3 = word_AND(C,D);
vector<int> a4 = word_OR(a1,a2);
result = word_OR(a4,a3);
}
return result;
} //定义字常数K
vector<int> SHA1::K(int t)
{
vector<int> result;
if(t >= && t <= )
{
result = hex_into_dec("5A827999");
}
else if(t >= && t <= )
{
result = hex_into_dec("6ED9EBA1");
}
else if(t >= && t <= )
{
result = hex_into_dec("8F1BBCDC");
}
else if(t >= && t <= )
{
result = hex_into_dec("CA62C1D6");
}
return result;
} //开始进行SHA-1(安全Hash算法)的加密
vector<vector<int> > SHA1::SHA_1(string msg)
{
vector<int> h0 = hex_into_dec(H0);
vector<int> h1 = hex_into_dec(H1);
vector<int> h2 = hex_into_dec(H2);
vector<int> h3 = hex_into_dec(H3);
vector<int> h4 = hex_into_dec(H4); vector<vector<int> > result1 = SHA_1_PAD(msg);
vector<vector<vector<int> > > result2 = compress(result1);
int n = result2.size();
int i,j;
for(i = ;i < n;i++)
{
vector<vector<int> > W;
W.resize();
for(j = ;j < ;j++)
{
W[j] = result2[i][j];
}
for(j = ;j < ;j++)
{
vector<int> a1 = word_XOR(W[j-],W[j-]);
vector<int> a2 = word_XOR(a1,W[j-]);
vector<int> a3 = word_XOR(a2,W[j-]);
W[j] = ROTL(a3,);
} //将string转化为vector数组
vector<int> A = hex_into_dec(H0);
vector<int> B = hex_into_dec(H1);
vector<int> C = hex_into_dec(H2);
vector<int> D = hex_into_dec(H3);
vector<int> E = hex_into_dec(H4); for(j = ;j < ;j++)
{
vector<int> a1 = ROTL(A,);
vector<int> a2 = Ft(j,B,C,D);
vector<int> a3 = word_ADD(a1,a2);
vector<int> a4 = word_ADD(a3,E);
vector<int> a5 = word_ADD(a4,W[j]);
vector<int> temp = word_ADD(a5,K(j));
E = D;
D = C;
C = ROTL(B,);
B = A;
A = temp;
} h0 = word_ADD(h0,A);
h1 = word_ADD(h1,B);
h2 = word_ADD(h2,C);
h3 = word_ADD(h3,D);
h4 = word_ADD(h4,E);
} //返回结果(H0||H1||H2||H3||H4)
vector<vector<int> > result;
result.push_back(h0);
result.push_back(h1);
result.push_back(h2);
result.push_back(h3);
result.push_back(h4); return result;
} int main()
{
SHA1 sha1; //定义SHA1算法类
string message = "cryptographyisthepracticeandstudyoftechniquesforsecurecommunicationinthepresenceofthirdpartiesmoregenerallyitisaboutconstructingandanalyzingprotocolsthatovercometheinfluenceofadversariesandwhicharerelatedtovariousaspectsininformationsecuritysuchasdataconfidentialitydataintegrityauthenticationandnonrepudiationmoderncryptographyintersectsthedisciplinesofmathematicscomputerscienceandelectricalengineeringapplicationsofcryptographyincludeATMcardscomputerpasswordsandelectroniccommerce";
vector<vector<int> > result;
result = sha1.SHA_1(message);
cout << "消息为:" << endl << message << endl;
cout << "利用填充方案SHA-1-PAD给出对消息的填充,得出SHA-1(x)得:" << endl;
int i;
for(i = ;i < result.size();i++)
{
cout << sha1.num_into_message(result[i]);
}
cout << endl;
return ;
}

就这样,请多多指教!

SHA-1(安全哈希算法实现)的更多相关文章

  1. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

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

    .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上 ...

  3. openssl evp 哈希算法(md5,sha1,sha256)

    1. 简述 openssl提供了丰富密码学工具,一些常用的哈希算法 比如md5,sha 可以直接用提供的md5.h ,sha.h 接口使用: 为了方便开发者使用,openssl 又提供了一个EVP, ...

  4. os常用模块,json,pickle,shelve模块,正则表达式(实现运算符分离),logging模块,配置模块,路径叠加,哈希算法

    一.os常用模块 显示当前工作目录 print(os.getcwd()) 返回上一层目录 os.chdir("..") 创建文件包 os.makedirs('python2/bin ...

  5. java-信息安全(一)-BASE64,MD5,SHA,HMAC,RIPEMD算法

    概述 信息安全基本概念: BASE64 编码格式 Base58 编码 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm, ...

  6. [基础技能] 安全技术——哈希算法密码破解之彩虹表(Rainbow Table)学习

    1.基础知识 刚刚学习过数字签名的相关知识,以及数字签名的伪造技术,而伪造数字签名归根结底就是密码破解的一个过程,然而直接破解的速度是非常缓慢的,所以有人想出一种办法,直接建立出一个数据文件,里面事先 ...

  7. 一致性哈希算法与Java实现

    原文:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  8. 五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...

  9. 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  10. C# MD5摘要算法、哈希算法

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法) MD5算法具有以下特点: 1.压缩 ...

随机推荐

  1. Delphi 使用TAdoQuery执行存储过程的样例

    procedure TCustomerForm.FindCustomerInfo;var  strSql:string;begin //  BL_HV_FindCustomerInfo 存储过程的名称 ...

  2. try…catch 结构

    try…catch 结构 一旦发生错误,程序就中止执行了.JavaScript 提供了try...catch结构,允许对错误进行处理,选择是否往下执行. try { throw new Error(' ...

  3. token是干啥子的

    http://www.cnblogs.com/wweichao/p/9325668.html 在上面这篇博客中,我们知道了通过weibo提供的一系列接口,我们可以实现登录,然后也有了token,可以获 ...

  4. 笔记:delphi 与 Query

    以下不保存证正确 Query用SQL语言执行过的,没有必要Cancel.Post,因为其会对数据库直接操作:执行Update.Insert.Delete请用SQL语句: 用Table使用对当前记录直接 ...

  5. java 加载过程

    1.main方法进入方法区 2.main方法进栈 3.调用xxx类加载到jvm中 类属性进入数据共享区,方法进入到方法区

  6. BZOJ5319 JSOI2018列队(主席树)

    显然集合后相对位置不变最优.主席树上二分向左和向右的分界点即可.注意主席树的值域.我怎么天天就写点一眼题啊. #include<iostream> #include<cstdio&g ...

  7. 【刷题】BZOJ 2049 [Sdoi2008]Cave 洞穴勘测

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...

  8. 【刷题】BZOJ 2588 Spoj 10628. Count on a tree

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

  9. 【scala】2.控制结构和函数

    简介 在Java或者C++中,我们把表达式和语句看做两种不同的东西.表达式有值,而语句执行动作. 在Scala中,几乎所有构造出来的语法结构都是有值的.这个特性使得程序更加的精简,也更易读. 1.条件 ...

  10. Counting

    Description ​ 数学老师走啦,英语老师来上课啦 ​ 他的性格与众不同,又因为大家都是理科班的学生 ​ 他希望大家在数字母的过程中领悟英语的快乐 ​ 他用m种字母进行排列组合, ​ 得到了所 ...