ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:62.88KB ,
资源ID:13869030      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-13869030.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(天理密码学实验2.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

天理密码学实验2.docx

1、天理密码学实验2实验报告学院(系)名称:计算机与通信工程学院姓名吴晋昌学号 20125879专业网络工程班级1班实验项目实验二 DES密码编程课程名称密码学实验课程代码实验时间2014.6.4 10:1011:30实验地点计算机软件实验室7-215批改意见成绩教师签字: 一、 实验目的掌握DES加密算法,学会用DES对明文进行加密。二、 实验内容使用VC+6.0编译器,运用DES对明文进行加密编程。三、 DES简介1977年1月15日美国正式公布实施的数据加密标准DES(data encryption standard)是一个众所周知的分组密码,其分组长度为64比特(bit),密钥长度也为64

2、比特。密钥中有8比特奇偶校验位,实际密钥长度只有56比特,尽管DES目前已被高级加密标准AES所取代,但其设计思想仍然值得借鉴。四、 程序代码#include#include#include/初始置换IPconst int IP64 = 58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8, 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5,63,55,47,39,31,23,

3、15,7 ;/初始逆置换IP_1const int IP_164 = 40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31, 38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29, 36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27, 34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25 ;/选择置换PC_1const int PC_156 = 57,49,41,33,25,17,9,1,58,50,42,34,26,18, 10,2,59,5

4、1,43,35,27,19,11,3,60,52,44,36, 63,55,47,39,31,23,15,7,62,54,46,38,30,22, 14,6,61,53,45,37,29,21,13,5,28,20,12,4 ;/选择置换PC_2const int PC_248 = 14,17,11,24,1,5,3,28,15,6 ,21,10, 23,19,12,4,26,8,16,7 ,27,20,13,2 , 41,52,31,37,47,55,30,40,51,45,33,48, 44,49,39,56,34,53,46,42,50,36,29,32 ;/位选择函数Econst in

5、t E48 = 32,1 ,2 ,3 ,4, 5 ,4 ,5 ,6 ,7 ,8 ,9 , 8 ,9 ,10,11,12,13,12,13,14,15,16,17, 16,17,18,19,20,21,20,21,22,23,24,25, 24,25,26,27,28,29,28,29,30,31,32,1 ;/置换函数Pconst int P32=16,7,20,21,29,12,28,17, 1 ,15,23,26,5 ,18,31,10, 2 ,8 ,24,14,32,27,3 ,9 , 19,13,30,6 ,22,11,4 ,25 ;/S盒const int S3216 = 14,4,

6、13,1,2,15,11,8,3,10,6,12,5,9,0,7, 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8, 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0, 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13, 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 13,8,10,1,3,15,4,2,11,6,7,12,0,5

7、,14,9, 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12, 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 3,15,0,6,10,1,13,8,9

8、,4,5,11,12,7,2,14, 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3, 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 4,3,2,12

9、,9,5,15,10,11,14,1,7,6,0,8,13, 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2, 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12, 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5

10、,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11 ;/循环左移位数表const int circulate16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 ;/字符串转变成二进制int *CharToBit(char *s) int *bit ; int i,j,mask ; bit = (int *)malloc(64*sizeof(int) ; for(i=0;i8;i+) mask = 1 ; for(j=0;j=1 ; return bit ;/二进制转字符char *BitToChar(int *bit) int i,j,k

11、; char *s ; s = (char *)malloc(9*sizeof(char) ; for(i=0;i8;i+) k = 0 ; for(j=0;j8;j+) k = k + pow(2,7-j)*bit8*i+j ; si = k ; s8 = 0 ; return s ;/初始置换int *InitPermutation(int *bit) int *IP_bit ; int i ; IP_bit = (int *)malloc(64*sizeof(int) ; for(i=0;i64;i+) IP_biti = bitIPi-1 ; return IP_bit ;/初始逆置换

12、int *InverseInitPermutation(int *bit) int *IP_1_bit ; int i ; IP_1_bit = (int *)malloc(64*sizeof(int) ; for(i=0;i64;i+) IP_1_biti = bitIP_1i-1 ; return IP_1_bit ;/选择置换pc_1int *PC_1Permutation(int *key) int *keyPC_1 ; int i ; keyPC_1 = (int *)malloc(56*sizeof(int) ; for(i=0;i56;i+) keyPC_1i = keyPC_1

13、i-1 ; /printf(%dt,keyPC_1i) ; return keyPC_1 ;/选择置换pc_2int *PC_2Permutation(int *key) int *keyPC_2 ; int i ; keyPC_2 = (int *)malloc(48*sizeof(int) ; for(i=0;i48;i+) keyPC_2i = keyPC_2i-1 ; return keyPC_2 ;/循环移位操作int *CircuTransposition(int *keyPC_1,int cir) int *LS ; int i,k,j2 ; LS = (int *)malloc

14、(56*sizeof(int) ; for(i=0;i56;i+) LSi = keyPC_1i ; /循环位移操作 for(k=0;kcir;k+) j0 = LS0 ; j1 = LS28 ; for(i=0;i27;i+) LSi = LSi+1 ; LSi+28 = LSi+29 ; LSi = j0 ; LSi+28 = j1 ; return LS ;/位选择函数Eint *BitSelect(int *bit_1) int *bit_E ; int i ; bit_E = (int *)malloc(48*sizeof(int) ; for(i=0;i48;i+) bit_Ei

15、= bit_1Ei-1 ; return bit_E ;/模2加运算int *Xor(int *k,int *bit_E) int *B ; int i ; B = (int *)malloc(48*sizeof(int) ; for(i=0;i48;i+) if(ki=bit_Ei) Bi = 0 ; else Bi = 1 ; return B ;/十进制转二进制int *DecimalToBinary(int dec) int *bin ; int i=0 ; int k = dec ; bin = (int *)malloc(4*sizeof(int) ; while(i=8) bin

16、0 = 1 ; k = k-8 ; if(k=4) bin1 = 1 ; k = k-4 ; if(k=2) bin2 = 1 ; k = k-2 ; if(k=1) bin3 = 1 ; return bin ;/s盒int *SSelect(int *B) int *s ; int *bin ; int i,j,k ; s = (int *)malloc(32*sizeof(int) ; for(i=0;i8;i+) /找到对应的s盒数值 bin = DecimalToBinary(SBi*6*2+Bi*6+1*1Bi*6+2*8+Bi*6+3*4+Bi*6+4*2+Bi*6+5*1) ;

17、 si*4 = bin0 ; si*4+1 = bin1 ; si*4+2 = bin2 ; si*4+3 = bin3 ; return s ;/置换函数Pint *PPermutation(int *s) int *p ; int i ; p = (int *)malloc(32*sizeof(int) ; for(i=0;i32;i+) pi = sPi-1 ; return p ;/K的产生int *GenerateK(char *key) int *k ; /二维数组保存16次迭代的k int *k_binary ; /保存二进制的密钥 int *pc_1_k ; /经过pc_1置换

18、后的密钥 int *pc_2_k ; /保存经过pc_2置换后密钥 int *ls,*ls_new ; /保存经过循环移位操作的值 int i,j ; k = (int *)malloc(16*sizeof(int *) ; for(i=0;i16;i+) ki = (int *)malloc(48*sizeof(int) ; k_binary = CharToBit(key) ; /密钥字符转二进制 pc_1_k = PC_1Permutation(k_binary) ; /密钥二进制进行pc_1置换 ls_new = pc_1_k ; for(i=0;i16;i+) ls = CircuT

19、ransposition(ls_new,circulatei-1) ; /取得相应移位后结果 pc_2_k = PC_2Permutation(ls) ; for(j=0;j48;j+) kij = pc_2_kj ; /保存到ki表中 ls_new = ls ; return k ;/DES加密int *DES(char *s,char *key) int *s_binary ; /保存要加密内容的二进制值 int *IP_s ; /初始置换后的值 int *IP_1_s ; /初始逆置换的值 int *k ; /保存ki int *E_R ; /保存R经过E置换的值 int *Xor_E_

20、R_K ; /保存ki和R(i-1)置换后经过异或运算的值 int *s_select ; /保存经过s盒选择的值 int *f_R_K ; /保存f函数的值 int i,j ; int L32,R32 ; /保存明文或者加密i次的明文的左边一半和右边一半 int temp32 ; int *new_r ; /保存和f函数异或运算的值 int *Ciphertext_binary ; Ciphertext_binary = (int *)malloc(64*sizeof(int) ; /char *Ciphertext ; s_binary = CharToBit(s) ; IP_s = In

21、itPermutation(s_binary) ; /for(i=0;i64;i+) / printf(%d,IP_si) ; /printf(n) ; k = GenerateK(key) ; for(i=0;i32;i+) /将初始置换IP后的值保存为左右两部分 Li = IP_si ; Ri = IP_si+32 ; for(i=0;i16;i+) for(j=0;j32;j+) tempj = Lj ; /保存原先左边值,用于计算 Lj = Rj ; /右半边值给左边 E_R = BitSelect(R) ; Xor_E_R_K = Xor(E_R,ki) ; s_select = S

22、Select(Xor_E_R_K) ; f_R_K = PPermutation(s_select) ; new_r = Xor(f_R_K,temp) ; for(j=0;j32;j+) Rj = new_rj ; for(i=0;i32;i+) Ciphertext_binaryi = Li ; Ciphertext_binaryi+32 = Ri ; /*加密后由于可能出现超出ascii表的值,所以在这里重新转化 *为字符会出问题,这里就不将加密后的结果转化为字符 *Ciphertext = BitToChar(Ciphertext_binary) ; */ return Ciphert

23、ext_binary ;int main() char *s ; /保存明文 char *key ; /保存密钥 int *Ciphertext ; /保存密文的二进制值 int i=0 ; s = (char *)malloc(8*sizeof(char) ; key = (char *)malloc(9*sizeof(char) ; printf(*DES加密算法*nn) ; printf(请输入明文(8 字节):) ; gets(s) ; printf(n) ; getchar ; printf(请输入密钥(8 字节):) ; gets(key) ; Ciphertext = DES(s,key) ; printf(n) ; printf(密文:) ; i = 0 ; while(i64) printf(%d,Ciphertexti) ; i+ ; printf(n); return ;五、 实验结果

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

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