SM4算法PC源码.docx

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

SM4算法PC源码.docx

《SM4算法PC源码.docx》由会员分享,可在线阅读,更多相关《SM4算法PC源码.docx(13页珍藏版)》请在冰点文库上搜索。

SM4算法PC源码.docx

SM4算法PC源码

 

SM4算法实现

说明:

1、纯源码无库实现,编译环境:

VC++6,建立工程把程序文件加入编译即可

2、源码文件包括:

main.cpp,SM4.cpp

头文件:

SM4.h

 

该算法通过商用测试,下载后如果有使用问题联系QQ:

1900109344

源码SM4算法例程(main.cpp,SM4.cpp,SM4.h)

SM4.h

 

#defineKeyLenError0x01

#definePlainLenError0x02

intTt(constintpreS);

intTL(intB);

intTotherL(intB);

intT(intinput);

intTother(intinput);

voidExtand(intkey[],intextandKey[]);

intF(intX0,intX1,intX2,intX3,intrk);

voidconvertIntArray(unsignedcharinputData[],unsignedintunInputDataLen,intoutput[]);

voidconvertCharArray(intinput[],intlen,unsignedcharoutput[]);

voidR(intarray[]);

unsignedintSMS4_encrypt(unsignedcharkey[],unsignedintkeyLen,unsignedchar*inputData,unsignedintunInputDataLen,unsignedchar*outputData,unsignedint*outputDataLen);

unsignedintSMS4_decrypt(unsignedcharkey[],unsignedintkeyLen,unsignedchar*inputData,unsignedintunInputDataLen,unsignedchar*outputData,unsignedint*outputDataLen);

voidprint_Hex(unsignedchararray[],unsignedintlength);

Main.cpp

#include

#include

#include

#include

#include

#include

#include"SM4.h"

#defineTHREADCOUNT20

#defineTESTCOUNT100000

 

unsignedcharkey[]={0xB1,0x22,0xAD,0x0A,0x7A,0x36,0x2E,0xC3,0xAB,0xA1,0xDD,0xEF,0xB3,

0xAF,0x49,0x15};

unsignedintkeyLen=16;

unsignedcharinData[]={0x0B,0x0B,0x2B,0x4F,0x54,0x05,0xFE,0xF1,0xE8,0xA2,0x64,0xFC,

0x89,0xAB,0x21,0x0A};

unsignedintdataLen=16;

 

unsignedcharoutData[513]={0};

unsignedintoutDataLen;

voidmain(void)

