




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
HarbinInstituteofTechnologyatWeihai密碼學(xué)應(yīng)用與實(shí)踐課程設(shè)計(jì)報(bào)告專業(yè):信息安全班級(jí):學(xué)號(hào):姓名:TOC\o"1-3"\h\u1623偽隨機(jī)數(shù)發(fā)生器LFSR 2230761.LFSR原理 2294932.設(shè)計(jì)思想 5277863.設(shè)計(jì)流程圖 5279354.功能實(shí)現(xiàn) 5140961.生成隨機(jī)數(shù) 54812.生成序列 6175263.游程檢測(cè) 7319495.總結(jié) 822516RC4加密與解密 9278171.RC4密碼算法原理 9255972.設(shè)計(jì)思想 1096843.設(shè)計(jì)流程圖 10205514.功能實(shí)現(xiàn) 1127441.打開(kāi)文件 11207222.加密文件 11299063.解密文件 13245735.總結(jié) 1510951源代碼 15偽隨機(jī)數(shù)發(fā)生器LFSR在流密碼加密中通常使用偽隨機(jī)數(shù)發(fā)生器來(lái)產(chǎn)生密鑰流,從而進(jìn)行加密與解密,其結(jié)構(gòu)如下圖所示,而線性反饋移位寄存器(LFSR)即是一個(gè)產(chǎn)生二進(jìn)制位序列(可作為密鑰流)的機(jī)制。圖1流密碼結(jié)構(gòu)圖LFSR的詳細(xì)設(shè)計(jì)原理如下:1.設(shè)計(jì)n位移位寄存器并且設(shè)計(jì)各個(gè)寄存器的反饋系數(shù)Cn,如下圖所示:圖2LFSR寄存器設(shè)計(jì)圖3序列產(chǎn)生方法若想輸出二進(jìn)制序列,不但需要設(shè)計(jì)移位寄存器以及反饋系數(shù),而且還需輸入種子(seeds)來(lái)啟動(dòng)發(fā)生器,例如下左圖所示LFSR,下右圖即為輸入種子(1000)后寄存器的移位及輸出狀態(tài):圖4LFSR實(shí)例由上例還可看出LFSR具有周期性,若要盡可能輸出較多的隨機(jī)數(shù)即產(chǎn)生m-序列(T=2<n>-1),則需合理的設(shè)計(jì)寄存器的反饋系數(shù),不同的反饋系數(shù)產(chǎn)生隨機(jī)序列的周期不同。本實(shí)驗(yàn)旨在實(shí)現(xiàn)使用反饋移位寄存器產(chǎn)生隨機(jī)序列,以用做流密碼加密時(shí)的密鑰流。其主要設(shè)計(jì)原理見(jiàn)上。圖5LFSR流程圖隨機(jī)數(shù)的生成考慮以下兩個(gè)函數(shù)函數(shù)一:intrand(void);
從rand(seed)中指定的seed開(kāi)始,返回一個(gè)[seed,RAND_MAX(0x7fff))間的隨機(jī)整數(shù)。函數(shù)二:voidsrand(unsignedseed);
參數(shù)seed是srand()的種子,用來(lái)初始化rand()的起始值。可以認(rèn)為rand()在每次被調(diào)用的時(shí)候,它會(huì)查看:
1)如果用戶在此之前調(diào)用過(guò)srand(seed),給seed指定了一個(gè)值,那么它會(huì)自動(dòng)調(diào)用srand(seed)一次來(lái)初始化它的起始值。
2)如果用戶在此之前沒(méi)有調(diào)用過(guò)srand(seed),它會(huì)自動(dòng)調(diào)用srand(1)一次。在這里我使用系統(tǒng)時(shí)間作為種子來(lái)初始化srand()的起始值,使用time函數(shù)來(lái)獲得系統(tǒng)時(shí)間,它的返回值為從00:00:00GMT,January1,1970到現(xiàn)在所持續(xù)的秒數(shù),然后將time_t型數(shù)據(jù)轉(zhuǎn)化為(unsigned)型在傳給srand函數(shù)。voidCRC4Dlg::OnButtonCreatrn()//生成隨機(jī)數(shù){ intt,i,k; m_BRandNumber=""; CStringLastNo;srand(time(0));//使用系統(tǒng)時(shí)間作為seed來(lái)初始化t=1+rand()%1023; m_RandNumber=t; for(i=0;i<10;i++)//轉(zhuǎn)換成二進(jìn)制 { k=t%2; t=t/2; RandNumber[i]=k;//注意順序問(wèn)題 LastNo.Format("%d",k); m_BRandNumber=LastNo+m_BRandNumber; } IsCreatRN=TRUE; UpdateData(FALSE);}此試驗(yàn)中產(chǎn)生了1024位二進(jìn)制隨機(jī)序列。voidCRC4Dlg::OnButtonS()//生成序列{ if(IsCreatRN==FALSE) { AfxMessageBox("請(qǐng)先生成隨機(jī)數(shù)!?。?); return; } inti,j,m,n; CStringMyNumber; for(i=0;i<1023;i++) { m=RandNumber[0]; SeqRandNumber[i]=m; MyNumber.Format("%d",m); m_SeqRandNumber=m_SeqRandNumber+MyNumber; n=(RandNumber[9]+RandNumber[8]+RandNumber[5]+RandNumber[0])%2;//模加 for(j=0;j<9;j++) { RandNumber[j]=RandNumber[j+1]; }//移位 RandNumber[j]=n;//移位寄存器的最高位根據(jù)特征多項(xiàng)式求出 } UpdateData(FALSE); IsCreatList=TRUE; m_SeqRandNumber="";}voidCRC4Dlg::OnButtonTest()//檢測(cè)游程{ if(IsCreatList==FALSE) { AfxMessageBox("請(qǐng)先生成隨機(jī)序列?。?!"); return; } inti,j,k,count; intAllCount=0; floatprecent; CStringCountList; CountList=""; CStringPrecentList; for(i=0;i<2;i++) for(j=0;j<10;j++) YC[i][j]=0;//初始化 for(i=0;i<1023;) { if(SeqRandNumber[i]==0) { k=0; while(SeqRandNumber[++i]==0) { k++; } YC[0][k]++; AllCount++; } if(SeqRandNumber[i]==1) { k=0; while(SeqRandNumber[++i]==1) { k++; } YC[1][k]++; AllCount++; } }//游程統(tǒng)計(jì)此次設(shè)計(jì)中首先考慮隨機(jī)數(shù)的生成,方法是使用srand()函數(shù),以time(0)產(chǎn)生的系統(tǒng)時(shí)間為種子,產(chǎn)生1024位二進(jìn)制隨機(jī)數(shù)。再者有了seed如何利用移位寄存器生成序列也是一個(gè)難點(diǎn),在經(jīng)過(guò)上網(wǎng)查資料等學(xué)習(xí)后終于完滿解決。RC4加密與解密
1.初始化及偽隨機(jī)密碼生成
初始化S-盒很容易。首先,進(jìn)行線性填充:S[0]=1,S[1]=1,...,S[255]=255。然后用密鑰填充另一個(gè)256字節(jié)數(shù)組,不斷重復(fù)密鑰直至填充到整個(gè)數(shù)組中:K[0],K[1],...,K[255]。
將指針J設(shè)為0。然后:
對(duì)于I=0至255
J=(J+S[I]+K[I])mod256
交換S[I]和S[J]在初始化的過(guò)程中,密鑰的主要功能是將S-box攪亂,i確保S-box的每個(gè)元素都得到處理,j保證S-box的攪亂是隨機(jī)的。而不同的S-box在經(jīng)過(guò)偽隨機(jī)子密碼生成算法的處理后可以得到不同的子密鑰序列,并且,該序列是隨機(jī)的:while(明文未結(jié)束)
{
++i%=n;
j=(j+s)%n;
swap(s,s[j]);
sub_k=s((s+s[j])%n);
}
2.加密或解密
8*8的S-盒:S[0],S[1],...,S[255]。所有項(xiàng)都是數(shù)字0到數(shù)字255的置換,并且這個(gè)置換是一個(gè)可變長(zhǎng)度密鑰的函數(shù)。它有兩個(gè)計(jì)數(shù)器:I和J,初值為0。要產(chǎn)生一個(gè)隨機(jī)字節(jié),需要按下列步驟進(jìn)行:
I=(I+1)mod256
J=(J+S[I])mod256
交換S[I]和S[J]
T=(S[I]+S[J])mod256
K=S[T]
字節(jié)K與明文異或產(chǎn)生密文或者與密文異或產(chǎn)生明文。
根據(jù)算法原理,首先初始化S-BOX,產(chǎn)生偽隨機(jī)序列密鑰流,選擇所加密文件與密鑰流異或生成密文。圖6RC4流程圖voidCRC4Dlg::OnButton1(){ UpdateData(true); CFileDialogfileDlg(TRUE); fileDlg.m_ofn.lpstrTitle="Selectwhichyouwanttoencryption"; fileDlg.m_ofn.lpstrFilter="0AllFiles(*.*)\0*.*\0\0"; if(IDOK==fileDlg.DoModal()) { CFilefile(fileDlg.GetFileName(),CFile::modeRead); char*pBuf; DWORDdwFileLen; dwFileLen=file.GetLength(); pBuf=newchar[dwFileLen+1]; pBuf[dwFileLen]=0; file.Read(pBuf,dwFileLen); file.Close(); m_mingwen=pBuf; } UpdateData(false);}voidCRC4Dlg::OnButton2(){ UpdateData(true); m_miwen=""; intS[260],T[260]; inti,j=0,kenlen; inta,n,t,l=0; chark; if(m_key==""||m_mingwen=="") { MessageBox("請(qǐng)選擇解密文件以及輸入密鑰!"); return; } kenlen=strlen(m_key); if(kenlen>256) { AfxMessageBox("Pleaseinputthekeyfrom1to256bytes!"); return; }a=strlen(m_mingwen); for(i=0;i<=255;i++) { S[i]=i; T[i]=m_key[i%kenlen]; } for(i=0;i<=255;i++) { j=(j+S[i]+T[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; } i=0; j=0; while(l<a) { i=(i+1)%256; j=(j+S[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; t=(S[i]+S[j])%256; k=S[t]; R.Format("%c",(k^m_mingwen[l])); m_miwen+=R; l++; } UpdateData(false); }voidCRC4Dlg::OnButton3(){UpdateData(true); m_shuchu=""; intS[260],T[260]; inti,j,kenlen; inta,n,t,l=0; chark; if(m_key2==""||m_miwen2=="") { MessageBox("請(qǐng)選擇解密文件以及輸入密鑰!"); return; } kenlen=strlen(m_key2); if(kenlen>256) { AfxMessageBox("Pleaseinputthekeyfrom1to256bytes!"); return; } a=strlen(m_miwen2); for(i=0;i<=255;i++) { S[i]=i; T[i]=m_key2[i%kenlen]; } j=0; for(i=0;i<=255;i++) { j=(j+S[i]+T[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; } i=0; j=0; while(l<a) { i=(i+1)%256; j=(j+S[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; t=(S[i]+S[j])%256; k=S[t]; R.Format("%c",(k^m_miwen2[l])); m_shuchu+=R; l++; } UpdateData(false); }此次設(shè)計(jì)過(guò)程中遇到了很多困難,雖然RC4算法看起來(lái)很簡(jiǎn)單,但是實(shí)際編寫(xiě)起來(lái)卻非常有難度,因此此次設(shè)計(jì)時(shí)參考了網(wǎng)絡(luò)上大量的代碼以加深對(duì)RC4算法的了解。由于此次課程設(shè)計(jì)時(shí)間很短,所以編寫(xiě)出的程序也很簡(jiǎn)單,大量功能沒(méi)有實(shí)現(xiàn),也算是一點(diǎn)小小的遺憾。選擇題目時(shí),有很多加密算法,但是有些加密算法在實(shí)驗(yàn)課上已經(jīng)實(shí)現(xiàn)了,而有些題目如郵件加密,因?yàn)檩^為復(fù)雜而時(shí)間緊迫無(wú)法完成,所以選擇了RC4算法。雖然課程設(shè)計(jì)時(shí)間較短但還是收獲頗豐的。源代碼voidCRC4Dlg::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(true); CFileDialogfileDlg(TRUE); fileDlg.m_ofn.lpstrTitle="Selectwhichyouwanttoencryption"; fileDlg.m_ofn.lpstrFilter="0AllFiles(*.*)\0*.*\0\0"; if(IDOK==fileDlg.DoModal()) { CFilefile(fileDlg.GetFileName(),CFile::modeRead); char*pBuf; DWORDdwFileLen; dwFileLen=file.GetLength(); pBuf=newchar[dwFileLen+1]; pBuf[dwFileLen]=0; file.Read(pBuf,dwFileLen); file.Close(); m_mingwen=pBuf; } UpdateData(false); }voidCRC4Dlg::OnButton2(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(true); m_miwen=""; intS[260],T[260]; inti,j=0,kenlen; inta,n,t,l=0; chark; if(m_key==""||m_mingwen=="") { MessageBox("請(qǐng)選擇解密文件以及輸入密鑰!"); return; } kenlen=strlen(m_key); if(kenlen>256) { AfxMessageBox("Pleaseinputthekeyfrom1to256bytes!"); return; }a=strlen(m_mingwen); for(i=0;i<=255;i++) { S[i]=i; T[i]=m_key[i%kenlen]; } for(i=0;i<=255;i++) { j=(j+S[i]+T[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; } i=0; j=0; while(l<a) { i=(i+1)%256; j=(j+S[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; t=(S[i]+S[j])%256; k=S[t]; R.Format("%c",(k^m_mingwen[l])); m_miwen+=R; l++; } UpdateData(false); }voidCRC4Dlg::OnButton3(){ //TODO:AddyourcontrolnotificationhandlercodehereUpdateData(true); m_shuchu=""; intS[260],T[260]; inti,j,kenlen; inta,n,t,l=0; chark; if(m_key2==""||m_miwen2=="") { MessageBox("請(qǐng)選擇解密文件以及輸入密鑰!"); return; } kenlen=strlen(m_key2); if(kenlen>256) { AfxMessageBox("Pleaseinputthekeyfrom1to256bytes!"); return; } a=strlen(m_miwen2); for(i=0;i<=255;i++) { S[i]=i; T[i]=m_key2[i%kenlen]; } j=0; for(i=0;i<=255;i++) { j=(j+S[i]+T[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; } i=0; j=0; while(l<a) { i=(i+1)%256; j=(j+S[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; t=(S[i]+S[j])%256; k=S[t]; R.Format("%c",(k^m_miwen2[l])); m_shuchu+=R; l++; } UpdateData(false); }voidCRC4Dlg::OnButton4(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(true); CFileDialogfileDlg(TRUE); fileDlg.m_ofn.lpstrTitle="Selectwhichyouwanttoencryption"; fileDlg.m_ofn.lpstrFilter="0AllFiles(*.*)\0*.*\0\0"; if(IDOK==fileDlg.DoModal()) { CFilefile(fileDlg.GetFileName(),CFile::modeRead); char*pBuf; DWORDdwFileLen; dwFileLen=file.GetLength(); pBuf=newchar[dwFileLen+1]; pBuf[dwFileLen]=0; file.Read(pBuf,dwFileLen); file.Close(); m_miwen2=pBuf; } UpdateData(false);}voidCRC4Dlg::OnButtonCreatrn()//生成隨機(jī)數(shù){ intt,i,k; m_BRandNumber=""; CStringLastNo;srand(time(0));//使用系統(tǒng)時(shí)間來(lái)作為seed初始化t=1+rand()%1023; m_RandNumber=t; for(i=0;i<10;i++)//轉(zhuǎn)換成二進(jìn)制 { k=t%2; t=t/2; RandNumber[i]=k;//注意順序問(wèn)題 LastNo.Format("%d",k); m_BRandNumber=LastNo+m_BRandNumber; } IsCreatRN=TRUE; UpdateData(FALSE);}voidCRC4Dlg::OnButtonS()//生成序列{ if(IsCreatRN==FALSE) { AfxMessageBox("請(qǐng)先生成隨機(jī)數(shù)?。?!"); return; } inti,j,m,n; CStringMyNumber; for(i=0;i<1023;i++) { m=RandNumber[0]; SeqRandNumber[i]=m; MyNumber.Format("%d",m); m_SeqRandNumber=m_SeqRandNumber+MyNumber; n=(RandNumber[9]+RandNumber[8]+RandNumber[5]+RandNumber[0])%2;//模加 for(j=0;j<9;j++) { RandNumber[j]=RandNumber[j+1]; }//移位 RandNumber[j]=n;//移位寄存器的最高位根據(jù)特征多項(xiàng)式求出 } UpdateData(FALSE); IsCreatList=TRUE; m_SeqRandNumber="";}voidCRC4Dlg::OnButtonTest()//檢測(cè)游程{ if(IsCreatList==FALSE) { AfxMessageBox("請(qǐng)先生成隨機(jī)序列?。。?); return; } inti,j,k,count; intAllCount=0; floatprecent; CStringCountList; CountList=""; CStringPrecentList; for(i=0;i<2;i++) for(j=0;j<10;j++) YC[i][j]=0;//初始化 for(i=0;i<1023;) { if(SeqRandNumber[i]==0) { k=0; while(SeqRandNumber[++i]==0) { k++; } YC[0][k]++; AllCount++; } if(SeqRandNumber[i]==1) { k=0; while(SeqRandNumber[++i]==1) { k++; } YC[1][k]++; AllCount++; } }//游程統(tǒng)計(jì) //利用列表控件將游程統(tǒng)計(jì)輸出 YouChengDlg*MyYouChengDlg; MyYouChengDlg=newYouChengDlg(this); if(MyYouChengDlg->Create(IDD_DIALOG1)) { DWORDNewStyle=LVS_EX_GRIDLINES; MyYouChengDlg->m_ListYouCheng.SetExtendedStyle(NewStyle); MyYouChengDlg->m_ListYouCheng.InsertColumn(0,"",LVCFMT_LEFT,25); MyYouChengDlg->m_ListYouCheng.InsertColumn(1,"0的游程",LVCFMT_LEFT,80); MyYouChengDlg->m_ListYouCheng.InsertColumn(2,"百分比",LVCFMT_LEFT,80); MyYouChengDlg->m_ListYouCheng.InsertColumn(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度餐飲業(yè)店鋪次轉(zhuǎn)租合同書(shū)
- 二零二五年度老房子二手房買(mǎi)賣(mài)中介服務(wù)協(xié)議
- 二零二五年度精密儀器吊裝作業(yè)安全協(xié)議
- 2025年度石灰行業(yè)安全生產(chǎn)風(fēng)險(xiǎn)管控合同
- 二零二五年度安全生產(chǎn)免責(zé)協(xié)議書(shū)模板
- 2025年度海外人文與社會(huì)科學(xué)留學(xué)合同
- 二零二五年度集體勞動(dòng)合同在文化創(chuàng)意產(chǎn)業(yè)中的實(shí)踐
- 二零二五年度公司員工綠色環(huán)保項(xiàng)目借款協(xié)議
- 二零二五年度租賃地產(chǎn)租賃合同終止條件合同
- 2025年度股票代持業(yè)務(wù)合作協(xié)議書(shū)
- 2024醫(yī)療器械運(yùn)輸合同范本
- 血管內(nèi)超聲在冠狀動(dòng)脈疾病中應(yīng)用的中國(guó)專家共識(shí)(全文)
- 2024年邵陽(yáng)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)完美版
- 2024年湖南理工職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)必考題
- 中國(guó)風(fēng)川劇戲曲京劇文化傳統(tǒng)文化國(guó)粹世界戲劇日活動(dòng)策劃完整課件兩篇
- (正式版)JTT 1495-2024 公路水運(yùn)危險(xiǎn)性較大工程安全專項(xiàng)施工方案審查規(guī)程
- 醫(yī)院dip付費(fèi)績(jī)效考核制度
- 芻議小學(xué)英語(yǔ)有效作業(yè)分層設(shè)計(jì)
- 《征兵入伍應(yīng)征公民體格檢查標(biāo)準(zhǔn)條文釋義》
- 20G520-1-2鋼吊車梁(6m-9m)2020年合訂本
- 電梯維護(hù)保養(yǎng)規(guī)則(TSG T5002-2017)
評(píng)論
0/150
提交評(píng)論