版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實 驗 報 告課程:密碼學 班級: 姓名: 學號:成績: 指導教師: 實驗日期:2011/5/25實驗密級: 預習程度: 實驗時間:12:50-15:20儀器組次: 18 必修/選修:必修 實驗序號:4實驗名稱: 實現DES 分組密碼算法的加解密 實驗目的與要求:1、掌握DES 分組密碼算法的軟件實現方法;2、復習DES 分組密碼算法設計的基本原理;3、能用DES 分組密碼算法實現已知明文的加解密 實驗儀器:名稱型號數量計算機Lenovo1一、 實驗要求1、求主密鑰的擴展密鑰前,先輸出使用的PC-1 置換和PC-2 置換;2、對明/密文文件用DES 算法進行加/解密前,先輸出確定使用的S 盒和
2、有關置換表;3、“確定主密鑰的擴展密鑰”和“對明/密文文件的加/解密”分別編寫兩個模塊,如果時間不夠,可以任選一個模塊;4、確定擴展密鑰前,先指出是加密密鑰還是解密密鑰;5、密鑰擴展的移位的位數可以先添表,但最后一輪移位完后,必須回到初始值c0d0。6、主密鑰長度與明文相一致,需要忽略校驗位;7、能完成任意給定的一個明/密文文件的加/解密;8、加解密結果正確。二、實驗內容與步驟下面是程序的部分代碼int main() char MingWen104; char target8; char InputKey8; int text64; int text_ip64; int L032,Li32;
3、int R032,Ri32;int RE048; int key64; int keyPC156; int A28; int B28;int keyAB56; int K1648; int RK48; int RKS8; int SP32; int RKSP32; int text_end64; int text_out1464; char init9="HTmadeit" int CBC64;int result1364;int H208;char MiWen208;int C832;int M138;char choice;int t;int i,j;int k,l,m
4、,n;int r8,c8;int flag=1;printf("歡迎使用DES加密解密nn");while(flag)printf("A加密,B解密,請選擇:n");scanf("%c",&choice);while(choice!='A'&&choice!='B'&&choice!='a'&&choice!='b')printf("對不起,您的輸入不合法。請選擇A或B,A表示加密,B表示解密。n"
5、;); scanf("%c",&choice);getchar(); printf("請輸入8位密鑰:n");gets(InputKey);while(InputKey7='0'|InputKey8!='0') printf("您輸入的密鑰位數有誤,請重新輸入8位密鑰:n"); gets(InputKey);for(i=0;i<8;i+) int a8=0,0,0,0,0,0,0,0; m=InputKeyi; for(j=0;m!=0;j+) aj=m%2; m=m/2; for(j=0
6、;j<8;j+) key(i*8)+j=a7-j;for(i=0;i<56;i+) keyPC1i=keyPC1i-1; for(i=0;i<28;i+) Ai=keyPC1i; Bi=keyPC1i+28; for(t=0;t<16;t+) if(movet=1) n=A0; for(i=0;i<27;i+) Ai=Ai+1; A27=n; n=B0; for(i=0;i<28;i+) else for(i=0;i<8;i+) targeti=MingWeni+(8*l); for(i=0;i<8;i+) int a8=0,0,0,0,0,0,
7、0,0; m=targeti; for(j=0;m!=0;j+) aj=m%2; m=m/2; for(j=0;j<8;j+) text(i*8)+j=a7-j; /for(i=0;i<64;i+) /printf("%d,",texti); /printf("n"); /for(i=0;i<64;i+) /printf("%d,",text_outli); /printf("n"); for(i=0;i<64;i+) /CBC模式下前一分組的密文異或當前分組 texti=text_outl
8、itexti; /for(i=0;i<64;i+) /printf("%d,",texti); /printf("n"); /對每個text進行DES加密 for(i=0;i<64;i+) /進行初始換位 text_ipi=textIPi-1; for(i=0;i<32;i+) /分成左右兩部分,各32位 L0i=text_ipi; R0i=text_ipi+32; /for(i=0;i<32;i+) / printf("%d,",L0i); /for(i=0;i<32;i+) / printf(&quo
9、t;%d,",R0i); /十六次迭代 for(t=0;t<16;t+) for(i=0;i<48;i+) /將右半部分通過擴展換位表E從32位擴展成48位 RE0i=R0Ei-1; /printf("RE0n"); /for(i=0;i<48;i+) /printf("%d,",RE0i); for(i=0;i<48;i+) /RE與K異或運算 RKi=RE0iKti; /printf("n"); /for(i=0;i<48;i+) /printf("%d,",RKi);
10、for(i=0;i<8;i+) /將R和K異或運算的結果通過S位移表 ri=RK(i*6)+0*2+RK(i*6)+5; ci=RK(i*6)+1*8+RK(i*6)+2*4+RK(i*6)+3*2+RK(i*6)+4; RKS0=S1r0c0; RKS1=S2r1c1; RKS2=S3r2c2; RKS3=S4r3c3; RKS4=S5r4c4; RKS5=S6r5c5; RKS6=S7r6c6; RKS7=S8r7c7; for(i=0;i<8;i+) /把結果轉成32位二進制儲存在數組SP中 int b4=0,0,0,0; m=RKSi; for(j=3;m!=0;j-) b
11、j=m%2; m=m/2; for(j=0;j<4;j+) SPj+(i*4)=bj; for(i=0;i<32;i+) /將二進制結果再經過一個P盒換位 RKSPi=SPPi-1; for(i=0;i<32;i+) /與前一次的左部異或運算,得到本次迭代的右部 Rii=L0iRKSPi; for(i=0;i<32;i+) L0i=R0i; R0i=Rii; else if(choice='B'|choice='b') printf("請輸入密文內容:n"); gets(MiWen); for(i=0;i<208
12、;i+) Hi=0; for(i=0;MiWeni!='0'i+) /將十六進制密文轉化成十進制存放在數組H中 if(MiWeni>='0'&&MiWeni<='9') Hi=MiWeni-'0' else if(MiWeni>='A'&&MiWeni<='F') Hi=MiWeni-'A'+10; else if(MiWeni>='a'&&MiWeni<='f') H
13、i=MiWeni-'a'+10; else printf("請輸入用十六進制表示的密文內容:n"); gets(MiWen); i=0; n=i; /密文中共有n個字符 if(n%16!=0) printf("對不起,您輸入的密文不正確,請確認密文的內容,密文的字符數應是16的倍數。n"); printf("請輸入密文內容:n"); gets(MiWen); for(i=0;i<208;i+) Hi=0; for(i=0;MiWeni!='0'i+) /將十六進制密文轉化成十進制存放在數組H中 i
14、f(MiWeni>='0'&&MiWeni<='9') Hi=MiWeni-'0' else if(MiWeni>='A'&&MiWeni<='F') Hi=MiWeni-'A'+10; else if(MiWeni>='a'&&MiWeni<='f') Hi=MiWeni-'a'+10; for(i=0;i<n;i+) /將十進制密文轉化成二進制存放在數組C中
15、int he4=0,0,0,0; for(j=3;Hi!=0;j-) hej=Hi%2; Hi=Hi/2; for(j=0;j<4;j+) Cj+(i*4)=hej; /for(i=0;i<130;i+) / printf("%d,",Ci); /printf("n"); k=n/16; for(l=0;l<k;l+) for(i=0;i<64;i+) /將每個分組對應的64位二進制密文放到text_out中 text_outl+1i=Ci+(l*64); /for(i=0;i<64;i+) / printf("%
16、d,",text_outli); /printf("n"); /對每個text進行DES解密 for(i=0;i<64;i+) /進行初始換位 text_ipi=text_outl+1IPi-1; /for(i=0;i<64;i+) /printf("%d,",text_ipi); /printf("n"); for(i=0;i<32;i+) /分成左右兩部分,各32位 L0i=text_ipi; R0i=text_ipi+32; /for(i=0;i<32;i+) / printf("%d
17、,",L0i); /for(i=0;i<32;i+) / printf("%d,",R0i); /CBC模式下的解密 for(i=0;i<64;i+) /前一分組的密文異或當前分組所得明文的二進制放到result中 resultli=text_outlitexti; for(i=0;i<(n/16);i+) /將二進制轉成十進制 for(j=0;j<8;j+) Mij=resulti(j*8)+0*128+resulti(j*8)+1*64+resulti(j*8)+2*32+resulti(j*8)+3*16+resulti(j*8)+4
18、*8+resulti(j*8)+5*4+resulti(j*8)+6*2+resulti(j*8)+7; printf("您的文件經過DES解密后的明文是:n"); for(i=0;i<(n/16);i+) for(j=0;j<8;j+) printf("%c",Mij); printf("nnn"); flag=0;printf("是否繼續(xù)?n");printf("Y繼續(xù),N退出,請選擇:n");scanf("%c",&choice);while(choice!='Y'&&choice!='N'&&choice!='y'&&choice!='n')printf("對不起,您的輸入不合法。請選擇Y或N,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年七臺河考貨運上崗證試答題
- 南漳縣麗美租房合同范例
- 模具工廠股合同范例
- 快手運營簽約合同范例
- 居間協議合同范例武漢
- 代理法律服務合同范例
- 住房清包合同范例
- 生鮮訂購合同范例
- 大宗物品合同范例
- 匯率套保合同范例
- 體育教育畢業(yè)論文范文8000字
- 危機管理手冊
- 2023山東省科創(chuàng)集團限公司集團總部招聘1人上岸筆試歷年難、易錯點考題附帶參考答案與詳解
- 數學建模基礎學習通超星課后章節(jié)答案期末考試題庫2023年
- 屋面輕質混凝土找坡層技術交底
- 食品工程原理課程設計花生油換熱器的設計
- 福利彩票機轉讓協議
- 中國常用漢字大全
- 農村留守兒童的營養(yǎng)狀況及干預措施論文
- 水利工程建設匯報材料(通用3篇)
- 10篇罪犯矯治個案
評論
0/150
提交評論