{

unsignedcharPaddedSource[]={0x11,0x11,0x11,0x11,0xd1,0xa1,0x6c,0x20,0x67,0x70,0x8a,0xcb,0xd1,

0xa1,0x6c,0x20};

unsignedinti;

unsignedintj;

unsignedintPaddedSourceLen;

unsignedcharTemp[9]={0x80,0,0,0,0,0,0,0,0};

unsignedcharTempResult[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

memcpy(TempResult,inData,dataLen);

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

TempResult[j]=TempResult[j]^PaddedSource[j];

//CBC模式加密

unsignedintrv1=SMS4_encrypt(key,keyLen,TempResult,dataLen,outData,&outDataLen);

//EBC模式加密

unsignedintrv=SMS4_encrypt(key,keyLen,inData,dataLen,outData,&outDataLen);

unsignedcharplain[513]={0};

unsignedintplainLen;

rv=SMS4_decrypt(key,keyLen,outData,dataLen,plain,&plainLen);//ECB模式解密

printf("%d\n",rv);

}

SM4.cpp

#include

#include

#include

#include"SM4.h"

//S盒

unsignedcharS[][16]=

{{0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05},

{0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99},

{0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62},

{0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6},

{0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8},

{0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35},

{0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87},

{0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e},

{0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1},

{0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3},

{0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f},

{0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51},

{0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8},

{0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0},

{0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84},

{0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48}};

 

//固定参数CK

unsignedintCK[32]=

{0x00070e15,0x1c232a31,0x383f464d,0x545b6269,0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9,

0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249,0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9,

0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229,0x30373e45,0x4c535a61,0x686f767d,0x848b9299,

0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209,0x10171e25,0x2c333a41,0x484f565d,0x646b7279};

 

voidprint_Hex(unsignedchararray[],unsignedintlength)

{

unsignedinti;

intcountPerLine=16;

for(i=0;i

{

if((i%countPerLine)==0)

{

printf("\n");

printf("0x");

intdiscuss=i/countPerLine;

if(discuss

{

printf("00");

printf("%x0",discuss);

}

elseif((16<=discuss)&&(discuss<256))

{

printf("0");

printf("%x%x0",discuss/countPerLine,discuss%countPerLine);

}

}

printf("%02x",array[i]);

}

printf("\n");

}

 

intTt(constintpreS)

{

inti,j;

unsignedchartmp[5]={0};

for(j=0,i=24;i>-1;i-=8,j++)

{

inttmpX=(preS>>(i+4))&0x0000000f;

inttmpY=(preS>>(i))&0x0000000f;

tmp[j]=S[tmpX][tmpY];

}

intresult=0;

convertIntArray(tmp,4,&result);

returnresult;

}

 

intTL(intB)

{

intB2=((B<<2)&0xfffffffc)|((B>>30)&0x00000003);

intB10=((B<<10)&0xfffffc00)|((B>>22)&0x000003ff);

intB18=((B<<18)&0xfffc0000)|((B>>14)&0x0003ffff);

intB24=((B<<24)&0xff000000)|((B>>8)&0x00ffffff);

intC=B^B2^B10^B18^B24;

returnC;

}

 

intTotherL(intB)

{

intB13=((B<<13)&0xffffe000)|((B>>19)&0x00001fff);

intB23=((B<<23)&0xff800000)|((B>>9)&0x007fffff);

intC=B^B13^B23;

returnC;

}

intT(intinput)

{

inttmp=Tt(input);

returnTL(tmp);

}

intTother(intinput)

{

inttmp=Tt(input);

returnTotherL(tmp);

}

voidExtand(intkey[],intextandKey[])

{

inti;

unsignedintK[36]={0};

//系统参数

unsignedintFK0=0xA3B1BAC6;

unsignedintFK1=0x56AA3350;

unsignedintFK2=0x677D9197;

unsignedintFK3=0xB27022DC;

//32字的轮密钥

//intrk[32]={0};

K[0]=key[0]^FK0;

K[1]=key[1]^FK1;

K[2]=key[2]^FK2;

K[3]=key[3]^FK3;

for(i=0;i<32;i++)

{

inttmp1=K[i+1]^K[i+2]^K[i+3]^CK[i];

inttmp2=Tother(tmp1);

extandKey[i]=K[i+4]=K[i]^tmp2;

}

//extandKey=&(rk[0]);

}

intF(intX0,intX1,intX2,intX3,intrk)

{

returnX0^(T(X1^X2^X3^rk));

}

 

voidconvertIntArray(unsignedcharinputData[],unsignedintunInputDataLen,intoutput[])

{

inttmpLen=unInputDataLen/4;

//inttmpIntArray[tmpLen];

chartmp[4]={0};

inti,j;

for(i=0;i

{

/*strncpy(tmp,inputData,sizeof(int));*/

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

{

tmp[j]=inputData[j];

}

inputData+=sizeof(int);

inttmp1=((tmp[0]&0x000000ff)<<24)&0xff000000;

inttmp2=((tmp[1]&0x000000ff)<<16)&0x00ff0000;

inttmp3=((tmp[2]&0x000000ff)<<8)&0x0000ff00;

inttmp4=(tmp[3]&0x000000ff)&0x000000ff;

output[i]=tmp1|tmp2|tmp3|tmp4;

}

}

voidconvertCharArray(intinput[],intlen,unsignedcharoutput[])

{

inti,j,k;

chartmp[5]={0};

for(i=0;i

{

tmp[0]=(unsignedchar)((input[i]>>24)&0x000000ff);

tmp[1]=(unsignedchar)((input[i]>>16)&0x000000ff);

tmp[2]=(unsignedchar)((input[i]>>8)&0x000000ff);

tmp[3]=(unsignedchar)(input[i]&0x000000ff);

for(j=4*i,k=0;k<4;k++)

{

output[j+k]=tmp[k];

}

}

//output[len*4+1]=0;

}

voidR(intarray[])

{

inttmp[4]={0};

inti;

for(i=0;i<4;i++)

{

tmp[i]=array[i];

}

for(i=0;i<4;i++)

{

array[i]=tmp[3-i];

}

}

unsignedintSMS4_encrypt(unsignedcharkey[],unsignedintkeyLen,unsignedchar*inputData,unsignedintunInputDataLen,unsignedchar*outputData,unsignedint*outputDataLen)

{

inti,j,k,l,m,n;

if(keyLen!

=16)

{

returnKeyLenError;

}

if(((unInputDataLen%16)!

=0)||(unInputDataLen>8192))

{

returnPlainLenError;

}

intintLen=unInputDataLen/(sizeof(int));

//转换明文格式,字节数组----整数数组,要释放空间

int*plainData=(int*)malloc(intLen*sizeof(int));

convertIntArray(inputData,unInputDataLen,plainData);

//密文数据缓冲区

int*encData=(int*)malloc(intLen*sizeof(int));

intpreR[4]={0};

//获取扩展密钥

intextandKey[32]={0};

intkeyInt[4]={0};

convertIntArray(key,16,keyInt);

Extand(keyInt,extandKey);

intX[36]={0};

for(i=0;i

{

//为X0--X3赋值,即赋值明文

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

{

X[j]=plainData[4*i+j];

}

//函数迭代

for(k=0;k<32;k++)

{

X[k+4]=F(X[k],X[k+1],X[k+2],X[k+3],extandKey[k]);

}

for(l=0;l<4;l++)

{

preR[l]=X[l+32];

}

R(preR);

for(m=4*i,n=0;n<4;m++,n++)

{

*encData=preR[n];

encData++;

}

}

encData-=intLen;

convertCharArray(encData,intLen,outputData);

free(plainData);

free(encData);

*outputDataLen=unInputDataLen;

//print_Hex(outputData,unInputDataLen);

return0;

}

unsignedintSMS4_decrypt(unsignedcharkey[],unsignedintkeyLen,unsignedchar*inputData,unsignedintunInputDataLen,unsignedchar*outputData,unsignedint*outputDataLen)

{

inti,j,k,l,m,n;

if(keyLen!

=16)

{

returnKeyLenError;

}

if(((unInputDataLen%16)!

=0)||(unInputDataLen>8192))

{

returnPlainLenError;

}

intintLen=unInputDataLen/(sizeof(int));

//转换明文格式,字节数组----整数数组,要释放空间

int*encData=(int*)malloc(intLen*sizeof(int));

convertIntArray(inputData,unInputDataLen,encData);

//密文数据缓冲区

int*plainData=(int*)malloc(intLen*sizeof(int));

intpreR[4]={0};

//获取扩展密钥

intextandKey[32]={0};

intkeyInt[4]={0};

convertIntArray(key,16,keyInt);

Extand(keyInt,extandKey);

intX[36]={0};

for(i=0;i

{

//为X0--X3赋值,即赋值明文

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

{

X[j]=encData[4*i+j];

}

//函数迭代

for(k=0;k<32;k++

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

当前位置:首页 > 农林牧渔 > 林学

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

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