如题,不知道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. url 地址含参数较多如何拼接

    url 地址拼接是经常会遇到的问题.所以必须要掌握这个技术 1.合并参数对象,循环出来. var commonParams = { g_tk: 1928093487, inCharset: 'utf- ...

  2. cmd命令行安装,删除Windows证书(certgmr的简单使用)

    在管理证书的时候需要用到certmgr工具. 在cmd中执行certmgr会弹出证书管理的工具,但是不能用命令行去管理证书,需要额外的工具 cermgr.exe:下载链接 https://pan.ba ...

  3. syntax error:unexpected end of file

    将window上编辑的xxy1.sh脚本上传到linux上,并执行的时候提示 xxy1.sh: line 17: syntax error: unexpected end of file 但是通过ca ...

  4. 虚拟机VMware中的CentOS字符界面和图形界面切换

    在虚拟机中安装CentOS后展示的界面是图形用户界面,想切换到命令模式,于是查了linux下切换模式的方法,可是按了ctrl+alt+f1.f2....f7都是没用,后来发现是因为按键冲突的原因 问题 ...

  5. yii 验证码 CCaptcha的总结(转)

    今天用到yii的验证码 ccaptcha,经过在网上搜寻 找到以下例子: 1.在controller中加入代码 (1)启用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 &l ...

  6. HttpURLConnection、HttpClient和Session

    原文地址:http://www.cnblogs.com/kross/p/3615695.html 一直没弄懂Session,cookies什么的登陆验证到底是怎么回事,昨天分别用HttpURLConn ...

  7. STM32CubeMX介绍、下载与安装

    一.简介 STM32CubeMX是一个配置STM32代码的工具,它把很多东西封装的比较好,硬件抽象层.中间层.示例代码等.现在ST公司升级和维护的库主要就是STM32CubeMX的HAL库和标准外设库 ...

  8. python自动化之时间

    cxz##############################现在时间######################### import time time.time() ############# ...

  9. 【比赛】NOIP2017 宝藏

    这道题考试的时候就骗了部分分.其实一眼看过去,n范围12,就知道是状压,但是不知道怎么状压,想了5分钟想不出来就枪毙了状压,与AC再见了. 现在写的是状压搜索,其实算是哈希搜索,感觉状压DP理解不了啊 ...

  10. USACO Section 1.5 Prime Palindromes 解题报告

    题目 题目描述 题目就是给定一个区间[a,b]((5 <= a < b <= 100,000,000)),我们需要找到这个区间内所有既是回文串又是素数的数字. 输入样例 5 500 ...