版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
安全SnoWolF/百度B英俊制作課程名稱現(xiàn)代密碼學(xué)實驗實驗項目名稱流密碼系統(tǒng)練習(xí)一流密碼系統(tǒng)【實驗?zāi)康摹坷斫饬髅艽a加密解密過程,通過程序的實現(xiàn)掌握Geffe、JK觸發(fā)器和LFSR的工作過程?!緦嶒炄藬?shù)】1人【系統(tǒng)環(huán)境】Windows【網(wǎng)絡(luò)環(huán)境】交換網(wǎng)絡(luò)結(jié)構(gòu)【實驗工具】VisualStudio2019【實驗類型】綜合型【實驗原理】流密碼體制模型分類根據(jù)加密器中記憶元件的存儲狀態(tài)是否依賴于輸入的明文字符可分為兩類:1.同步流密碼#獨立于明文字符2.自同步流密碼#依賴于輸入的明文字符目前最常用的流密碼體制是二元加法流密碼,是一種同步流密碼,其加密變換可表示為異或函數(shù)。線性反饋移位寄存器移位寄存器是流密碼長產(chǎn)生密鑰流的一個主要組成部分。線性反饋移位寄存器(LFSR)是指,給定前一狀態(tài)的輸出,將該輸出的線性函數(shù)再用作輸入的移位寄存器。異或運算是最常見的單比特線性函數(shù):對寄存器的某些位進行異或操作后作為輸入,再對寄存器中的各比特進行整體移位。線性反饋移位寄存器輸出序列的性質(zhì)完全由其反饋函數(shù)決定。1、n級線性反饋移位寄存器最多有2n個不同的狀態(tài)2、n級n級線性反饋移位寄存器的狀態(tài)周期小于等于2n-13、周期達到最大值的序列稱為m序列僅能被非0常數(shù)或自身的常數(shù)倍除盡,但不能被其他多項式除盡的多項式稱為即約多項式或不可約多項式。n級LFSR產(chǎn)生的序列有最大周期2n-1的必要條件是其特征多項式為不可約的。若n次不可約多項式p(x)的階為2n-1,則稱p(x)是n次本原多項式。{ai}為m序列的充要條件為p(x)是本原多項式。偽隨機序列Golomb對偽隨機周期序列提出了應(yīng)滿足的如下3個隨機公設(shè):(1)在序列的一個周期內(nèi),0與1的個數(shù)相差至多為1。(2)在序列的一個周期內(nèi),長為1的游程占游程總數(shù)的1/2,長為2的游程占游程總數(shù)的1/4,長多為i的游程占游程總數(shù)的1/2i,且在等長的游程中0的游程個數(shù)和1的游程個數(shù)相等。(3)異自相關(guān)函數(shù)是一個常數(shù)。n長m序列滿足Golomb的3個隨機性公設(shè),具有如下性質(zhì):(1)在一個周期內(nèi),0和1出現(xiàn)的次數(shù)分別為2n-1-1和2n-1。(2)在一個周期內(nèi),總游程數(shù)為2n-1;對1≤i≤n-2,長為i的游程有2n-i-1個,且0和1游程各半;長為n-1的0游程一個,長為n的1游程一個?!緦嶒瀮?nèi)容】自行查找相關(guān)資料,結(jié)合上次實驗的主函數(shù)框架,實現(xiàn)流密碼系統(tǒng)。具體內(nèi)容:線性反饋寄存器(LFSR)+一個非線性組合子系統(tǒng)(Geffe序列生成器或J-K觸發(fā)器)1)可參考網(wǎng)上資料。2)結(jié)合參考教材上pp17的圖2-10,pp27的圖2-12,圖2-14。3)不要求輸出密鑰流是m序列,但需給出周期大小。4)實驗報告需明確給出LFSR的線性反饋函數(shù)的遞推形式,初始狀態(tài)。流秘鑰生成器的輸出。加密解密的輸入輸出過程?!緦嶒炦^程與結(jié)果】1. 實驗源碼#include<iostream>#include<string>#include<vector>#include<bitset> //定義二進制bitset所需的頭文件#include<fstream> //文件讀寫操作所需的頭文件usingnamespacestd;#defineCHAR_SIZE 26#defineDECRYPT_FILE "Caesar密文.txt"#defineENCRYPT_FILE "Caesar明文.txt"#defineN8 //常量N指定二進制位大小,也是LFSR最大級數(shù)限定typedefstruct{ bitset<N>lfsrInit; //LFSR初始態(tài) intscale=8; //級數(shù),默認為8 stringkey; //周期密鑰流 intlfsrCycle=0; //周期}LFSR;typedefstruct{ LFSRregister1; //LFSR1 LFSRregister2; //LFSR2 LFSRregister3; //LFSR3 stringkeyStream; //擴展后真正被使用到的密鑰流}GEFFE;//返回命令提示信息voidUsage(constchar*appname){ printf("\n\tusage:stream-e明文文件密鑰k\n"); printf("\tusage:stream-d密文文件密鑰k\n");}//校驗應(yīng)用程序入口參數(shù),若參數(shù)合法返回true,否則返回falseboolCheckParse(intargc,char**argv){ if(argc!=5|| (argv[2][1]!='e'&&argv[2][1]!='d')) { Usage(argv[1]); returnfalse; } returntrue;}//加/解密結(jié)果輸出到當(dāng)前目錄磁盤文件中,strOut指向輸出字符緩沖區(qū),strFile為輸出文件boolFileOut(conststringstrOut,stringstrFile){ if(strOut.empty()) //判斷字符緩沖區(qū)是否為空 returnfalse; ofstreamfileOut(strFile); //打開文件 fileOut<<strOut; //寫入文件 fileOut.close(); //關(guān)閉文件 returntrue;}//加/解密內(nèi)容輸入到字符緩沖區(qū)中,strIn指向輸出字符緩沖區(qū),strFile為輸入文件boolFileIn(char*strIn,constchar*strFile){ ifstreamfileIn(strFile); //打開文件 if(!fileIn.is_open()) //判斷文件是否成功打開 { std::cout<<"Erroropeningfile"; returnfalse; } while(!fileIn.eof()) //直到讀取到文件末尾 { fileIn.getline(strIn,100); //讀取文件,每次讀100byte } returntrue;}//線性反饋寄存器LFSRvoidLfsr(LFSR&lfsr,intk){ bitset<N>bint(lfsr.lfsrInit); //將初始態(tài)存為二進制數(shù) bitset<N>str(bint); strings1;//保存輸出結(jié)果 cout<<"初始狀態(tài)為:"; /*for(inti=lfsr.scale-1;i>=0;i--) //遍歷bint中的數(shù)字 cout<<bint[i]; cout<<endl;*/ do//生成LFSR的狀態(tài)變化 { intj=bint[lfsr.scale-1]^bint[0];//所有LFSR遞歸式設(shè)置為f(a1,...an)=an^a1 bint.operator>>=(1);//向右移1位 bint[lfsr.scale-1]=j;//第1個數(shù)據(jù)和第n個數(shù)據(jù)異或然后賦值給第n個 for(inti=lfsr.scale-1;i>=0;i--) cout<<bint[i]; cout<<endl; bitset<1>binTemp(bint[k%lfsr.scale]);//根據(jù)密鑰k,每次取移位后二進制數(shù)據(jù)的第k位 s1=binTemp.to_string();//把binTemp轉(zhuǎn)換成string放入s1 lfsr.key.push_back(s1[0]);//轉(zhuǎn)成char,放入LFSR密鑰流 ++lfsr.lfsrCycle; //周期遞增 }while(str.to_string()!=bint.to_string());//直到移位后數(shù)據(jù)與初始態(tài)相同 cout<<"輸出周期密鑰流序列為:"<<endl<<lfsr.key<<endl; cout<<"周期為:"<<lfsr.lfsrCycle<<endl<<endl;}//Geffe序列生成器,連同加密解密的操作,k為密鑰boolGeffe(GEFFE&geffe,conststringstrIn,string::size_typestrLen,string&strOut,string::size_typek){//k對序列生成器的影響:從拓展后密鑰流的第k位開始,對明/密文進行加/解密操作 if(strIn.empty()) //判斷輸入字符緩沖區(qū)是否為空 returnfalse; intiCount=0; for(string::size_typei=k;i<strLen+k&&iCount<strLen;++i,++iCount) {// bitset<1>bitvec1(geffe.register1.key,i%geffe.register1.key.size(),1);//從LFSR1中周期序列取1位 bitset<1>bitvec2(geffe.register2.key,i%geffe.register2.key.size(),1);//從LFSR2中周期序列取1位 bitset<1>bitvec3(geffe.register3.key,i%geffe.register3.key.size(),1);//從LFSR3中周期序列取1位 bitset<1>bitvecKey((bitvec1&bitvec2)^(bitvec3&(~bitvec2)));//運算得1位密鑰 bitset<1>bitvecIn(strIn,iCount,1);//從明/密文中取1位 bitset<1>bitvecOut(bitvecKey^bitvecIn);//加/解密操作 strOut+=bitvecOut.to_string(); //將1位結(jié)果寫入輸出緩沖區(qū) geffe.keyStream+=bitvecKey.to_string(); //保存使用的密鑰 } returntrue;}//初始化geffe和LFSRvoidInit(GEFFE&geffe,char**argv){ geffe.register1.scale=7; //設(shè)置LFSR級數(shù) geffe.register2.scale=5; geffe.register3.scale=3; geffe.register1.lfsrInit=64; //設(shè)置初始態(tài) geffe.register2.lfsrInit=16; geffe.register3.lfsrInit=4; cout<<"LFSR1:"<<endl; Lfsr(geffe.register1,atoi(argv[4]));//傳入LFSR1和密鑰k cout<<"LFSR2:"<<endl; Lfsr(geffe.register2,atoi(argv[4])); cout<<"LFSR3:"<<endl; Lfsr(geffe.register3,atoi(argv[4]));}intmain(intargc,char**argv){ if(!CheckParse(argc,argv)) //檢查命令行參數(shù) return0; charstrin[1024]; //輸入字符緩沖區(qū) if(!FileIn(strin,argv[3])) //讀取文件到字符緩沖區(qū) { cout<<"文件讀取失敗"<<endl; return0; } stringstrIn=strin,strOut,fileName="C:\\Users\\Administrator\\Desktop\\輸出.txt"; GEFFEgeffe; Init(geffe,argv); //初始化Geffe和LFSR booloperate=false; operate=Geffe(geffe,strIn,strIn.size(),strOut,atoi(argv[4])); //進行加/解密操作 if(argv[2][1]=='e'&&operate==true) cout<<"加密成功!"<<endl; elseif(argv[2][1]=='d'&&operate==true) cout<<"解密成功!"<<endl; else { cout<<"操作失敗!"<<endl; return0; } if(!FileOut(strOut,fileName)) //將輸出字符緩沖區(qū)寫入輸出文件 { cout<<"文件寫入失敗"<<endl; return0; } cout<<"密鑰k為:\t\t"<<argv[4]<<endl; cout<<"輸入為:\t\t"<<strIn<<endl; cout<<"實際使用密鑰流:\t"<<geffe.keyStream<<endl; cout<<"輸出為:\t\t"<<strOut<<endl; return0;}2. 設(shè)計思路(1)整體框架:流密碼系統(tǒng)需要包括1.讀取輸入文件,2.寫入輸出文件,3.LFSR,4.Geffe序列生成器,5.利用密鑰流進行加/解密操作,共5個部分。(2)輸入輸出文件,利用C++的頭文件<fstream>可以簡單實現(xiàn),用string類型將需要輸入和輸出的字符保存起來。(3)LFSR部分,創(chuàng)建了LFSR結(jié)構(gòu)體,包含初始態(tài)、級數(shù)、周期密鑰流、周期的屬性。這部分還需要針對每一個LFSR根據(jù)初始態(tài)生成其對應(yīng)的周期密鑰流并存儲起來。生成周期密鑰流過程中還需要受到密鑰k的控制。(4)Geffe序列生成器,創(chuàng)建了GEFFE結(jié)構(gòu)體,包含三個LFSR和實際使用的密鑰流的屬性。這部分包含加解密操作,根據(jù)公式和實際需要一位一位地輸出密鑰流序列,同時做加解密操作,最后將實際使用密鑰流作保存。生成序列密鑰流的過程中需要受到密鑰k的控制。密鑰k一定,得到的密鑰流也一定。3. 實驗結(jié)果+調(diào)試結(jié)果圖+結(jié)果分析(1)默認設(shè)置LFSR1級數(shù)為7,初始態(tài)a7a6a5a4a3a2a1=1000000,遞推關(guān)系為f(a1,a2,a3,a4,a5,a6,a7)=a1^a7,周期為127;LFSR2級數(shù)為5,初始態(tài)a5a4a3a2a1=10000,遞推關(guān)系為f(a1,a2,a3,a4,a5)=a1^a5,周期為21;LFSR3級數(shù)為3,初始態(tài)a3a2a1=100,遞推關(guān)系為f(a1,a2,a3)=a1^a3,周期為7。由于Geffe序列生成器對應(yīng)的LFSR的級數(shù)互素,因此根據(jù)課本的結(jié)論,Geffe序列生成器的序列周期為(2^7-1)*(2^5-1)*(2^3-1)=127*31*7=27559。加密過程,密鑰k=5明文為:101011001010011密鑰流:110101001010101密文為:011110000000110結(jié)果正確。解密過程,密鑰k=5密文為:011110000000110密鑰流:110101001010101明文為:101011001010011結(jié)果正確。以k=5,級數(shù)為5的LFSR2為例,分析LFSR密鑰流生成過程如下圖,10000為初始狀態(tài),根據(jù)遞推關(guān)系為f(a1,a2,a3,a4,a5)=a1^a5,則輸出為1^0=1,同時向右移位生成新序列,將輸出放在高位a5,新序列為11000。以此類推。直到產(chǎn)生的新序列與初始狀態(tài)10000相同,則計算總共進行了多少次移位操作,次數(shù)即為該密鑰流的周期。根據(jù)密鑰k=5,對新序列的取值做限定。例如第一個新序列11000,第0位(低位)為0,第4位(高位)為1,而k=5>4,因此做求余操作,循環(huán)至第0位,因此取11000的第0位“0”。以此類推,取每個新序列的第0位,生成周期密鑰流。如圖所示。以k=5為例,分析Geffe密鑰流序列生成過程LFSR1密鑰流序列為:1111111010101001100111011101001011000110111101101011011001001000111000010111110010101110011010001001111000101000011000001000000LFSR2密鑰流序列為:000111110101001100010LFSR3密鑰流序列為:1101001由于k=5,因此從k+1(6)位開始在LFSR中取密鑰流序列。根據(jù)輸入文的長度為15,因此取密鑰流15位。LFSR1?。?10101010011001LFSR2?。?11010100110001 LFSR3?。?11101001110100 按照公式:a1&a2^a3&(~a2)a1&a2=110
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit4 What can you do(說課稿)-2024-2025學(xué)年人教PEP版英語五年級上冊
- 財務(wù)指標(biāo)監(jiān)控與預(yù)警體系計劃
- 市場研究公司前臺服務(wù)總結(jié)
- Unit 7 Happy birthday Section B 2a-2b說課稿- 2024-2025學(xué)年人教版(2024)七年級英語上冊
- Unit 7 Fun after school 第1課時 Reading說課稿 2024-2025學(xué)年滬教版(2024)七年級英語上冊
- 2024學(xué)年北師大附屬實驗高二數(shù)學(xué)上學(xué)期期末模擬試卷附答案解析
- Unit9 writing說課稿2024-2025學(xué)年人教版英語八年級上冊
- 被惡意退款協(xié)議書合同范本
- 貝殼房屋解決合同
- 申請pos機時一定要注意的四個現(xiàn)象
- 新人教版一年級數(shù)學(xué)下冊全冊導(dǎo)學(xué)案
- 2025年中考語文復(fù)習(xí)之現(xiàn)代文閱讀:非連續(xù)性文本閱讀(10題)
- GB/T 9755-2024合成樹脂乳液墻面涂料
- 2024年度軟件定制開發(fā)合同(ERP系統(tǒng))3篇
- 家族族譜模板
- (正式版)JBT 10437-2024 電線電纜用可交聯(lián)聚乙烯絕緣料
- 教科版三年級上冊科學(xué)期末測試卷(二)【含答案】
- 古詩詞常見的修辭手法講課教案
- 科研項目評審評分表
- A5技術(shù)支持的課堂導(dǎo)入作業(yè)1—問題描述.針對日常教學(xué)中的某一主題針對教學(xué)目標(biāo)、教學(xué)內(nèi)容以及教學(xué)對象用簡短的語言描述當(dāng)前課堂導(dǎo)入環(huán)節(jié)中存在的問題和不足以及借助信息技術(shù)改進課堂導(dǎo)入的必要性
- 國家開放大學(xué)《土木工程力學(xué)(本)》章節(jié)測試參考答案
評論
0/150
提交評論