《DES加密算法C语言实验报告.doc》由会员分享,可在线阅读,更多相关《DES加密算法C语言实验报告.doc(12页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、DES 实验报告一、实验目的 实现 DES 算法。 二、实验过程 按照 DES 的算法流程设计,具体实施详见附件。 三、使用方法 首先输入密钥,八位 ASCII 长,否则报错。然后输入读入文件名和写入文件名, 必须以 ASCII 编码,否则不能使用。 四、实验结果 将自身 cpp 文件进行加密解密,前后文件完全一样。见文件 附录附录 源代码:/ 滴一欸死.cpp : 定义控制台应用程序的入口点。/#include “stdafx.h“#include #include #include #include #include #include “table.h“/* Constant */#def
2、ine ENCRYPT_LENGTH8/length of each unit in encryption#define DECIPHER_LENGTH 4/length of each unit in decipher#define MAX320xFFFFFFFF/mask of 32 bits/* Declaration */typedef unsigned long longbit64;typedef unsigned long longbit56;typedef unsigned long longbit48;typedef unsigned intbit32;typedef unsi
3、gned intbit28;/* File stream */FILE *fin, *fout;/* For debug */inline void printBite(bit64 num)while (num)printf(“%d“, num % 2);num = 1;printf(“n“);/* Transfer from char to bit in Encrtption */inline bit64 ToBit(char *in/ source string);/* Transfer from char to bit in Deciphtering */inline bit64 DeT
4、oBit(char *in/ source string);/* Transfer from bit to char */inline void ToBite(char *out,/ out stringbit64 num/ source bits);/* Permutation */inline bit64 substitute(bit64 num,/ source bitsconst int *table,/ Permutation tablesize_t len/ bits length);/* Bit recycle loop to left */inline bit28 MoveLe
5、ft(bit28 key,/ source bitsint len/ bits length);/* Bit recycle loop to right */inline bit28 MoveRight(bit28 key, / source bitsint len/ bits length);/* Divide bits into two parts */inline void divide(bit64 num,/ source bitsint len,/ length of each bitsbit32 *L,/ left out bitsbit32 *R/ right out bits)
6、;/* S box */inline bit32 SChange(bit48 num/ source bits);/* F box */inline bit32 FChange(bit32 num,/ source bitsbit48 key/ secret key);/* Key initialization */inline void SetKey(char *in/ string of key);/* Enryption */inline void DES(char *message/ messages to be encrypted);/* Deciphering */inline v
7、oid Decipher(char *message/ messages to be deciphered);/* Initialization */inline void init();int main()init();system(“pause“);return 0;/* Initialization */inline void init()/* Set secret key */printf(“Please input your secret key (8 digits):n“);char key10000;scanf(“%s“, key);if (strlen(key) != 8)pr
8、intf(“ERROR Keyn“);return;SetKey(key);/* Set mode Encryption or Deciphering */printf(“Please input the mode (“E“ for Encrypt, “D“ for Decipher):n“);void (*p)(char*);int delta = 8;switch (getch()case E: p = DES; delta = 8; break;case D: p = Decipher; delta = 16; break;default: printf(“ERROR!n“); retu
9、rn;/* Load file */printf(“Please input the path of the in file:n“);char message10000, in100, out100;scanf(“%s“, in);printf(“Please input the path of the out file:n“);scanf(“%s“, out);fin = freopen(in, “r“, stdin);fout = freopen(out, “w“, stdout);/* If success */if (!fin | !fout)printf(“Error open fi
10、le!n“);return;/* Read file */while (gets_s(message)for (int i = 0; i = A)tempi = ini - 7;elseif (ini = 0)tempi = ini - 0;/* Transfer to bit */bit64 key = 0x0;for (int i = 0; i = 8;/* Permutation */inline bit64 substitute(bit64 num, const int *table, size_t len)bit64 out = 0;/* Calculation */for (int
11、 i = 0; i (tablei - 1) / left bitskey |= temp;/ comparekey / delete highest four bitsreturn key;/* Bit recycle loop to right */inline bit28 MoveRight(bit28 key, int len)bit28 temp = 0;temp = key (28 - len);/ right bitskey = key = len;*R = num /* S box */inline bit32 SChange(bit48 num)bit32 key = 0;f
12、or (int i = 0; i 1) / the middle four bitsy = (num 5) / change to nextreturn key;/* F box */inline bit32 FChange(bit32 num, bit48 key)bit48 temp = substitute(num, E, sizeof(E) / sizeof(E0);temp = key;num = SChange(temp);return substitute(num, P, sizeof(P) / sizeof(P0);/* Key initialization */inline
13、void SetKey(char *in)bit64 key = ToBit(in);bit28 C, D;key = substitute(key, PC1, sizeof(PC1) / sizeof(PC10);divide(key, 28, for (int i = 0; i (i * 4);temp += (temp 9 ? 7 : 0);printf(“%c“, temp);/* Deciphering */inline void Decipher(char *message)bit64 BitMes = substitute(DeToBit(message), IP, sizeof
14、(IP) / sizeof(IP0);bit32 L, R, temp;divide(BitMes, 32, /* 16 rounds */for (int i = 15; i = 0; i-)temp = L;L = FChange(L, SubKeyi);L = R;R = temp;BitMes = (bit64)L | (bit64)R (i * 8);table.h 文件#pragma once/* IP permutation for plaintext */const int IP64 = 58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12,
15、 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,15, 7;/* IPR permutation to print */const int IPR64 = 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,
16、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;/*- premutation -*/* the expansion permutation */static int 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;/* C
17、ompression permutation */static int PC156 = 57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,10, 2,59,51,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;/* Number of key bits shifted per round */static int Move16 = 1, 1, 2, 2, 2, 2, 2, 2, 1,
18、 2, 2, 2, 2, 2, 2, 1;/* Compression permutation */static int PC248 = 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,34,33,48,44,49,39,56,34,53,46,42,50,36,29,32;/*- F function -*/* S boxes permutation */static int S8416 = /S114, 4,13, 1, 2,15,11, 8
19、, 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,/S215, 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,
20、 9, 3, 2,15,13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,/S310, 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,/S47,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4
21、,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, 4, 5,11,12, 7, 2,14,/S52,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
22、, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,/S612, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,10,15, 4, 2, 7,12, 0, 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, 5,15,10,11,14, 1, 7, 6, 0, 8,13,/S74,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,13, 0,11, 7, 4, 0
23、, 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,/S813, 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, 8,2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11;/* P boxes permutation */static 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;/* 16 subkey undefined */static unsigned long long SubKey16;
限制150内