SMS4分析實驗報告(附C++實現(xiàn)代碼)_第1頁
SMS4分析實驗報告(附C++實現(xiàn)代碼)_第2頁
SMS4分析實驗報告(附C++實現(xiàn)代碼)_第3頁
SMS4分析實驗報告(附C++實現(xiàn)代碼)_第4頁
SMS4分析實驗報告(附C++實現(xiàn)代碼)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

中國商用加密標(biāo)準(zhǔn)SMS4分析實驗報告概況SMS4與DES、AES比較意義實現(xiàn)密鑰擴(kuò)展S盒替換L變換輪函數(shù)F加密算法解密算法分析輸入改變一位,輸出改變位數(shù)S變換和L變換輸入改變一位,輸出改變位數(shù)S盒連續(xù)變換使輸入等于輸出的輪數(shù)附1:實現(xiàn)代碼附2:運行截圖概況商用密碼是指對不涉及國家秘密內(nèi)容的信息進(jìn)行加密保護(hù)或者安全認(rèn)證所使用的密碼技術(shù)和密碼產(chǎn)品。商用密碼的應(yīng)用領(lǐng)域十分廣泛,主要用于對不涉及國家秘密內(nèi)容但又具有敏感性的內(nèi)部信息、行政事務(wù)信息、經(jīng)濟(jì)信息等進(jìn)行加密保護(hù)。1972年美國公布了第一個商用密碼DES。而2006年2月公布的用于無線局域網(wǎng)加密的SMS4是我國公布的第一個商用密碼。SMS4是一個分組對稱密碼算法。分組長度與密鑰長度均為128位。數(shù)據(jù)處理單位主要為字節(jié)(8位)和字(32位)。包括非線性變換S和線性變換L,經(jīng)過32輪迭代結(jié)果為128位密文。其中S盒可替換,是一種靈活的、相對穩(wěn)定的密碼算法。SMS4與DES、AES比較SMS4、DES與AES均為已公開的分組對稱商用密碼,均使用異或,置換,代換,移位操作四種基本運算。均包括線性和非線性變換。DES:分組長度為64位,密鑰長度為64位(放棄其中八位用作奇偶校驗),16輪變換,輸出64位密文。有8個4x16位S盒。從實際出發(fā)仍認(rèn)為其安全性足夠,但現(xiàn)在一般更多的使用AES。AES:分組長度為128~256位,密鑰長度為128、192或256位,10~14輪變換,輸出與明文對應(yīng)長度的密文。有16x16位的S盒和基于16x16位的E、F表的混合列操作。SMS4:分組長度為128位,密鑰長度為128位,32輪變換,輸出128位密文。有16x16位S盒。三、意義隨著信息時代的到來,信息顯得越來越重要,甚至成為一種戰(zhàn)略物資。所以信息的安全也越來越重要。而密碼算法則是信息安全的核心。SMS4的公布改變了長期以來不公布密碼算法只提供密碼芯片的局面。打破了外國對商業(yè)密碼的壟斷,使得用戶不再需要面對要達(dá)到加密要求就必須向外國管理者繳納使用費的情況。也在最大程度上避免了因使用外國密碼算法而被掌握陷門的風(fēng)險。同時,SMS4也標(biāo)志著我國密碼體制與國際接軌,有利于我國密碼管理的科學(xué)化,促進(jìn)我國商用密碼算法的發(fā)展。四、實現(xiàn)密鑰擴(kuò)展使用到4個常數(shù)FK0~3和32個固定參數(shù)CK0~31,定義K0~3為FK與密鑰的異或值。子密鑰IKi等于Ki+4等于Ki+1~3與CKi的T'變換與Ki的異或值。S盒替換使用16x16位的S盒,以輸入高位為行號、低位為列號取對應(yīng)表中數(shù)值作為輸出。L變換以輸入與其循環(huán)左移2,10,18,24次的值的異或值作為輸出。(密鑰擴(kuò)展里用到的L'變換的左移次數(shù)為13,23次)輪函數(shù)F四個S盒并行替換后做L變換稱作T變換。F函數(shù)的輸出為輸入數(shù)據(jù)X1~3與子密鑰IK的異或值的T變換得到的值再與輸入數(shù)據(jù)X0的異或值。加密算法明文作為第一輪F的輸入,之后的輸入為前一輪輸入的后三項與前一輪F變換的結(jié)果,子密鑰為IK0~31。32輪變換后,最后四輪的輸出分別作為密文的第4到第1項。解密算法解密算法與加密相同,但子密鑰的使用順序為IK31~0。分析輸入改變一位,輸出改變位數(shù)每次測試先隨機(jī)產(chǎn)生原始輸入,之后每次隨機(jī)改變一位,與前一次輸出比較改變位數(shù)。每次測試做1000次改變,取平均數(shù)。見圖(四)。多次統(tǒng)計取平均結(jié)果為:63.63位S變換和L變換輸入改變一位,輸出改變位數(shù)每次測試先隨機(jī)產(chǎn)生原始輸入,之后每次隨機(jī)改變一位,與前一次輸出比較改變位數(shù)。每次測試做1000次改變,取平均數(shù)。見圖(三)。多次統(tǒng)計取平均結(jié)果為:S:3.98位L:5位S盒連續(xù)變換使輸入等于輸出的輪數(shù)S盒公有256種輸入,對每個輸入做連續(xù)S變換,直到輸出與輸入相同。對于每個S盒結(jié)果為定值。部分見圖(四)。對于附1中的代碼實現(xiàn)時所用S盒的計算結(jié)果為:(XX:YXX=輸入Y=S盒替換次數(shù))00:12001:2402:12003:2404:5605:12006:12007:5608:5609:1200A:560B:560C:1200D:350E:560F:12010:2411:12012:12013:12014:5615:12016:5617:5618:12019:1201A:1201B:351C:1201D:1201E:1201F:5620:2421:12022:12023:12024:925:12026:3527:12028:12029:1202A:562B:242C:562D:32E:352F:5630:12031:12032:12033:12034:3535:5636:637:3538:12039:243A:1203B:563C:353D:1203E:353F:3540:12041:5642:12043:2444:12045:12046:5647:12048:12049:1204A:354B:1204C:564D:1204E:94F:950:12051:5652:5653:3554:12055:12056:5657:12058:659:1205A:1205B:1205C:355D:565E:1205F:5660:12061:962:5663:12064:12065:666:3567:12068:12069:1206A:1206B:566C:246D:1206E:566F:5670:3571:12072:5673:12074:3575:3576:12077:5678:5679:67A:1207B:1207C:1207D:567E:1207F:12080:12081:5682:5683:12084:12085:12086:12087:5688:3589:248A:568B:1208C:1208D:98E:1208F:12090:2491:992:5693:5694:12095:3596:12097:12098:3599:569A:1209B:1209C:249D:1209E:1209F:35A0:120A1:120A2:120A3:35A4:56A5:35A6:35A7:120A8:9A9:120AA:120AB:1AC:35AD:35AE:9AF:56B0:24B1:120B2:35B3:120B4:2B5:56B6:120B7:56B8:24B9:120BA:120BB:56BC:120BD:24BE:120BF:56C0:9C1:35C2:56C3:56C4:56C5:120C6:120C7:120C8:120C9:35CA:35CB:56CC:56CD:24CE:120CF:3D0:56D1:35D2:120D3:35D4:35D5:24D6:120D7:24D8:3D9:35DA:56DB:120DC:24DD:120DE:2DF:24E0:24E1:120E2:120E3:35E4:120E5:120E6:56E7:120E8:6E9:120EA:120EB:120EC:120ED:56EE:120EF:120F0:120F1:120F2:56F3:120F4:120F5:24F6:120F7:24F8:6F9:120FA:56FB:35FC:24FD:56FE:24FF:120表(一)S變換循環(huán)測試附1://10385001丁雅博SMS4密碼算法VC++6.0編譯#include<iostream>#include<cstring>#include<ctime>#include<cstdlib>#include<stdio.h>#include<stdlib.h>usingnamespacestd;intS_box[16][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}};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};unsignedintfk[4]={0xa3b1bac6,0x56aa335,0x677d9197,0xb27022dc};voidpri(chara[],intn)//數(shù)組輸出{ for(inti=0;i<n;i++) { cout<<a[i]; } cout<<endl;}voidpri_(chara[],intn)//16進(jìn)制輸出{ intm=n/4; for(inti=0;i<m;i++) { intk=i*4; inttemp=(a[k]-'0')*8+(a[k+1]-'0')*4+(a[k+2]-'0')*2+(a[k+3]-'0'); if(temp<10) { cout<<temp; } else { chartemp_=temp-10+'A'; cout<<temp_; } } cout<<endl;}voidpri__(chara[],intn)//二進(jìn)制轉(zhuǎn)字符輸出{ intm=n/8; for(inti=0;i<m;i++) { inttemp=0,k=i*8; for(intj=0;j<8;j++) { temp=temp*2; temp=temp+a[k+j]-'0'; } cout<<char(temp); } cout<<endl;}voidgetbi(chara[],charre[],intn)//獲得二進(jìn)制碼{ for(inti=0;i<n;i++) { intsb=a[i]; for(intj=0;j<8;j++) { re[i*8+7-j]=sb%2+'0'; sb=sb/2; } }}voidgiv(chara[32],charre[32])//賦值{ for(inti=0;i<32;i++) re[i]=a[i];}voidxor(chara[32],charb[32],charre[32])//異或{ for(inti=0;i<32;i++) { if(a[i]==b[i]) re[i]='0'; else re[i]='1'; }}voidzy(chara[32],intn)//循環(huán)左移{ while(n--) { chartemp=a[0]; for(inti=0;i<31;i++) a[i]=a[i+1]; a[31]=temp; }}voidd_to_b(unsignedinta,charre[32])//十進(jìn)制轉(zhuǎn)二進(jìn)制{ for(inti=1;i<=32;i++) { re[32-i]=a%2+'0'; a=a/2; }}voidh_to_b(chara[32],charre[4][32])//十六進(jìn)制轉(zhuǎn)二進(jìn)制{ inti,j; charb[128]; for(i=0;i<32;i++) { intd; if(a[i]>='A') d=a[i]-'A'+10; else d=a[i]-'0'; for(j=0;j<4;j++) { b[i*4+3-j]=d%2+'0'; d=d/2; } } for(i=0;i<4;i++) { for(j=0;j<32;j++) re[i][j]=b[i*32+j]; }}voidS_change(chara[32],charre[32])//4個S盒并行置換{ for(inti=0;i<4;i++) { intxtemp=0; intytemp=0; for(intj=0;j<4;j++) { xtemp=xtemp*2+a[8*i+j]-'0'; ytemp=ytemp*2+a[8*i+j+4]-'0'; } inttemp=S_box[xtemp][ytemp]; for(intk=0;k<8;k++) { re[i*8+7-k]=temp%2+'0'; temp=temp/2; } }}voidL_change(chara[32],charre[32])//L置換{ chartemp[32]; giv(a,temp); zy(temp,2); xor(a,temp,re); zy(temp,8); xor(re,temp,re); zy(temp,8); xor(re,temp,re); zy(temp,6); xor(re,temp,re);}voidkey_LC(chara[32],charre[32])//L*置換{ chartemp[32]; giv(a,temp); zy(temp,13); xor(a,temp,re); zy(temp,10); xor(re,temp,re);}voidF_change(chara[32],charb[32],charc[32],chard[32],charrk[32],charre[32])//F變換{ xor(b,c,re); xor(re,d,re); xor(re,rk,re); S_change(re,re); L_change(re,re); xor(a,re,re);}voidkey_ex(chara[4][32],charre[32][32])//密鑰擴(kuò)展{ inti; charK[36][32]; charFK[4][32]; for(i=0;i<4;i++) { d_to_b(fk[i],FK[i]); xor(a[i],FK[i],K[i]); } charCK[32][32]; for(i=0;i<32;i++) d_to_b(ck[i],CK[i]); for(i=0;i<32;i++) { chartemp[32]; xor(K[i+1],K[i+2],temp); xor(temp,K[i+3],temp); xor(temp,CK[i],temp); S_change(temp,temp); key_LC(temp,temp); xor(K[i],temp,re[i]); giv(re[i],K[i+4]); }}voidpu_to_pr(chara[4][32],charb[32][32],charre[4][32])//加密{ inti=0; charX[36][32]; for(i=0;i<4;i++) giv(a[i],X[i]); for(i=0;i<32;i++) F_change(X[i],X[i+1],X[i+2],X[i+3],b[i],X[i+4]); for(i=0;i<4;i++) giv(X[35-i],re[i]);}voidpr_to_pu(chara[4][32],charb[32][32],charre[4][32])//解密{ inti=0; charX[36][32]; for(i=0;i<4;i++) giv(a[i],X[i]); for(i=0;i<32;i++) F_change(X[i],X[i+1],X[i+2],X[i+3],b[31-i],X[i+4]); for(i=0;i<4;i++) giv(X[35-i],re[i]);}doublecomp(chara[],charb[],intn)//比較倆數(shù)組不同的位數(shù){ doublere=0; for(inti=0;i<n;i++) { if(a[i]!=b[i]) re++; } returnre;}doublecomp_Z(chara[4][32],charb[32][32])//輸入改變一位,輸出平均改變位數(shù){ doublere=0; charpr[4][32],pr_[4][32]; pu_to_pr(a,b,pr); srand(time(0)); for(inti=0;i<1000;i++) { intp=rand()%128; if(a[p/32][128%32]=='0') a[p/32][128%32]='1'; else a[p/32][128%32]='0'; pu_to_pr(a,b,pr_); for(intj=0;j<4;j++) re=re+comp(pr[j],pr_[j],32); for(intk=0;k<4;k++) giv(pr_[k],pr[k]); } re=re/1000; returnre;}doublecomp_SL(chara[32],intn)//S或L變換輸入改變一位,輸出平均改變位數(shù){ doublere=0; charb[32],c[32]; if(n==0) S_change(a,b); else L_change(a,b); srand(time(0)); for(inti=0;i<1000;i++) { intp=rand()%32; if(a[p]=='0') a[p]='1'; else a[p]='0'; if(n==0) S_change(a,c); else L_change(a,c); re=re+comp(b,c,32); giv(c,b); } re=re/1000; returnre;}voidround_S()//輸入經(jīng)S盒多次改變后等于輸出需要的變化次數(shù){ for(inti=0;i<256;i++) { inta=i; intre=1; intx=a/16; inty=a%16; intb=S_box[x][y]; while(1) { if(a==b) { if(x>9) cout<<char(x+'A'-10); else cout<<char(x+'0'); if(y>9) cout<<char(y+'A'-10)<<":"; else cout<<char(y+'0')<<":"; cout<<re<<""; if((i+1)%8==0) cout<<endl; break; } intx_=b/16; inty_=b%16; b=S_box[x_][y_]; re++; } }}intmain(){ while(1) { cout<<"SMS4加密丁雅博"<<endl;//界面 cout<<"_______________________________________________________________________________"<<endl; cout<<"0:SMS4加密"<<endl; cout<<"1:SMS4解密"<<endl; cout<<"2:SMS4加密輸入改變一位,輸出平均改變位數(shù)"<<endl; cout<<"3:S和L變換輸入改變一位,輸出平均改變位數(shù)"<<endl; cout<<"4:輸入經(jīng)S盒多次改變后等于輸出需要的變化次數(shù)"<<endl; cout<<"5:清屏"<<endl; cout<<"6:退出"<<endl; cout<<"_______________________________________________________________________________"<<endl; intchoice; cin>>choice; if(choice==0)//加密 { inti,j,k; charkeys[16],pus[10000],temp[128],key_[4][32],prs[80000],key[32][32]; cout<<"請輸入密鑰(16位字符):"<<endl; for(i=0;i<16;i++) cin>>keys[i]; getbi(keys,temp,16); for(i=0;i<4;i++) { for(j=0;j<32;j++) key_[i][j]=temp[i*32+j]; } key_ex(key_,key); cout<<"請輸入明文:"<<endl; cin.ignore(); cin.getline(pus,100000); intt=strlen(pus); for(i=t;i<((t+15)/16)*16;i++) pus[i]=''; t=(t+15)/16; for(i=0;i<t;i++) { charpu[4][32],pr[4][32]; charpu_[16]; for(j=0;j<16;j++) pu_[j]=pus[i*16+j]; getbi(pu_,temp,16); for(j=0;j<4;j++) { for(k=0;k<32;k++) pu[j][k]=temp[j*32+k]; } pu_to_pr(pu,key,pr); for(j=0;j<4;j++) { for(k=0;k<32;k++) prs[i*128+j*32+k]=pr[j][k]; } } cout<<"加密后密文為:"<<endl; pri_(prs,t*128); } elseif(choice==1)//解密 { inti,j,k; charkeys[16],temp[128],pus_[80000],key_[4][32],prs[80000],key[32][32]; cout<<"請輸入密鑰(16位字符):"<<endl; for(i=0;i<16;i++) cin>>keys[i];

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論