SHA算法的实现.docx

上传人:b****4 文档编号:4223426 上传时间:2023-05-06 格式:DOCX 页数:17 大小:54.15KB
下载 相关 举报
SHA算法的实现.docx_第1页
第1页 / 共17页
SHA算法的实现.docx_第2页
第2页 / 共17页
SHA算法的实现.docx_第3页
第3页 / 共17页
SHA算法的实现.docx_第4页
第4页 / 共17页
SHA算法的实现.docx_第5页
第5页 / 共17页
SHA算法的实现.docx_第6页
第6页 / 共17页
SHA算法的实现.docx_第7页
第7页 / 共17页
SHA算法的实现.docx_第8页
第8页 / 共17页
SHA算法的实现.docx_第9页
第9页 / 共17页
SHA算法的实现.docx_第10页
第10页 / 共17页
SHA算法的实现.docx_第11页
第11页 / 共17页
SHA算法的实现.docx_第12页
第12页 / 共17页
SHA算法的实现.docx_第13页
第13页 / 共17页
SHA算法的实现.docx_第14页
第14页 / 共17页
SHA算法的实现.docx_第15页
第15页 / 共17页
SHA算法的实现.docx_第16页
第16页 / 共17页
SHA算法的实现.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

SHA算法的实现.docx

《SHA算法的实现.docx》由会员分享,可在线阅读,更多相关《SHA算法的实现.docx(17页珍藏版)》请在冰点文库上搜索。

SHA算法的实现.docx

SHA算法的实现

SHA算法的实现

C语言程序:

#include

#include//定义vector数组

#include//记录消息

usingnamespacestd;

constintNUM=8;//一个字由32比特(或者8个16进制数)

constintBIT=512;//消息认证码要以512比特一组

//字常量

stringH0="67452301";

stringH1="EFCDAB89";

stringH2="98BADCFE";

stringH3="10325476";

stringH4="C3D2E1F0";

//定义SHA1(安全哈希算法)类

classSHA1

{

public:

//将一个字符串形式的字转化为vector数组

vectorhex_into_dec(stringword);

//将vector转化为string字符串形式

stringnum_into_message(vectorA);

//两个字X和Y的逻辑"和"

vectorword_AND(vectorA,vectorB);

//两个字X和Y的逻辑"或"

vectorword_OR(vectorA,vectorB);

//两个字X和Y的逻辑"异或"

vectorword_XOR(vectorA,vectorB);

//两个字X和Y的逻辑"补"

vectorword_COMPLEMENT(vectorA);

//两个字X和Y的摸2^32整数加

vectorword_ADD(vectorA,vectorB);

//将字X循环左移s个位置

vectorROTL(vectorA,ints);

//SHA-1的填充方案,我们设定msg由ASCII码组成

vector>SHA_1_PAD(stringmsg);

//将SHA-1压成以字为单位

vector>>compress(vector>result);

//定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出

vectorFt(intt,vectorB,vectorC,vectorD);

//定义字常数K

vectorK(intt);

//开始进行SHA-1(安全Hash算法)的加密

vector>SHA_1(stringmsg);

};

//将vector转化为string字符串形式

stringSHA1:

:

num_into_message(vectorA)

{

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数组

vectorSHA1:

:

hex_into_dec(stringword)

{

inti;

vectorresult(NUM,0);

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的逻辑"和"

vectorSHA1:

:

word_AND(vectorA,vectorB)

{

vectorresult(NUM,0);

inti;

for(i=0;i

{

result[i]=A[i]&B[i];

}

returnresult;

}

//两个字X和Y的逻辑"或"

vectorSHA1:

:

word_OR(vectorA,vectorB)

{

vectorresult(NUM,0);

inti;

for(i=0;i

{

result[i]=A[i]|B[i];

}

returnresult;

}

//两个字X和Y的逻辑"异或"

vectorSHA1:

:

word_XOR(vectorA,vectorB)

{

vectorresult(NUM,0);

inti;

for(i=0;i

{

result[i]=A[i]^B[i];

}

returnresult;

}

//两个字X和Y的逻辑"补"

vectorSHA1:

:

word_COMPLEMENT(vectorA)

{

vectorresult(NUM,0);

inti;

for(i=0;i

{

result[i]=15-A[i];

}

returnresult;

}

//两个字X和Y的摸2^32整数加

vectorSHA1:

:

word_ADD(vectorA,vectorB)

{

vectorresult(NUM,0);

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个位置

vectorSHA1:

:

ROTL(vectorA,ints)

{

vectorresult=A;

vectortemp(NUM,0);

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>SHA1:

:

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;

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>>SHA1:

:

compress(vector>result)

{

vector>rr;

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;

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三个字作为输入,并产生一个字作为输出

vectorSHA1:

:

Ft(intt,vectorB,vectorC,vectorD)

{

vectorresult;

if(t>=0&&t<=19)

{

vectora1=word_AND(B,C);

vectora2=word_AND(word_COMPLEMENT(B),D);

result=word_OR(a1,a2);

}

elseif((t>=20&&t<=39)||(t>=60&&t<=79))

{

vectora1=word_XOR(B,C);

result=word_XOR(a1,D);

}

elseif(t>=40&&t<=59)

{

vectora1=word_AND(B,C);

vectora2=word_AND(B,D);

vectora3=word_AND(C,D);

vectora4=word_OR(a1,a2);

result=word_OR(a4,a3);

}

returnresult;

}

//定义字常数K

vectorSHA1:

:

K(intt)

{

vectorresult;

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>SHA1:

:

SHA_1(stringmsg)

{

vectorh0=hex_into_dec(H0);

vectorh1=hex_into_dec(H1);

vectorh2=hex_into_dec(H2);

vectorh3=hex_into_dec(H3);

vectorh4=hex_into_dec(H4);

vector>result1=SHA_1_PAD(msg);

vector>>result2=compress(result1);

intn=result2.size();

inti,j;

for(i=0;i

{

vector>W;

W.resize(80);

for(j=0;j<16;j++)

{

W[j]=result2[i][j];

}

for(j=16;j<80;j++)

{

vectora1=word_XOR(W[j-3],W[j-8]);

vectora2=word_XOR(a1,W[j-14]);

vectora3=word_XOR(a2,W[j-16]);

W[j]=ROTL(a3,1);

}

//将string转化为vector数组

vectorA=hex_into_dec(H0);

vectorB=hex_into_dec(H1);

vectorC=hex_into_dec(H2);

vectorD=hex_into_dec(H3);

vectorE=hex_into_dec(H4);

for(j=0;j<80;j++)

{

vectora1=ROTL(A,5);

vectora2=Ft(j,B,C,D);

vectora3=word_ADD(a1,a2);

vectora4=word_ADD(a3,E);

vectora5=word_ADD(a4,W[j]);

vectortemp=word_ADD(a5,K(j));

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;

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;

result=sha1.SHA_1(message);

cout<<"消息为:

"<

cout<<"利用填充方案SHA-1-PAD给出对消息的填充,得出SHA-1(x)得:

"<

inti;

for(i=0;i

{

cout<

}

cout<

return0;

}

程序运行结果:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2