武汉理工大学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工具编程实现。感觉受益匪浅。