DES加密算法实验报告_第1页
DES加密算法实验报告_第2页
DES加密算法实验报告_第3页
DES加密算法实验报告_第4页
DES加密算法实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、苏 州 科 技 学 院实 验 报 告学生姓名:杨刘涛 学 号:1220126117 指导教师:陶滔 刘学书 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-14084816562464323974715552363313864614542262303754513532161293644412522

4、0602835343115119592734242105018582633141949175725经过置换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比特的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。将sxy化为二进制,即得

6、si盒的输出。(s表如图2-4所示)图2-4以上是des算法加密原理五、实验目的:了解des加密算法及原理,掌握其基本应用。六、实验内容:了解des加密算法及原理,掌握其基本应用,利用java编程实现。七、实验器材(设备、元器件):(1) pc(2) windows 8.1系统平台(3) java程序开发环境。八、源代码:package windowsdemo;public class desutil byte bytekey; public desutil(string strkey) this.bytekey = strkey.getbytes(); / 声明常量字节数组 private

7、static final int 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, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 ; / 64 private static final int

8、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, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 ; / 64 private static final int pc_1 = 57, 49,

9、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 ; / 56 private static final int pc_2 = 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12

10、, 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 ; / 48 private static final int 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,

11、25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1 ; / 48 private static final int 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 ; / 32 private static final int s_box = /s-盒 / s_box1 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0,

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

13、1, 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, 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

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

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

17、8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 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 ; private static final int le

18、ftmove = 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2,2, 2, 2, 1 ; / 左移位置列表 private byte unitdes(byte des_key, byte des_data, int flag) / 检测输入参数格式是否正确,错误直接返回空值(null) if (des_key.length != 8) | (des_data.length != 8)| (flag != 1) & (flag != 0) throw new runtimeexception(data format error !); int flags = flag;/

19、 二进制加密密钥 int keydata = new int64;/ 二进制加密数据 int encryptdata = new int64; / 加密操作完成后的字节数组 byte encryptcode = new byte8;/ 密钥初试化成二维数组 int keyarray = new int1648;/ 将密钥字节数组转换成二进制字节数组 keydata = readdatatobirnaryintarray(des_key);/ 将加密数据字节数组转换成二进制字节数组 encryptdata = readdatatobirnaryintarray(des_data);/ 初试化密钥

20、为二维密钥数组 keyinitialize(keydata, keyarray); / 执行加密解密操作 encryptcode = encrypt(encryptdata, flags, keyarray); return encryptcode; / 初试化密钥数组 private void keyinitialize(int key, int keyarray) int i; int j; int k0 = new int56;/ 特别注意:xxxipi-1等类似变换 for (i = 0; i 56; i+) k0i = keypc_1i - 1; / 密钥进行pc-1变换 for (

21、i = 0; i 16; i+) leftbitmove(k0, leftmovei); / 特别注意:xxxipi-1等类似变换 for (j = 0; j 48; j+) keyarrayij = k0pc_2j - 1; / 生成子密钥keyarrayij / 执行加密解密操作 private byte encrypt(int timedata, int flag, int keyarray) int i; byte encrypt = new byte8; int flags = flag; int m = new int64; int mip_1 = new int64;/ 特别注意

22、: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; private int readdatatobirnaryintarray

23、(byte intdata) int i; int j; / 将数据转换为二进制数,存储到数组 int intda = new int8; for (i = 0; i 8; i+) intdai = intdatai; if (intdai 0) intdai += 256; intdai %= 256; int intva = new int64; for (i = 0; i 8; i+) for (j = 0; j 8; j+) intva(i * 8) + 7) - j = intdai % 2; intdai = intdai / 2; return intva; private vo

24、id leftbitmove(int k, int offset) int i; / 循环移位操作函数 int c0 = new int28; int d0 = new int28; int c1 = new int28; int d1 = new int28; 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; else if (offset = 2)

25、 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; private void loopf(int m, int times, int flag, int keyarray) int i; int j; int l0 = new int32; int r0 = new int32; int l1 = new int32; int r1 =

26、 new int32; int re = new int48; int s = new int86; int sboxdata = new int8; int svalue = new int32; int rp = new int32; 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按位作不进位加法

27、运算 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+

28、) rpi = svaluepi - 1; / 经过p变换 l1i = r0i; / 右边移到左边 r1i = l0i + rpi; if (r1i = 2) r1i = 0; / 重新合成m,返回数组m / 最后一次变换时,左右不进行互换。此处采用两次变换实现不变 if (flag = 0) & (times = 0) | (flag = 1) & (times = 15) mi = r1i; mi + 32 = l1i; else mi = l1i; mi + 32 = r1i; private void getencryptresultofbytearray(int data, byte

29、 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; private byte bytedataformat(byte data, int flag) int len = data.length; int padlen = 8 - (len % 8); int newlen = len + padlen; byte ne

30、wdata = new bytenewlen; system.arraycopy(data, 0, newdata, 0, len); for (int i = len; i newlen; i+) newdatai = (byte) padlen; return newdata; public byte desencrypt(byte des_data, int flag) byte format_key = bytedataformat(bytekey, flag); byte format_data = bytedataformat(des_data, flag); int datalen = format_data.length; int unitcount = datalen / 8; byte result_data = new bytedatalen; for (int i = 0; i = 1) & (delete_len =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论