如题,不知道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. WPF自学入门(十二)WPF MVVM模式提取函数

    我们平时在写代码时为了不重复写代码,会进行复制代码或者写通用方法.今天我们就来把上传做的函数提取成为通用的方法调用.把上次写的函数提取为两个主要的文件:ObserableObject和RelayCom ...

  2. 解决亚马逊云服务器上安装nginx后无法访问的问题

    在亚马逊云服务器上装了Ubuntu系统,使用docker环境搭建nginx,启动nginx容器后,在浏览器输入地址后,显示连接超时. 在网上查了一下说有可能是服务器安全组的设置问题 然后在云服务器的安 ...

  3. 监控MySQL服务器主从同步异常的脚本,出现异常,报警

    监控主从复制的指标有: Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0 (从服务器与主服务器延时多少秒) # ...

  4. JPEG图像压缩算法流程详解

    JPEG图像压缩算法流程详解 JPEG代表Joint Photographic Experts Group(联合图像专家小组).此团队创立于1986年,1992年发布了JPEG的标准而在1994年获得 ...

  5. pxe前期网络准备

    核心交换机:[H3C12510-HEXIN]vlan 3010 //如果存在则不需要创建[H3C12510-HEXIN]dis interface Bridge-Aggregation brief / ...

  6. excel文件怎么使用php进行处理

    1.可以通过phpmyadmin导入csv文件 2.也可以直接使用php 处理已经将excel另存为.csv后缀的文件, 通过php专门处理csv文件的函数 如 fgetcsv() <?php ...

  7. BZOJ2186 SDOI2008沙拉公主的困惑(数论)

    由于n!是m!的倍数,而对于每个与m!互质且小于m!的数x,x+m!.x+2*m!……也与其互质,所以答案即为(n!/m!)*φ(m!). φ(m!)=m!*∏(1-1/pi).其中的pi即为1~m中 ...

  8. BZOJ 2337 XOR和路径 | 高斯消元 期望 位运算

    BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这 ...

  9. 洛谷 P4363 [九省联考2018]一双木棋chess 解题报告

    P4363 [九省联考2018]一双木棋chess 题目描述 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落 ...

  10. 面向对象高级编程(1)-使用__slots__

    使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> ...