文档库 最新最全的文档下载
当前位置:文档库 › 密码学实验—张润

密码学实验—张润

武汉理工大学Wuhan University Of Technology

密码学实验(报告)

基于DES算法的加密/解密的java编程实现

学院: 信息工程学院

专业: 通信与信息系统

班级: 1105 班

姓名: 张润

学号: 1049721102989

指导老师: 肖攸安

2012 年 04 月 8 日

一、实验目的

1.熟悉java运行环境

2.了解DES算法,掌握基本原理

3.运用DES算法原理和java编程实现加密解密过程

二、实验背景

据记载,公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用。

随着信息化和数字化社会的发展,人们对信息安全和保密的重要性认识不断提高,于是在1997年,美国国家标准局公布实施了“美国数据加密标准(DES)”,民间力量开始全面介入密码学的研究和应用中,采用的加密算法有DES、RSA、SHA等。随着对加密强度需求的不断提高,近期又出现了AES、ECC等。我国也相应提出了自己国家的ECC、SCB2、SCH等加密算法。

使用密码学可以达到以下目的:

1.保密性:防止用户的标识或数据被读取。

2.数据完整性:防止数据被更改。

3.身份验证:确保数据发自特定的一方。

随着计算机和通信网络的广泛应用,信息的安全性已经受到人们的普遍重视。信息安全已不仅仅局限于政治,军事以及外交领域,而且现在也与人们的日常生活息息相关。现在,密码学理论和技术已得到了迅速的发展,它是信息科学和技术中的一个重要研究领域。在近代密码学上值得一提的大事有两件:一是1977年美国国家标准局正式公布实施了美国的数据加密标准(DES),公开它的加密算法,并批准用于非机密单位及商业上的保密通信。密码学的神秘面纱从此被揭开。二是Diffie和Hellman联合写的一篇文章“密码学的新方向”,提出了适应网络上保密通信的公钥密码思想,拉开了公钥密码研究的序幕。

DES(Data Encryption Standard)是IBM公司于上世纪1977年提出的一种数据加密算法。在过去近三十年的应用中,还无法将这种加密算法完全、彻底地破解掉。而且这种算法的加解密过程非常快,至今仍被广泛应用,被公认为安全的。虽然近年来由于硬件技术的飞速发展,破解DES已经不是一件难事,但学者们似乎不甘心让这样一个优秀的加密算法从此废弃不用,于是在DES的基础上有开发了双重DE(DoubleDES,DDES)和三重DES(Triple DES,TDES)。

在国内,随着三金工程尤其是金卡工程的启动,DES 算法在POS、ATM、磁卡及智能卡(IC 卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN 码加密传输,IC 卡与POS 间的双向认证、金融交易数据包的MAC 校验等,均用到DES 算法。DES加密体制是ISO颁布的数据加密标准。因此研究DES还是有非常重要的意义。

三、实验原理

DES算法由加密、子密钥和解密的生成三部分组成。

1 加密

DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程如图3-1所示:

图3-1 DES算法加密过程

对DES算法加密过程图示的说明如下:

待加密的64比特明文串m,经过IP置换(初始置换)后,得到的比特串的下标列表如下:

表3-1:得到的比特串的下标列表

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

该比特串被分为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位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1(终结置换)后所得比特串的下标列表如下:

表3-2:置换后所得比特串的下标列表

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

经过置换IP-1后生成的比特串就是密文e。变换f(Ri-1,Ki):

它的功能是将32比特的输入再转化为32比特的输出。其过程如图3-2所示:

图3-2:将32比特的输入再转化为32比特的输出

f变换说明:输入Ri-1(32比特)经过变换E(扩展置换E)后,膨胀为48比特。膨胀后的比特串的下标列表如下:

表3-3:膨胀后的比特串的下标列表

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

膨胀后的比特串分为8组,每组6比特。各组经过各自的S盒后,又变为4比特(具体过程见后),合并后又成为32比特。该32比特经过P变换(压缩置换P)后,其下标列表如下:

表3-4:压缩置换P后的下标列表

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

经过P变换后输出的比特串才是32比特的f(Ri-1,Ki)S盒的变换过程: 任取一S 盒。见图3-3:

图3-3 S盒的变换过程

在其输入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表如图2-4所示)

图3-4 Si盒的输出

以上是DES算法加密原理

2 加密过程实现

DES加密过程主要有以下3个步骤

(1)初始置换:对于给定的明文分组x,通过初始置换表IP对x进行置换,得到一个64

位的输出串。如下表所示:

表3-5 初始置换表

58 50 12 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 14 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

即将输入的第58位换到第一位,第50位换到第2位,...,依此类推,最后一位是原来的第7位。对于所得到64位的输出串x0,记x0 = IP(x) = L0 R0,其中L0为x0的前32位,R0为x0的后32位。

例:设置换前的输入值为D1D2D3......D64,则经过初始置换后的结果为:L0=D58D50 (8)

R0=D57D49 (7)

