当前位置:文档之家› DES加密算法的JAVA实现

DES加密算法的JAVA实现

目录摘要 (3)一、目的与意义 (4)二、DES概述 (5)三、DES加解密算法原理 (7)1.加密 (6)2.子密钥生成 (11)3.解密 (13)四、加解密算法的实现 (14)1.软件版本 (14)2.平台 (14)3.源代码 (14)4.运行结果 (24)五、总结 (25)【摘要】1973年5月15 日,美国国家标准局(现在的美国国家标准就是研究所,即NIST)在联邦记录中公开征集密码体制,这一举措最终导致了数据加密标准(DES)的出现,它曾经成为世界上最广泛使用的密码体制。

DES由IBM开发,它是早期被称为Lucifer体制的改进。

DES在1975年3月17日首次在联邦记录中公布,在经过大量的公开讨论后,1977年2月15日DES被采纳为“非密级”应用的一个标准。

最初预期DES作为标准只能使用10~15年;然而,事实证明DES要长寿得多。

被采纳后,大约每隔5年就被评审一次。

DES的最后一次评审是在1999年1月。

本文阐述了DES发展现状及对网络安全的重要意义,并在此基础上对DES算法原理进行详细的介绍和分析。

通过应用DES算法加解密的具体实现,进一步加深对DES算法的理解,论证了DES算法具有加密快速且强壮的优点,适合对含有大量信息的文件进行加密,同时分析了DES算法密钥过短(56位)所带来的安全隐患。

【关键词】DES 加密解密明文密文一、目的与意义随着计算机和通信网络的广泛应用,信息的安全性已经受到人们的普遍重视。

信息安全已不仅仅局限于政治,军事以及外交领域,而且现在也与人们的日常生活息息相关。

现在,密码学理论和技术已得到了迅速的发展,它是信息科学和技术中的一个重要研究领域。

在近代密码学上值得一提的大事有两件:一是1977年美国国家标准局正式公布实施了美国的数据加密标准(DES),公开它的加密算法,并批准用于非机密单位及商业上的保密通信。

密码学的神秘面纱从此被揭开。

二是Diffie和Hellman联合写的一篇文章“密码学的新方向”,提出了适应网络上保密通信的公钥密码思想,拉开了公钥密码研究的序幕。

DES(Data Encryption Standard)是IBM公司于上世纪1977年提出的一种数据加密算法。

在过去近三十年的应用中,还无法将这种加密算法完全、彻底地破解掉。

而且这种算法的加解密过程非常快,至今仍被广泛应用,被公认为安全的。

虽然近年来由于硬件技术的飞速发展,破解DES已经不是一件难事,但学者们似乎不甘心让这样一个优秀的加密算法从此废弃不用,于是在DES的基础上有开发了双重DES(DoubleDES,DDES)和三重DES(Triple DES,TDES)。

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

DES加密体制是ISO颁布的数据加密标准。

因此研究DES还是有非常重要的意义。

二、DES概述DES的前身是IBM的Lucifer算法,后经美国联邦采用这个算法后更名为数据加密标准。

DES是一种块加密算法,每块长64比特。

DES的密钥长度也是64比特,但由于其中的8,16,24,32,48,56,64为作为奇偶校验位,所以实际的密钥只有56比特。

DES利用了香农提出的混淆和扩散的概念。

DES共有16论,每一轮都进行混淆和扩散。

DES主要有三个步骤:(1)利用初始置换函数IP对64比特明文块进行初始置换。

将初始置换的输出分成联邦,分别表示为左明文L0和右明文R0。

(2)进行16次迭代,迭代规则如下:L i=R i,R i=L i-1⊕f(R i-1,K i)。

其中L i和R i分别表示第i轮的左半部和右半部。

f()是运算函数,K i是长为48位的子密钥。

子密钥K1,K2,……,K16是根据56比特的密钥K计算而来的。

(3)对比特串R16L16使用逆置换IP-1得到密文。

在DES被提出时,曾出现过很多批评,其中之一就是针对S盒。

DES里的所有计算,除了S盒,全是线性的也就是说,计算两个输出的异或与先将两个对应输入异或再计算其输出是相同的。

作为非线性部分,S盒对密码体制的安全性至关重要。

在DES刚提出时就有人怀疑S盒里隐藏了“陷门(trapdoor)”,而美国国家安全局能够轻易的解密消息。

当然,无法否定这样的猜测,但到目前为止也没有任何证据能证明DES里有陷门。

事实上,后来表明DES里的S盒是被设计来防止模型攻击的。

对DES最中肯的批评是,密钥空间的规模是256,对实际安全而言确实太小了。

对于穷举法,一台每毫秒执行一次DES加密的计算机需要一千年才能破解密文。

然而,早在1977年Diffie和Hellman就指出,若用现有技术造一台并行机,它带有1百万个加密机,每个加密机都可以每毫秒执行一次DES 加密,那么穷举时间大约10小时。

他们估计这台计算机造价两千万。

1998年7月当EFF(Electronic Frontier Foundation)宣布一台造价不到25万美元、为特殊目的设计的“DES破译机”破译了DES时,DES终于被清楚地证明是不安全的。

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

现将DES算法介绍如下。

1.加密DES算法处理的数据对象是一组64比特的明文串。

设该明文串为m=m1m2…m64 (mi=0或1)。

明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。

其加密过程图示如下:DES算法加密过程对DES算法加密过程图示的说明如下:待加密的64比特明文串m,经过IP置换(初始置换)后,得到的比特串的下标列表如下:IP58 50 42 34 26 18 10 260 52 44 36 28 20 12 462 54 46 38 30 22 14 664 56 48 40 32 24 16 857 49 41 33 25 17 9 159 51 43 35 27 19 11 361 53 45 37 29 21 13 563 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(终结置换)后所得比特串的下标列表如下: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比特的输出。

其过程如图所示:f变换说明:输入Ri-1(32比特)经过变换E(扩展置换E)后,膨胀为48比特。

膨胀后的比特串的下标列表如下: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)后,其下标列表如下: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盒。

见图:在其输入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表如图所示)以上是DES算法加密原理加密过程实现(JAVA主要源代码)●输入64位明文串,经过IP置换:for (i = 0; i < 64; i++) {M[i] = timeData[IP[i] - 1];}●迭代(由于各次迭代的方法相同只是输入输出不同,因此以任意一次为例):首先进行S盒的运算。

输入32位比特串, 经过E变换,由32位变为48位:for (i = 0; i < 48; i++) {RE[i] = R0[E[i] - 1];与keyarray[times][i]按位作不进位加法运:RE[i] = RE[i] + keyarray[times][i];if (RE[i] == 2) {RE[i] = 0;}48位分成8组:for(i=0;i<8;i++){for(j=0;j<6;j++){S[i][j]=RE[(i*6)+j];}}经过S盒,得到8个数:sBoxData[i] = S_Box[i][(S[i][0] << 1) + S[i][5]][(S[i][1] << 3)+ (S[i][2] << 2) + (S[i][3] << 1) + S[i][4]];将8个数变换输出二进制:for (j = 0; j < 4; j++) {sValue[((i * 4) + 3) - j] = sBoxData[i] % 2;sBoxData[i] = sBoxData[i] / 2;}经过P变换:RP[i] = sValue[P[i] - 1];至此,S盒运算完成左右交换:L1[i] = R0[i];R1[i] = L0[i] + RP[i];Ri为Li-1与f(R,K)进行不进位二进制加法运算结果:R1[i] = L0[i] + RP[i];if (R1[i] == 2) {R1[i] = 0; }各次迭代类似,可以依此类推。

相关主题