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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

DES加密算法实验报告材料.docx

1、DES加密算法实验报告材料某某科技学院实验报告学生某某:杨X涛学号:1220126117 指导教师:陶滔 X学书 1220126114实验地点:计算机学院大楼东309 实验时间:2015-04-20一、实验室名称:软件实验室二、实验项目名称:DES加解密算法实现三、实验学时:4学时四、实验原理:DES算法由加密、子密钥和解密的生成三局部组成。现将DES算法介绍如下。1加密DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:图2-1:DES算法加密过程对DES算法加

2、密过程图示的说明如下:待加密的64比特明文串m,经过IP置换初始置换后,得到的比特串的下标列表如下:表2-1:得到的比特串的下标列表IP58504234261810260524436282012462544638302214664564840322416857494133251791595143352719113615345372921135635547393123157该比特串被分为32位的L0和32位的R0两局部。R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)f变换将在下面讲输出32位的比特串f1,f1与L0做不进位的二进制加法运算。运算规如此为:f1与L0做不进位的二进

3、制加法运算后的结果赋给R1,R0如此原封不动的赋给L1。L1与R0又做与以上完全一样的运算,生成L2,R2 一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。R16与L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1终结置换后所得比特串的下标列表如下:表2-2:置换后所得比特串的下标列表IP-140848165624643239747155523633138646145422623037545135321612936444125220602

4、835343115119592734242105018582633141949175725经过置换IP-1后生成的比特串就是密文e。变换f(Ri-1,Ki):它的功能是将32比特的输入再转化为32比特的输出。其过程如图2-2所示:图2-2:将32比特的输入再转化为32比特的输出f变换说明:输入Ri-1(32比特)经过变换E扩展置换E后,膨胀为48比特。膨胀后的比特串的下标列表如下:表2-3:膨胀后的比特串的下标列表E:3212345456789891011121312131415161716171819202120212223242524252627282928293031321膨胀后的比特串

5、分为8组,每组6比特。各组经过各自的S盒后,又变为4比特(具体过程见后),合并后又成为32比特。该32比特经过P变换压缩置换P后,其下标列表如下:表2-4:压缩置换P后的下标列表P:1672021291228171152326518311028241432273919133062211425经过P变换后输出的比特串才是32比特的fRi-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。将Sxy化为二进制,即得Si盒的输出。S表如图

6、2-4所示图2-4以上是DES算法加密原理五、实验目的:了解DES加密算法与原理,掌握其根本应用。六、实验内容:了解DES加密算法与原理,掌握其根本应用,利用java编程实现。七、实验器材设备、元器件:(1)PC(2)(3)java程序开发环境。八、源代码:package WindowsDemo;publicclass DesUtil byte bytekey;public DesUtil(String strKey) this.bytekey = strKey.getBytes(); / 声明常量字节数组privatestaticfinalint IP = 58, 50, 42, 34, 2

7、6, 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, 15, 7 ; / 64privatestaticfinalint IP_1 = 40, 8, 48, 16, 56, 24, 64, 32, 39, 7

8、, 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 ; / 64privatestaticfinalint PC_1 = 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 1

9、0, 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 ; / 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, 4

10、7, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 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 ; / 48private

11、staticfinalint P = 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 ; / 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,

12、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 , / 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

13、, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 , / S_Box3 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 , / S_Box4 7, 13, 14, 3, 0, 6, 9, 10,

14、 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, 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,

15、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 , / 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 , 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 , 4,

16、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, 2, 3, 12 , / S_Box8 13, 2, 8,

17、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, 2, 2,2, 2, 2, 1 ; / 左移位置列表pr

18、ivatebyte UnitDes(byte des_key, byte des_data, int flag) / 检测输入参数格式是否正确,错误直接返回空值nullif (des_key.length != 8) | (des_data.length != 8)| (flag != 1) & (flag != 0) thrownew RuntimeException(Data Format Error !); int flags = flag;/ 二进制加密密钥int keydata = newint64;/ 二进制加密数据int encryptdata = newint64; / 加密操

19、作完成后的字节数组byte EncryptCode = newbyte8;/ 密钥初试化成二维数组int KeyArray = newint1648;/ 将密钥字节数组转换成二进制字节数组 keydata = ReadDataToBirnaryIntArray(des_key);/ 将加密数据字节数组转换成二进制字节数组 encryptdata = ReadDataToBirnaryIntArray(des_data);/ 初试化密钥为二维密钥数组 KeyInitialize(keydata, KeyArray); / 执行加密解密操作 EncryptCode = Encrypt(encryp

20、tdata, flags, KeyArray);return EncryptCode; / 初试化密钥数组privatevoid KeyInitialize(int key, int keyarray) int i;int j;int K0 = newint56;/ 特别注意: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 = 0; j 48; j+) k

21、eyarrayij = K0PC_2j - 1; / 生成子密钥keyarrayij / 执行加密解密操作privatebyte Encrypt(int timeData, int flag, int keyarray) int i;byte encrypt = newbyte8;int flags = flag;int M = newint64;int MIP_1 = newint64;/ 特别注意:xxxIPi-1等类似变换for (i = 0; i 64; i+) Mi = timeDataIPi - 1; / 明文IP变换 if (flags = 1) / 加密for (i = 0;

22、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 ReadDataToBirnaryIntArray(byte intdata) int i;int j;/ 将数据转换为二进制数,存储到数组int IntDa = newint8;for (i = 0; i 8; i+) IntDai = intdata

23、i;if (IntDai 0) IntDai += 256; IntDai %= 256; int IntVa = newint64;for (i = 0; i 8; i+) for (j = 0; j 8; j+) IntVa(i * 8) + 7) - j = IntDai % 2; IntDai = IntDai / 2; return IntVa; privatevoid LeftBitMove(int k, int offset) int i;/ 循环移位操作函数int c0 = newint28;int d0 = newint28;int c1 = newint28;int d1

24、= newint28;for (i = 0; i 28; i+) c0i = ki; d0i = ki + 28; if (offset = 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;

25、i 28; i+) ki = c1i; ki + 28 = d1i; privatevoid LoopF(int M, int times, int flag, int keyarray) int i;int j;int L0 = newint32;int R0 = newint32;int L1 = newint32;int R1 = newint32;int RE = newint48;int S = newint86;int sBoxData = newint8;int sValue = newint32;int RP = newint32;for (i = 0; i 32; i+) L

26、0i = 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(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 = 0; / 重新合成M,返回数组M/ 最后一次变换时,左右不进展

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1