SHA算法的实现.docx
《SHA算法的实现.docx》由会员分享,可在线阅读,更多相关《SHA算法的实现.docx(17页珍藏版)》请在冰点文库上搜索。
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(jresult[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;
}
程序运行结果: