版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录1.DES算法简介12.功能分析13.DES的工作方式23.1电子密码本模式(ECB)23.2 加密块链模式(CBC)23.3加密反馈模式(CFB)34.DES核心代码34.1加密解密函数35测试结果56总结61.DES算法简介DES Data Encryption Standard,DES起源于1973年美国国家标准局NBS征求国家密码标准方案。IBM就提交了其在20世纪60年代末设立的一个计算机密码编码学方面的研究项目的结果。这个项目在1971年底研制出了一种称为Lucifer的算法。它是当时提出的最好的算法,因而在1977年被选为数据加密标准,有效期为5年,随后在1983年、1987
2、年、1993年三次再度授权该算法续用5年。 DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。首先 ,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0左右两部分,每部分各长32位,并进行前后置换,(输入的第58位换到第1位,第50位换到第2位,依此类推,最后一位是原来的第7位),最终由L0输出左32位,R0输出右32位,根据这个法则经过16次迭代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出。 DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥:Data也
3、为8个字节64位,是要被加密或被解密的数据,Mode为DES的工作方式,有两种:加密或解密,如果Mode为加密,则用Key去把数据Data进行加密,生成Data的密码形式作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式作为DES的输出结果。在使用DES时,双方预先约定使用的“密码”即Key,然后用Key去加密数据;接收方得到密文后使用同样的Key解密得到原数据,这样便实现了安全性较高的数据传输。2.功能分析数据加密标准曾被美国国家标准局确定为联邦信息处理标准(FIPS PUB 46),使用广泛,特别是在金融领域,曾是对称密码体制事实上的
4、世界标准。目前在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、智能卡、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密。如信用卡持卡人的PIN的加密传输、IC卡与POS间的双向认证、金融交易数据包的MAC校验等均用到DES算法。因此,对于目前的电子交易市场以及一些商业领域DES依旧存在着广大的需求。 这次课程设计所完成的DES算法,主要是要实现对输入的一组数据,进行DES加密,加密模式分为ECB、CBC、CFB、OFB四种。函数接口是用户自定义的,我们将完成它的内部构造,并封装成dll,以供用户程序调用。该算法所要完成的工作主要是,用户输入密钥以及明文,然
5、后选择需要加密的方式。程序应该实现能判断用户输入的密钥长度是否正确以及输入的数据是否为空,在做出如上判断之后,还要对数据进行填充,填充的方式为,明文不足整块填充格式为L(1子节长度)+L个连续的0x80。比如刚好整块数据,最后填充7个0x80填充的数据为:0x07 0x80 0x80 0x80 0x80 0x80 0x80 0x80。再比如最后一块为7字节,那么填充的数据就为:0x00。在这些准备工作之后,方可对数据进行加密。在解密的时候,还要完成将填充的数据去掉,恢复以前输入的明文。3.DES的工作方式 3.1电子密码本模式(ECB)这种模式是最早采用和最简单的模式,它将加密的数据分成若干组
6、,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。一个64位的密钥,如果采用该模式加密,就是将要加密的数据分成每组64位的数据,如果最后一组不够64位,那么就补齐为64位,然后每组数据都采用DES算法的64位密钥进行加密。3.2 加密块链模式(CBC)CBC模式的加密首先也是将明文分成固定长度,(64位)的块,(P0P1.),然后将前面一个加密块输出的密文与下一个要加密的明文块进行XOR(异或)操作计算,将计算结果再用密钥进行加密得到密文。第一明文块加密的时候,因为前面没有加密的密文,所以需要一个初始化向量(IV)。跟ECB方式不一样,通过连接关系,使得密文跟明文不再是一一对应的
7、关系,破解起来更困难,而且克服了只要简单调换密文块可能达到目的的攻击。但是该加密模式的缺点是不能实时解密,也就是说,必须等到每8个字节都接受到之后才能开始加密,否则就不能得到正确的结果。这在要求实时性比较高的时候就显得不合适了。3.3加密反馈模式(CFB) 加密反馈模式(CFB)为了克服必须等待8个字节全部得到才能进行解密的缺点,采用了一个64位,(8个字节)的位移寄存器来获得密文。所以能够实现字符的实时加密和解密,不用再等到8个字节都接受到之后再进行解密。其他特性和CBC差不多。4.DES核心代码4.1加密解密函数 public byte DesEncrypt(byte des_data,
8、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 < unitcount; i+) byte tmpkey = new byte8; byte tmpdata = new byte8; Sy
9、stem.arraycopy(format_key, 0, tmpkey, 0, 8); System.arraycopy(format_data, i * 8, tmpdata, 0, 8); byte tmpresult = UnitDes(tmpkey, tmpdata, flag); System.arraycopy(tmpresult, 0, result_data, i * 8, 8); / 当前为解密过程,去掉加密时产生的填充位 byte decryptbytearray = null; if (flag = 0) int total_len = datalen; int del
10、ete_len = result_datatotal_len - 8 - 1; delete_len = (delete_len >= 1) && (delete_len <= 8) ? delete_len : 0; decryptbytearray = new bytetotal_len - delete_len - 8; boolean del_flag = true; for (int k = 0; k < delete_len; k+) if (delete_len != result_datatotal_len - 8 - (k + 1) del_
11、flag = false; if (del_flag = true) System.arraycopy(result_data, 0, decryptbytearray, 0, total_len- delete_len - 8); return (flag = 1) ? result_data : decryptbytearray; 5测试结果主界面:加密解密:6总结在做课程设计的过程中,我学会不少东西。大大提高了自己的编程能力和动手能力。与此同时,在这次的课程设计中我也看到了自己所存在的不足之处,通过这次课程设计,我更加系统的掌握了DES加密解密的过程及其原理,DES加密算法加密效率高,安
12、全性强的相关原理,为以后的学习打下坚实的基础,同时也让我认识到了自己的很多不足,这就在客观上要求自己在以后的学习过程中要更加努力。参考文献1张建 密码学原理及应用技术 清华大学出版社2 张仕 应用密码学 西安电子科技大学出版社3 杨波 现代密码学清华大学出版社完整代码:package 密码学;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class DES byte bytekey; public DES(String strKey) this.b
13、ytekey = strKey.getBytes(); / 声明常量字节数组 private 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,
14、 31, 23, 15, 7 ; / 64 private static final int 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
15、; / 64 private static final int 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 ; / 56 private static final int PC_2 = 14, 17,
16、 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 ; / 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, 1
17、7, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 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,
18、 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, 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,
19、 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, 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,
20、 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, 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, 1
21、4 , / 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, 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,
22、 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, 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
23、, 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, 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,
24、9, 0, 3, 5, 6, 11 ; private static final int LeftMove = 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 R
25、untimeException("Data Format Error !"); int flags = flag;/ 二进制加密密钥 int keydata = new int64;/ 二进制加密数据 int encryptdata = new int64; / 加密操作完成后的字节数组 byte EncryptCode = new byte8;/ 密钥初试化成二维数组 int KeyArray = new int1648;/ 将密钥字节数组转换成二进制字节数组 keydata = ReadDataToBirnaryIntArray(des_key);/ 将加密数据字节数组
26、转换成二进制字节数组 encryptdata = ReadDataToBirnaryIntArray(des_data);/ 初试化密钥为二维密钥数组 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
27、-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+) keyarrayij = K0PC_2j - 1; / 生成子密钥keyarrayij / 执行加密解密操作 private byte Encrypt(int timeData, int flag, int keyarray) int i; byte enc
28、rypt = new byte8; int flags = flag; int M = new int64; int MIP_1 = new int64; / 特别注意:xxxIPi-1等类似变换 for (i = 0; i < 64; i+) Mi = timeDataIPi - 1; / 明文IP变换 if (flags = 1) / 加密 for (i = 0; i < 16; i+) LoopF(M, i, flags, keyarray); else if (flags = 0) / 解密 for (i = 15; i > -1; i-) LoopF(M, i, f
29、lags, keyarray); for (i = 0; i < 64; i+) MIP_1i = MIP_1i - 1; / 进行IP-1运算 GetEncryptResultOfByteArray(MIP_1, encrypt);/ 返回加密数据 return encrypt; private int ReadDataToBirnaryIntArray(byte intdata) int i; int j; / 将数据转换为二进制数,存储到数组 int IntDa = new int8; for (i = 0; i < 8; i+) IntDai = intdatai; if
30、(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 void LeftBitMove(int k, int offset) int i; / 循环移位操作函数 int c0 = new int28; int d0 = new int28; int c1
31、 = 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) for (i = 0; i < 26; i+) / 循环左移两位 c1i = c0i + 2; d1i = d0i + 2; c126 = c00; d126 = d0
32、0; 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 = new int32; int RE = new int48; int S = new int86; int sBoxData = new int8; in
33、t 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按位作不进位加法运算 if (REi = 2) REi = 0; for (i = 0; i < 8; i+) / 48位分成8组 for (j
34、= 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 = sVal
35、uePi - 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
36、, byte 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 < 8; i+) valuei %= 256; if (valuei > 128) valuei -= 255; private byte ByteDataFormat(byte data, int flag) int len
37、= data.length; int padlen = 8 - (len % 8); int newlen = len + padlen; byte newdata = 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 = ByteDataFo
38、rmat(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 < unitcount; i+) byte tmpkey = new byte8; byte tmpdata = new byte8; System.arraycopy(format_key, 0, tmpkey, 0, 8); System.arraycopy(format_data, i * 8, tmpdata, 0, 8); byte tmpresult = UnitDes(tmpkey, tmpdata, flag); System.ar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑设计方案方案编制指南
- 报销流程优化与财务管理方案
- 商场宣传推广制度
- 医院医疗文书规范制度
- 商业银行贷款管理系统设计方案
- 项目学习特点及教学应用方案
- 军人专业技能培训课程设计方案
- 高职院校技能竞赛方案策划书
- 2024年小学寒假创新作业设计方案
- 施工企业项目管理制度汇编
- LKJ2000型监控装置控制模式行车安全与设备96课件
- 驿站转让协议书范本
- 2025年河北省职业院校技能大赛高职组(商务数据分析赛项)参考试题库(含答案)
- 《造血干细胞移植护理指南》课件
- 2025承揽加工订做合同范本
- 托幼机构传染病应急处置预案
- 合欢花苷类对泌尿系感染的抗菌作用
- 汕头市金平区2025届九年级数学第一学期期末检测试题含解析
- 2023年司法鉴定所党支部年终总结
- 肿瘤生物学1(完整版)
- 2023-2024学年广东省广州市小学数学二年级上册期末自我评估试题
评论
0/150
提交评论