(2)迭代变换:利用16轮循环,每轮循环使用子密钥对Li 和Ri进行分别处理,对输

出结果进行异或运算和交换操作,以实现数据和密钥的结合

(3)逆置换:类似的,经过16轮迭代后所得到的串R16 L16应用初始置换的逆置换IP-1,

获得密文y,即y = IP-1(R16 , L16)。如下表所示:

表3-6 逆置换表

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

3 子密钥的生成

64比特的密钥生成16个48比特的子密钥。其生成过程见图3-5

图3-5子密钥生成过程

64比特的密钥K,经过PC-1(置换A)后,生成56比特的串。其下标如表所示:

表3-7 生成56比特的串

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 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 28 20 12 4

该比特串分为长度相等的比特串C0和D0。然后C0和D0分别循环左移1位,得到C1和D1。C1和D1合并起来生成C1D1。C1D1经过PC-2(置换B)变换后即生成48比特的K1。K1的下标列表为:

表3-8 K1的下标列表

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

29

32

C1、D1分别循环左移LS2位,再合并,经过PC-2,生成子密钥K2……依次类推直至生成子密钥K16。注意:Lsi (I =1,2,….16)的数值是不同的。具体见下表:

表3-9 生成子密钥

迭代顺序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 左移位数

1

1

2

2

2

2

2

2

1

2

2

2

2

2

2

1

4 解密

DES 的解密过程和DES 的加密过程完全类似,只不过将16圈的子密钥序列K1,K2……K16的顺序倒过来。即第一圈用第16个子密钥K16,第二圈用K15,其余类推。 第一圈:

图3-6

加密后的结果

图3-7:加密后的结果

L=R15, R=L15⊕f(R15,K16)⊕f(R15,K16)=L15 同理R15=L14⊕f(R14,K15), L15=R14。 同理类推得 : L=R0, R=L0。

四、程序设计

1.程序开发平台及工具

软件版本:j2sdk1.4.2-12

平台:Windows XP

2.源代码:

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKey;

import java.security.NoSuchAlgorithmException;

import java.security.Security;

public class DES {

private KeyGenerator keygen; //KeyGenerator提供对称密钥生成器的功能,支持各种算法

private SecretKey deskey; //SecretKey负责保存对称密钥

private Cipher c; //Cipher负责完成加密或解密工作

private byte[] cipherByte; //该字节数组负责保存加密的结果

public DES(){

Security.addProvider(new com.sun.crypto.provider.SunJCE());

try {

keygen = KeyGenerator.getInstance("DES"); //实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常)

deskey = keygen.generateKey(); //生成密钥

c = Cipher.getInstance("DES"); //生成Cipher对象,指定其支持DES算法

}catch(NoSuchAlgorithmException ex){

ex.printStackTrace();

}catch(NoSuchPaddingException ex){

ex.printStackTrace();

}

}

/*对字符串str加密*/

public byte[] createEncryptor(String str){

try{c.init(Cipher.ENCRYPT_MODE, deskey); //ENCRYPT_MODE表示加密模式byte[] src = str.getBytes();

cipherByte = c.doFinal(src); //加密,结果保存进cipherByte

}catch(java.security.InvalidKeyException ex){

ex.printStackTrace();

}catch(javax.crypto.BadPaddingException ex){

ex.printStackTrace();

}catch(javax.crypto.IllegalBlockSizeException ex){

ex.printStackTrace();

}

return cipherByte;

}

/*对字节数组buff解密*/

public byte[] createDecryptor(byte[] buff){

try{c.init(Cipher.DECRYPT_MODE, deskey); //ENCRYPT_MODE表示解密模式cipherByte = c.doFinal(buff);//得到明文,存入cipherByte字符数组}catch(java.security.InvalidKeyException ex){

ex.printStackTrace();

}catch(javax.crypto.BadPaddingException ex){

ex.printStackTrace();

}catch(javax.crypto.IllegalBlockSizeException ex){

ex.printStackTrace();

}

return cipherByte;

}

public static void main(String[] args) throws Exception{

DES des = new DES();

String msg = "密码学有点意思";

System.out.println("明文是:" + msg);

byte[] enc = des.createEncryptor(msg);

System.out.println("密文是:" + new String(enc));

byte[] dec = des.createDecryptor(enc);

System.out.println("解密后的结果是:" + new String(dec));

}

}

五、运行结果

图4-1:运行结果

六、小结

本文的核心是基于DES算法分析的实现,DES的工作原理,DES的安全性及其应用,重点是对DES算法的流程做一个详细的描述,对算法的数学基础和函数描述也有比较详细的描述,应用JA V A语言实现DES的最基本的核心算法,从而对DES有更深的理解。

通过此次课程设计,不仅使自己对密码学有了初步了解,同时使自己对JA V A编程也有了一定的提高。基本掌握了JA V A结构化程序设计。并且熟悉掌握了密码学中一个重要的算法—DES密码算法,并且通过JA V A工具编程实现。感觉受益匪浅。

相关文档
相关文档 最新文档