SHA算法的实现Word文档格式.docx
《SHA算法的实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《SHA算法的实现Word文档格式.docx(17页珍藏版)》请在冰点文库上搜索。
public:
//将一个字符串形式的字转化为vector数组
vector<
int>
hex_into_dec(stringword);
//将vector转化为string字符串形式
stringnum_into_message(vector<
A);
//两个字X和Y的逻辑"
和"
word_AND(vector<
A,vector<
B);
或"
word_OR(vector<
异或"
word_XOR(vector<
补"
word_COMPLEMENT(vector<
//两个字X和Y的摸2^32整数加
word_ADD(vector<
//将字X循环左移s个位置
ROTL(vector<
A,ints);
//SHA-1的填充方案,我们设定msg由ASCII码组成
vector<
>
SHA_1_PAD(stringmsg);
//将SHA-1压成以字为单位
compress(vector<
result);
//定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出
Ft(intt,vector<
B,vector<
C,vector<
D);
//定义字常数K
K(intt);
//开始进行SHA-1(安全Hash算法)的加密
SHA_1(stringmsg);
};
stringSHA1:
:
num_into_message(vector<
A)
inti;
stringmsg="
"
for(i=0;
i<
A.size();
i++)
if(A[i]>
=0&
&
A[i]<
=9)
msg+='
0'
+A[i];
elseif(A[i]>
=10&
=15)
A'
+(A[i]-10);
}
returnmsg;
SHA1:
hex_into_dec(stringword)
result(NUM,0);
NUM;
if(word[i]>
='
&
word[i]<
9'
)
result[i]=word[i]-'
elseif(word[i]>
F'
result[i]=10+word[i]-'
returnresult;
word_AND(vector<
B)
result[i]=A[i]&
B[i];
word_OR(vector<
result[i]=A[i]|B[i];
word_XOR(vector<
result[i]=A[i]^B[i];
word_COMPLEMENT(vector<
result[i]=15-A[i];
word_ADD(vector<
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;
ROTL(vector<
A,ints)
result=A;
temp(NUM,0);
inti,j;
s;
for(j=NUM-1;
j>
j--)
if(result[j]/8>
=1)
temp[j]=1;
result[j]<
<
=1;
result[j]%=16;
if(j<
NUM-1)
result[j]+=temp[j+1];
elseif(result[j]/8==0)
temp[j]=0;
result[NUM-1]+=temp[0];
}
SHA_1_PAD(stringmsg)
intlen=msg.length();
intbit_num=len*8;
intnum,lest=bit_num%512;
if(lest!
=0)//看消息长度是否超过512字节,我们需要将它补成512的倍数
num=bit_num/512+1;
else
num=bit_num/512;
//首先我们以8位字节为一组保存到vector里面,512比特为一组,即一组里面有64位元素
result;
result.resize(num);
num;
result[i].resize(64);
for(j=0;
j<
64&
i*64+j<
len;
j++)
result[i][j]=msg[i*64+j];
//下面开始为未够512比特的消息分组进行补长度操作
=0){
intx=num-1,last_len=lest/8;
result[x][last_len]=128;
//先补一个"
1"
for(i=last_len+1;
56;
result[x][i]=0;
intlast_l=lest;
j=63;
while(j>
=56)
result[x][j]=last_l%128;
last_l/=128;
j--;
//将SHA-1压成以字为单位(三维数组有点复杂)
compress(vector<
result)
rr;
rr.resize(result.size());
rr.size();
rr[i].resize(128);
result.size();
result[i].size();
rr[i][2*j]=result[i][j]/16;
rr[i][2*j+1]=result[i][j]%16;
rrr;
rrr.resize(result.size());
rrr.size();
rrr[i].resize(16);
16;
rrr[i][j].resize(8);
rr[i].size();
rrr[i][j/8][j%8]=rr[i][j];
returnrrr;
Ft(intt,vector<
D)
if(t>
t<
=19)
a1=word_AND(B,C);
a2=word_AND(word_COMPLEMENT(B),D);
result=word_OR(a1,a2);
elseif((t>
=20&
=39)||(t>
=60&
=79))
a1=word_XOR(B,C);
result=word_XOR(a1,D);
elseif(t>
=40&
=59)
a2=word_AND(B,D);
a3=word_AND(C,D);
a4=word_OR(a1,a2);
result=word_OR(a4,a3);
K(intt)
result=hex_into_dec("
5A827999"
);
=39)
6ED9EBA1"
8F1BBCDC"
=79)
CA62C1D6"
SHA_1(stringmsg)
h0=hex_into_dec(H0);
h1=hex_into_dec(H1);
h2=hex_into_dec(H2);
h3=hex_into_dec(H3);
h4=hex_into_dec(H4);
result1=SHA_1_PAD(msg);
result2=compress(result1);
intn=result2.size();
n;
W;
W.resize(80);
W[j]=result2[i][j];
for(j=16;
80;
a1=word_XOR(W[j-3],W[j-8]);
a2=word_XOR(a1,W[j-14]);
a3=word_XOR(a2,W[j-16]);
W[j]=ROTL(a3,1);
//将string转化为vector数组
A=hex_into_dec(H0);
B=hex_into_dec(H1);
C=hex_into_dec(H2);
D=hex_into_dec(H3);
E=hex_into_dec(H4);
a1=ROTL(A,5);
a2=Ft(j,B,C,D);
a3=word_ADD(a1,a2);
a4=word_ADD(a3,E);
a5=word_ADD(a4,W[j]);
temp=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)
result.push_back(h0);
result.push_back(h1);
result.push_back(h2);
result.push_back(h3);
result.push_back(h4);
intmain()
SHA1sha1;
//定义SHA1算法类
stringmessage="
cryptographyisthepracticeandstudyoftechniquesforsecurecommunicationinthepresenceofthirdpartiesmoregenerallyitisaboutconstructingandanalyzingprotocolsthatovercometheinfluenceofadversariesandwhicharerelatedtovariousaspectsininformationsecuritysuchasdataconfidentialitydataintegrityauthenticationandnonrepudiationmoderncryptographyintersectsthedisciplinesofmathematicscomputerscienceandelectricalengineeringapplicationsofcryptographyincludeATMcardscomputerpasswordsandelectroniccommerce"
result=sha1.SHA_1(message);
cout<
"
消息为:
<
endl<
message<
endl;
利用填充方案SHA-1-PAD给出对消息的填充,得出SHA-1(x)得:
sha1.num_into_message(result[i]);
return0;
程序运行结果: