SHA算法的实现.docx
- 文档编号:10526945
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:17
- 大小:54.15KB
SHA算法的实现.docx
《SHA算法的实现.docx》由会员分享,可在线阅读,更多相关《SHA算法的实现.docx(17页珍藏版)》请在冰豆网上搜索。
SHA算法的实现
SHA算法的实现
C语言程序:
#include
#include
#include
usingnamespacestd;
constintNUM=8;//一个字由32比特(或者8个16进制数)
constintBIT=512;//消息认证码要以512比特一组
//字常量
stringH0="67452301";
stringH1="EFCDAB89";
stringH2="98BADCFE";
stringH3="10325476";
stringH4="C3D2E1F0";
//定义SHA1(安全哈希算法)类
classSHA1
{
public:
//将一个字符串形式的字转化为vector数组
vector
//将vector转化为string字符串形式
stringnum_into_message(vector
//两个字X和Y的逻辑"和"
vector
//两个字X和Y的逻辑"或"
vector
//两个字X和Y的逻辑"异或"
vector
//两个字X和Y的逻辑"补"
vector
//两个字X和Y的摸2^32整数加
vector
//将字X循环左移s个位置
vector
//SHA-1的填充方案,我们设定msg由ASCII码组成
vector
//将SHA-1压成以字为单位
vector
//定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出
vector
//定义字常数K
vector
//开始进行SHA-1(安全Hash算法)的加密
vector
};
//将vector转化为string字符串形式
stringSHA1:
:
num_into_message(vector
{
inti;
stringmsg="";
for(i=0;i { if(A[i]>=0&&A[i]<=9) msg+='0'+A[i]; elseif(A[i]>=10&&A[i]<=15) msg+='A'+(A[i]-10); } returnmsg; } //将一个字符串形式的字转化为vector数组 vector : hex_into_dec(stringword) { inti; vector for(i=0;i { if(word[i]>='0'&&word[i]<='9') { result[i]=word[i]-'0'; } elseif(word[i]>='A'&&word[i]<='F') { result[i]=10+word[i]-'A'; } } returnresult; } //两个字X和Y的逻辑"和" vector : word_AND(vector { vector inti; for(i=0;i { result[i]=A[i]&B[i]; } returnresult; } //两个字X和Y的逻辑"或" vector : word_OR(vector { vector inti; for(i=0;i { result[i]=A[i]|B[i]; } returnresult; } //两个字X和Y的逻辑"异或" vector : word_XOR(vector { vector inti; for(i=0;i { result[i]=A[i]^B[i]; } returnresult; } //两个字X和Y的逻辑"补" vector : word_COMPLEMENT(vector { vector inti; for(i=0;i { result[i]=15-A[i]; } returnresult; } //两个字X和Y的摸2^32整数加 vector : word_ADD(vector { vector inti; for(i=NUM-1;i>=0;i--) { result[i]=A[i]+B[i]; if(i! =0) { inttemp=result[i]/16; result[i-1]+=temp; } result[i]%=16; } returnresult; } //将字X循环左移s个位置 vector : ROTL(vector { vector vector inti,j; for(i=0;i { for(j=NUM-1;j>=0;j--) { if(result[j]/8>=1) { temp[j]=1; result[j]<<=1; result[j]%=16; if(j result[j]+=temp[j+1]; } elseif(result[j]/8==0) { temp[j]=0; result[j]<<=1; result[j]%=16; } } result[NUM-1]+=temp[0]; } returnresult; } //SHA-1的填充方案,我们设定msg由ASCII码组成 vector : SHA_1_PAD(stringmsg) { intlen=msg.length(); intbit_num=len*8; inti,j; intnum,lest=bit_num%512; if(lest! =0)//看消息长度是否超过512字节,我们需要将它补成512的倍数 num=bit_num/512+1; else num=bit_num/512; //首先我们以8位字节为一组保存到vector里面,512比特为一组,即一组里面有64位元素 vector result.resize(num); for(i=0;i { result[i].resize(64); } for(i=0;i { for(j=0;j<64&&i*64+j { result[i][j]=msg[i*64+j]; } } //下面开始为未够512比特的消息分组进行补长度操作 if(lest! =0){ intx=num-1,last_len=lest/8; result[x][last_len]=128;//先补一个"1" for(i=last_len+1;i<56;i++) { result[x][i]=0; } intlast_l=lest; j=63; while(j>=56) { result[x][j]=last_l%128; last_l/=128; j--; } } returnresult; } //将SHA-1压成以字为单位(三维数组有点复杂) vector : compress(vector { vector rr.resize(result.size()); inti,j; for(i=0;i { rr[i].resize(128); } for(i=0;i { for(j=0;j { rr[i][2*j]=result[i][j]/16; rr[i][2*j+1]=result[i][j]%16; } } vector rrr.resize(result.size()); for(i=0;i { rrr[i].resize(16); } for(i=0;i { for(j=0;j<16;j++) { rrr[i][j].resize(8); } } for(i=0;i { for(j=0;j { rrr[i][j/8][j%8]=rr[i][j]; } } returnrrr; } //定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出 vector : Ft(intt,vector { vector if(t>=0&&t<=19) { vector vector result=word_OR(a1,a2); } elseif((t>=20&&t<=39)||(t>=60&&t<=79)) { vector result=word_XOR(a1,D); } elseif(t>=40&&t<=59) { vector vector vector vector result=word_OR(a4,a3); } returnresult; } //定义字常数K vector : K(intt) { vector if(t>=0&&t<=19) { result=hex_into_dec("5A827999"); } elseif(t>=20&&t<=39) { result=hex_into_dec("6ED9EBA1"); } elseif(t>=40&&t<=59) { result=hex_into_dec("8F1BBCDC"); } elseif(t>=60&&t<=79) { result=hex_into_dec("CA62C1D6"); } returnresult; } //开始进行SHA-1(安全Hash算法)的加密 vector : SHA_1(stringmsg) { vector vector vector vector vector vector vector intn=result2.size(); inti,j; for(i=0;i { vector W.resize(80); for(j=0;j<16;j++) { W[j]=result2[i][j]; } for(j=16;j<80;j++) { vector vector vector W[j]=ROTL(a3,1); } //将string转化为vector数组 vector vector vector vector vector for(j=0;j<80;j++) { vector vector vector vector vector vector E=D; D=C; C=ROTL(B,30); 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 result.push_back(h0); result.push_back(h1); result.push_back(h2); result.push_back(h3); result.push_back(h4); returnresult; } intmain() { SHA1sha1;//定义SHA1算法类 stringmessage="cryptographyisthepracticeandstudyoftechniquesforsecurecommunicationinthepresenceofthirdpartiesmoregenerallyitisaboutconstructingandanalyzingprotocolsthatovercometheinfluenceofadversariesandwhicharerelatedtovariousaspectsininformationsecuritysuchasdataconfidentialitydataintegrityauthenticationandnonrepudiationmoderncryptographyintersectsthedisciplinesofmathematicscomputerscienceandelectricalengineeringapplicationsofcryptographyincludeATMcardscomputerpasswordsandelectroniccommerce"; vector result=sha1.SHA_1(message); cout<<"消息为: "< cout<<"利用填充方案SHA-1-PAD给出对消息的填充,得出SHA-1(x)得: "< inti; for(i=0;i { cout< } cout< return0; } 程序运行结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SHA 算法 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)