《2022年DES加密算法实验报告.pdf》由会员分享,可在线阅读,更多相关《2022年DES加密算法实验报告.pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、苏 州 科 技 学 院实验报告学生姓名:杨刘涛学 号:17 指导教师:陶滔刘学书 14实验地点:计算机学院大楼东309 实验时间: 2015-04-20一、 实验室名称:软件实验室二、实验项目名称: DES加解密算法实现三、实验学时: 4 学时四、实验原理:DES 算法由加密、子密钥和解密的生成三部分组成。 现将 DES算法介绍如下。1加密DES 算 法 处 理 的 数 据对 象是 一组 64 比 特 的 明 文 串 。 设 该 明文 串为m=m1m2m64 (mi=0 或 1) 。明文串经过 64 比特的密钥 K来加密,最后生成长度为 64 比特的密文 E。其加密过程图示如下:图 2-1:D
2、ES算法加密过程对 DES算法加密过程图示的说明如下:待加密的 64 比特明文串 m ,经过 IP 置换(初始置换)后,得到的比特串的下标列表如下:精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 12 页 - - - - - - - - - - 表 2-1:得到的比特串的下标列表IP58504234261810260524436282012462544638302214664564840322416857494133251791595143352719113615345372921135635
3、547393123157该比特串被分为32位的 L0 和 32位的 R0两部分。 R0子密钥 K1(子密钥的生成将在后面讲 )经过变换 f(R0,K1) (f 变换将在下面讲)输出32 位的比特串f1,f1与 L0做不进位的二进制加法运算。运算规则为:f1 与 L0 做不进位的二进制加法运算后的结果赋给R1 ,R0则原封不动的赋给 L1。L1 与 R0又做与以上完全相同的运算,生成L2,R2 一共经过 16 次运算。最后生成 R16和 L16。其中 R16为 L15 与 f(R15,K16) 做不进位二进制加法运算的结果, L16是 R15的直接赋值。R16与 L16 合并成 64 位的比特串
4、。值得注意的是 R16一定要排在 L16 前面。R16与 L16 合并后成的比特串, 经过置换 IP-1(终结置换) 后所得比特串的下标列表如下:表 2-2:置换后所得比特串的下标列表IP-140848165624643239747155523633138646145422623037545135321612936444125220602835343115119592734242105018582633141949175725经过置换 IP-1 后生成的比特串就是密文e。变换 f(Ri-1,Ki):它的功能是将 32比特的输入再转化为32比特的输出。其过程如图 2-2 所示:精品资料 - -
5、- 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 12 页 - - - - - - - - - - 图 2-2:将 32 比特的输入再转化为32 比特的输出 f变换说明:输入 Ri-1(32 比特)经过变换 E (扩展置换 E)后,膨胀为48 比特。膨胀后的比特串的下标列表如下:表 2-3:膨胀后的比特串的下标列表E:3212345456789891011121312131415161716171819202120212223242524252627282928293031321膨胀后的比特串分为8 组,每组 6
6、 比特。各组经过各自的S盒后,又变为 4比特( 具体过程见后 ) ,合并后又成为 32 比特。该 32 比特经过 P变换(压缩置换P)后,其下标列表如下:表 2-4:压缩置换 P后的下标列表P:1672021291228171152326518311028241432273919133062211425经过 P变换后输出的比特串才是32 比特的 f (Ri-1,Ki ).S盒的变换过程 : 任取一 S盒。见图 2-3:图 2-3在其输入 b1,b2,b3,b4,b5,b6中,计算出 x=b1*2+b6, y=b5+b4*2+b3*4+b2*8,再从 Si 表中查出 x 行,y 列的值 Sxy。
7、将 Sxy 化为二进制,即得 Si 盒的输出。 (S表如图 2-4 所示)精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 12 页 - - - - - - - - - - 图 2-4以上是 DES算法加密原理五、实验目的:了解 DES 加密算法及原理,掌握其基本应用。六、实验内容:了解 DES 加密算法及原理,掌握其基本应用,利用java 编程实现。七、实验器材(设备、元器件) :(1) PC(2) Windows 系统平台(3) java 程序开发环境。八、源代码:package Windo
8、wsDemo;publicclass DesUtil byte bytekey ;public DesUtil(String strKey) = (); / 声明常量字节数组privatestaticfinalint IP = 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, 6
9、1, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 ; / 64privatestaticfinalint IP_1 = 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,
10、18, 58, 26, 33, 1, 41, 9, 49,精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 12 页 - - - - - - - - - - 17, 57, 25 ; / 64privatestaticfinalint PC_1 = 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, 3
11、1, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 ; / 56privatestaticfinalint PC_2 = 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,
12、 29, 32 ; / 48privatestaticfinalint E = 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 ; / 48privatestaticfinalint P = 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18
13、, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 ; / 32privatestaticfinalint S_Box = /S- 盒 / S_Box1 14, 4, 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,
14、9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 , / S_Box2 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, 14, 9 , / S_Box3 10, 0, 9, 14, 6, 3, 15,
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 , / S_Box4 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,
16、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 , / S_Box5 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 , 1
17、1, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 , / S_Box6 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 ,精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 12 页 - - - - - - - - - - 9, 14, 15, 5, 2, 8, 12, 3, 7
18、, 0, 4, 10, 1, 13, 11, 6 , 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 , / S_Box7 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,
19、2, 3, 12 , / S_Box8 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, 8 , 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 ;privatestaticfinalint LeftMove = 1, 1, 2, 2, 2, 2, 2, 2, 1, 2
20、, 2, 2,2, 2, 2, 1 ; / 左移位置列表privatebyte UnitDes(byte des_key, byte des_data, int flag) / 检测输入参数格式是否正确,错误直接返回空值(null )if ( != 8) | != 8)| (flag != 1) & (flag != 0) thrownew RuntimeException(Data Format Error !); int flags = flag;/ 二进制加密密钥int keydata = new int 64;/ 二进制加密数据int encryptdata = new int 64;
21、 / 加密操作完成后的字节数组byte EncryptCode = new byte 8;/ 密钥初试化成二维数组int KeyArray = new int 1648;/ 将密钥字节数组转换成二进制字节数组 keydata = ReadDataToBirnaryIntArray(des_key);/ 将加密数据字节数组转换成二进制字节数组 encryptdata = ReadDataToBirnaryIntArray(des_data);/ 初试化密钥为二维密钥数组 KeyInitialize(keydata, KeyArray); / 执行加密解密操作 EncryptCode = Encr
22、ypt(encryptdata, flags, KeyArray);return EncryptCode; / 初试化密钥数组privatevoid KeyInitialize(int key, int keyarray) int i;int j;int K0 = new int 56;/ 特别注意: xxxIPi-1等类似变换for (i = 0; i 56; i+) K0i = keyPC_1i - 1; / 密钥进行 PC-1变换 for (i = 0; i 16; i+) LeftBitMove(K0, LeftMovei); / 特别注意: xxxIPi-1等类似变换for (j =
23、 0; j 48; j+) 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 12 页 - - - - - - - - - - keyarrayij = K0PC_2j - 1; / 生成子密钥 keyarrayij / 执行加密解密操作privatebyte Encrypt(int timeData, int flag, int keyarray) int i;byte encrypt = new byte 8;int flags = flag;int M = new int 64;int M
24、IP_1 = new int 64;/ 特别注意: xxxIPi-1等类似变换for (i = 0; i 64; i+) Mi = timeDataIPi - 1; / 明文IP 变换 if (flags = 1) / 加密for (i = 0; i -1; i-) LoopF(M, i, flags, keyarray); for (i = 0; i 64; i+) MIP_1i = MIP_1i - 1; / 进行IP-1 运算 GetEncryptResultOfByteArray(MIP_1, encrypt);/ 返回加密数据return encrypt; privateint Re
25、adDataToBirnaryIntArray(byte intdata) int i;int j;/ 将数据转换为二进制数,存储到数组int IntDa = new int 8;for (i = 0; i 8; i+) IntDai = intdatai;if (IntDai 0) IntDai += 256; IntDai %= 256; int IntVa = new int 64;for (i = 0; i 8; i+) for (j = 0; j 8; j+) 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - -
26、- - -第 7 页,共 12 页 - - - - - - - - - - IntVa(i * 8) + 7) - j = IntDai % 2; IntDai = IntDai / 2; return IntVa; privatevoid LeftBitMove(int k, int offset) int i;/ 循环移位操作函数int c0 = new int 28;int d0 = new int 28;int c1 = new int 28;int d1 = new int 28;for (i = 0; i 28; i+) c0i = ki; d0i = ki + 28; if (o
27、ffset = 1) for (i = 0; i 27; i+) / 循环左移一位 c1i = c0i + 1; d1i = d0i + 1; c127 = c00; d127 = d00; elseif (offset = 2) for (i = 0; i 26; i+) / 循环左移两位 c1i = c0i + 2; d1i = d0i + 2; c126 = c00; d126 = d00; c127 = c01; d127 = d01; for (i = 0; i 28; i+) ki = c1i; ki + 28 = d1i; privatevoid LoopF( int M, in
28、t times, int flag, int keyarray) int i;int j;int L0 = new int 32;int R0 = new int 32;精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 8 页,共 12 页 - - - - - - - - - - int L1 = new int 32;int R1 = new int 32;int RE = new int 48;int S = new int 86;int sBoxData = new int 8;int sValue
29、= new int 32;int RP = new int 32;for (i = 0; i 32; i+) L0i = Mi; / 明文左侧的初始化 R0i = Mi + 32; / 明文右侧的初始化 for (i = 0; i 48; i+) REi = R0Ei - 1; / 经过 E变换扩充,由 32位变为 48位 REi = REi + keyarraytimesi; / 与KeyArraytimesi按位作不进位加法运算if (REi = 2) REi = 0; for (i = 0; i 8; i+) / 48位分成 8组for (j = 0; j 6; j+) Sij = RE
30、(i * 6) + j; / 下面经过 S盒,得到 8个数 sBoxDatai = S_Boxi(Si0 1) + Si5(Si1 3) + (Si2 2) + (Si3 1) + Si4;/ 8个数变换输出二进制for (j = 0; j 4; j+) sValue(i * 4) + 3) - j = sBoxDatai % 2; sBoxDatai = sBoxDatai / 2; for (i = 0; i 32; i+) RPi = sValuePi - 1; / 经过 P变换 L1i = R0i; / 右边移到左边 R1i = L0i + RPi;if (R1i = 2) R1i =
31、 0; / 重新合成 M ,返回数组 M/ 最后一次变换时,左右不进行互换。此处采用两次变换实现不变if (flag = 0) & (times = 0) | (flag = 1) & (times = 15) Mi = R1i; Mi + 32 = L1i;精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 9 页,共 12 页 - - - - - - - - - - else Mi = L1i; Mi + 32 = R1i; privatevoid GetEncryptResultOfByteArray(
32、int data, byte value) int i;int j; / 将存储 64位二进制数据的数组中的数据转换为八个整数(byte )for (i = 0; i 8; i+) for (j = 0; j 8; j+) valuei += (data(i 3) + j (7 - j); for (i = 0; i 128) valuei -= 255; privatebyte ByteDataFormat(byte data, int flag) int len = ;int padlen = 8 - (len % 8);int newlen = len + padlen;byte new
33、data = new byte newlen; (data, 0, newdata, 0, len);for ( int i = len; i newlen; i+) newdatai = (byte ) padlen;return newdata; publicbyte DesEncrypt(byte des_data, int flag) byte format_key = ByteDataFormat(bytekey , flag);byte format_data = ByteDataFormat(des_data, flag);int datalen = ;int unitcount
34、 = datalen / 8;byte result_data = new byte datalen;for ( int i = 0; i = 1) & (delete_len = 8) ? delete_len : 0; decryptbytearray = new byte total_len - delete_len - 8;boolean del_flag = true ;for ( int k = 0; k delete_len; k+) if (delete_len != result_datatotal_len - 8 - (k + 1) del_flag = false ; i
35、f (del_flag = true ) (result_data, 0, decryptbytearray, 0, total_len- delete_len - 8); return (flag = 1) ? result_data : decryptbytearray; publicstaticvoid main(String args) String key = 这是密钥 ; String data = 这是明文 ; DesUtil desUtil = new DesUtil(key);加密前明文: + data);/ 加密后的 byte 型的密文byte result = (), 1
36、);加密后密文: + new String(result);/ 下句直接把 byte 类型的密文解密解密后明文: + new String(result, 0); 九实验截图十、实验结论:本文的论述是基于DES 算法分析的实现, DES 的工作模式, DES的安精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 11 页,共 12 页 - - - - - - - - - - 全性及其应用, 重点对 DES对 DES算法的流程做一个详细的描述, 对算法的数学基础和函数描述也有比较详细的描述,应用JAVA语言实现 DES的最基本的核心算法,从而对 DES有更深的理解。通过此次课程设计, 不仅使自己对信息安全有了初步了解,同时使自己编程能力有了较大的提高。基本掌握了JAVA结构化程序设计。并且熟悉掌握了密码学中一个重要的算法 DES密码算法,并且通过JAVA工具编程实现。但是由于对 JAVA的图形用户界面的设计理解不深,编写的窗口无法对时间进行处理,最终只有放弃编写窗口。报告评分:指导教师签字:精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 12 页,共 12 页 - - - - - - - - - -