《2022年网络安全DES算法java实现源代码 .pdf》由会员分享,可在线阅读,更多相关《2022年网络安全DES算法java实现源代码 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 public class DesUtil byte bytekey; public DesUtil(String strKey) this.bytekey = 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, 5
2、1, 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 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,
3、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, 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,
4、 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, 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、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 ; / 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,
6、 22, 11, 4, 25 ; / 32 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 2 private static final int S_Box = /S-盒/ S_Box1 14, 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
7、, 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, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 , 13, 8, 10, 1, 3, 15, 4, 2,
8、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, 15, 14, 3, 11, 5, 2, 12 , / S_Box4 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8
9、, 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, 13, 0, 14, 9 , 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8,
10、 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, 8 , 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
11、- - - - - - 第 2 页,共 11 页 - - - - - - - - - 3 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
12、, 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, 9, 0, 3
13、, 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 RuntimeException(D
14、ata 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);/ 将加密数据字节数组转换成二进制字节数组encryptdata = ReadDataTo
15、BirnaryIntArray(des_data);/ 初试化密钥为二维密钥数组名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 4 KeyInitialize(keydata, KeyArray); / 执行加密解密操作EncryptCode = Encrypt(encryptdata, flags, KeyArray); return EncryptCode; / 初试化密钥数组private void KeyInitial
16、ize(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 (i = 0; i 16; i+) LeftBitMove(K0, LeftMovei); / 特别注意: xxxIPi-1等类似变换for (j = 0; j 48; j+) keyarrayij = K0PC_2j - 1; / 生成子密钥keyarrayij / 执行加密解密操作private byte Enc
17、rypt(int timeData, int flag, int keyarray) int i; byte encrypt = 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) / 加密名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
18、 - - - - 第 4 页,共 11 页 - - - - - - - - - 5 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(byte intdata) int i; int j; / 将数据转换为二进制数,存储到
19、数组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+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - 6 IntVa(i * 8) + 7
20、) - 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 = 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 +
21、 1; d1i = d0i + 1; c127 = c00; d127 = d00; else if (offset = 2) for (i = 0; i 26; i+) / 循环左移两位c1i = c0i + 2; d1i = d0i + 2; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - 7 c126 = c00; d126 = d00; c127 = c01; d127 = d01; for (i = 0; i 28;
22、 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; int sValue = new int32; int RP = new int32; for (i
23、= 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按位作不进位加法运算名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - 8 if (REi =
24、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+) RPi = sVal
25、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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - -
26、- - - - - - 9 else Mi = L1i; Mi + 32 = R1i; private void GetEncryptResultOfByteArray(int data, 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 128) valuei -= 255; private byte ByteDataFormat(byte
27、data, int flag) int len = 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+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - -
28、- - - - - 10 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
29、; for (int i = 0; i = 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_flag = false; if (del_flag = true) 名师资料总结 - - -精品资料欢迎下载 - - - - - -
30、 - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 11 System.arraycopy(result_data, 0, decryptbytearray, 0, total_len- delete_len - 8); return (flag = 1) ? result_data : decryptbytearray; public static void main(String args) String key = 这是密钥 ; String data = 这是明文 ; DesUtil
31、 desUtil = new DesUtil(key); System.err.println(加密前明文: + data); / 加密后的byte 型的密文byte result = desUtil.DesEncrypt(data.getBytes(), 1); System.err.println(加密后密文: + new String(result); / 下句直接把byte 类型的密文解密System.err.println(解密后明文:+ new String(desUtil.DesEncrypt(result, 0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -