DES加解密算法实现
2016-10-26 13:38
274 查看
上一篇文章讲了下DES加密算法的原理,这篇文章主要是实现,将之前写的代码贴出来
封装DES加密系统中用到的数据
生成回合密钥
封装DES加密系统中用到的数据
public class Variable { int[] KPArray = { 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 }; int[] LeftMoveTimesArray = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; int[] CPArray = { 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 }; int[] IPArray = { 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 }; int[] EPArray = { 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 }; int[][][] SBoxArray = { { { 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, 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 } }, { { 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, 11, 6, 7, 12, 0, 5, 14, 9 } }, { { 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 } }, { { 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, 14 } }, { { 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 } }, { { 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 }, { 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 } }, { { 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, 10, 15, 6, 8, 0, 5, 9, 2 }, { 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 } }, { { 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, 5, 6, 11 } } }; int[] PBoxArray = { 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 }; int[] FPArray = { 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 }; /* * Output the rounded ciphertext */ protected void outputCiphertext(String[] r, String[] l, String ciphertext, String ciphertext1, String ciphertext2, int rounds) { while (r[rounds].length() < 32) { r[rounds] = '0' + r[rounds]; } ciphertext1 = Long.toHexString(Long.parseLong(l[rounds], 2)); while (ciphertext1.length() < 8) { ciphertext1 = '0' + ciphertext1; } ciphertext2 = Long.toHexString(Long.parseLong(r[rounds], 2)); while (ciphertext2.length() < 8) { ciphertext2 = '0' + ciphertext2; } ciphertext = ciphertext1 + ciphertext2; System.out.println(" " + ciphertext); } /* * Range Ciphertext or Message according to Initial Permutation (IPArray) */ protected String rangeTextByInitialPermutation(String text) { int ipLength = IPArray.length; StringBuilder sc = new StringBuilder(); for (int i = 0; i < ipLength; i++) { sc.append(text.charAt(IPArray[i] - 1)); } return sc.toString(); } /* * science security */ protected String fFunction(String r, String roundkey) { int epLength = EPArray.length; int p_BoxLength = PBoxArray.length; StringBuilder sc = new StringBuilder(); StringBuilder sc1 = new StringBuilder(); String s = ""; String s1 = ""; // extend R By Expansion Permutation (EPArray) for (int i = 0; i < epLength; i++) { sc.append(r.charAt(EPArray[i] - 1)); } s = sc.toString(); sc.delete(0, sc.length()); // make the extended r Exclusive-or round key String orString = Long.toBinaryString(Long.parseLong(s, 2) ^ Long.parseLong(roundkey, 2)); while (orString.length() < 48) { orString = '0' + orString; } String[] s_box = new String[8]; // Range R according to S-BOX (SBoxArray) for (int i = 0; i < 8; i++) { if (i != 7) { s_box[i] = orString.substring(i * 6, i * 6 + 6); } else { s_box[i] = "" + orString.substring(i * 6); } s = "" + s_box[i].charAt(0) + s_box[i].charAt(5); s1 = s_box[i].substring(1, 5); s_box[i] = Integer.toBinaryString(SBoxArray[i][Integer.parseInt(s, 2)][Integer.parseInt(s1, 2)]); while (s_box[i].length() < 4) { s_box[i] = '0' + s_box[i]; } sc1.append(s_box[i]); } // Range R By according to P-BOX (PBoxArray) for (int i = 0; i < p_BoxLength; i++) { sc.append(sc1.charAt(PBoxArray[i] - 1)); } return sc.toString(); } /* * Range Ciphertext or Message according to Final Permutation (FPArray) */ protected String rangeCiphertextOrMessageByFinalPermutation(String text) { int fpLength = FPArray.length; StringBuilder sc = new StringBuilder(); for (int i = 0; i < fpLength; i++) { sc.append(text.charAt(FPArray[i] - 1)); } System.out.println(" " + sc.toString()); return sc.toString(); } }
生成回合密钥
public class CreateRoundKey { Variable va = new Variable(); int leftMoveTimesArrayLenght = va.LeftMoveTimesArray.length; int rounds = 0; String[] RoundKey = new String[16]; /* * check the keyword's parity */ public String[] checkParity(String keyWord) { System.out.println("Create the rounded key:"); StringBuilder sc = new StringBuilder(); int count = 0; String s = ""; for (int i = 0; i < keyWord.length(); i++) { String s1 = Integer.toBinaryString((int) keyWord.charAt(i)); while (s1.length() < 8) { s1 = '0' + s1; } s = s + s1; } while (s.length() < 56) { s = '0' + s; } System.out .println(" The keyWord's BinaryString:\n" + " " + s); for (int i = 0; i < s.length(); i++) { sc.append(s.charAt(i)); if (s.charAt(i) == '1') { // get the number of one count++; } if ((i + 1) % 7 == 0) { if (count % 2 == 1) { sc.append(0); } else { sc.append(1); } count = 0; } } System.out.println(" checkParity:\n" + " " + sc); return rangeKeywordByKeyPermutation(sc.toString()); } /* * range the key according to the Key Permutation (KPArray) */ private String[] rangeKeywordByKeyPermutation(String keyWord) { int kpLength = va.KPArray.length; StringBuilder sc = new StringBuilder(); for (int i = 0; i < kpLength; i++) { sc.append(keyWord.charAt(va.KPArray[i] - 1)); } System.out.println(" The ranged keyWord:\n" + " " + sc); String kl = sc.toString().substring(0, 28); String kr = sc.toString().substring(28); System.out.println(" Kl0:\n" + " " + kl + "\n Kr0:\n" + " " + kr); return rotateLeft(kl, kr); } /* * made kl and kr rotate left according to the LeftMoveTimesArray */ private String[] rotateLeft(String kl, String kr) { StringBuilder sckl = new StringBuilder(); StringBuilder sckr = new StringBuilder(); System.out.println(" RoundKey:"); for (int i = 0; i < leftMoveTimesArrayLenght; i++) { if (rounds == i) { sckl.append(kl.substring(0, va.LeftMoveTimesArray[i])); sckr.append(kr.substring(0, va.LeftMoveTimesArray[i])); kl = kl.substring(va.LeftMoveTimesArray[i]) + sckl.toString(); sckl.delete(0, sckl.length()); kr = kr.substring(va.LeftMoveTimesArray[i]) + sckr.toString(); sckr.delete(0, sckr.length()); } RoundKey[rounds] = rangeKeywordByCompressionPermutation(kl + kr); System.out.println(" " + Long.toHexString(Long.parseLong(RoundKey[rounds], 2))); rounds++; } return RoundKey; } /* * range keyword according to the Compression Permutation (CPArray) */ private String rangeKeywordByCompressionPermutation(String keyWord) { int cpLength = va.CPArray.length; StringBuilder sc = new StringBuilder(); for (int i = 0; i < cpLength; i++) { sc.append(keyWord.charAt(va.CPArray[i] - 1)); } return sc.toString(); } }加密
public class EncryptionData { Variable va = new Variable(); String[] roundKey = new String[16]; int rounds = 1; String ciphertext = ""; /* * Get the rounded key */ public EncryptionData(String[] roundkey) { roundKey = roundkey; System.out.println("Encrypte the message:"); } /* * Range the message according to Initial Permutation (IPArray) */ public String rangeMessageByInitialPermutation(String message) { String s = ""; for (int i = 0; i < message.length(); i++) { String s1 = Integer.toBinaryString((int) message.charAt(i)); while (s1.length() < 8) { s1 = '0' + s1; } s = s + s1; } while (s.length() < 64) { s = '0' + s; } System.out .println(" The message's BinaryString:\n" + " " + s); s = va.rangeTextByInitialPermutation(s); String[] l = new String[17]; String[] r = new String[17]; l[0] = s.toString().substring(0, 32); r[0] = s.toString().substring(32); System.out.println(" The ranged message:\n" + " " + s); return makeExclusive_or(l, r); } /* * Do arithmetic on L and R */ private String makeExclusive_or(String[] l, String[] r) { String ciphertext1 = ""; String ciphertext2 = ""; System.out.println(" The rounded ciphertext:"); while (rounds < 17) { l[rounds] = r[rounds - 1]; r[rounds] = Long.toBinaryString(Long.parseLong(l[rounds - 1], 2) ^ Long.parseLong( va.fFunction(r[rounds - 1], roundKey[rounds - 1]), 2)); va.outputCiphertext(r, l, ciphertext, ciphertext1, ciphertext2, rounds); rounds++; } return va.rangeCiphertextOrMessageByFinalPermutation(r[16] + l[16]); } }解密
public class DecryptionData { Variable va = new Variable(); String[] roundKey = new String[16]; int rounds = 1; String ciphertext = ""; /* * Get the rounded key */ public DecryptionData(String[] roundkey) { roundKey = roundkey; System.out.println("Decrypte the message:"); } /* * Range the ciphertext according to Initial Permutation (IPArray) */ public String rangeCiphertextByInitialPermutation(String ciphertext) { String s = ""; s = ciphertext; System.out.println(" The ciphertext's BinaryString:\n" + " " + s); s = va.rangeTextByInitialPermutation(s); String[] l = new String[17]; String[] r = new String[17]; l[0] = s.toString().substring(0, 32); r[0] = s.toString().substring(32); System.out.println(" The ranged ciphertext:\n" + " " + s); return makeExclusive_or(l, r); } /* * Do arithmetic on L and R */ private String makeExclusive_or(String[] l, String[] r) { String ciphertext1 = ""; String ciphertext2 = ""; System.out.println(" The rounded message:"); while (rounds < 17) { l[rounds] = r[rounds - 1]; r[rounds] = Long.toBinaryString(Long.parseLong(l[rounds - 1], 2) ^ Long.parseLong(va.fFunction(r[rounds - 1], roundKey[15 - (rounds - 1)]), 2)); va.outputCiphertext(r, l, ciphertext, ciphertext1, ciphertext2, rounds); rounds++; } return va.rangeCiphertextOrMessageByFinalPermutation(r[16] + l[16]); } }主函数
import java.util.Scanner; public class Main { public static void main(String[] args) { @SuppressWarnings("resource") Scanner sc = new Scanner(System.in); String ciphertext = "", s1 = "", s2 = "", s; System.out .println("Please input the keyword(the keyword's size should be less than eight):"); String keyWord = sc.nextLine(); while (keyWord.length() > 8) { System.out .println("The keyword's size is more than nine,please input the keyword again:"); keyWord = sc.nextLine(); } System.out .println("Please input the message that will be encrypted(the message's size should be less than nine):"); String message = sc.nextLine(); while (message.length() > 8) { System.out .println("The message's size is more than nine,please input the message again:"); message = sc.nextLine(); } // Create round key String[] roundKey = new String[16]; CreateRoundKey cr = new CreateRoundKey(); roundKey = cr.checkParity(keyWord); EncryptionData ed = new EncryptionData(roundKey); // Encrypte s = ed.rangeMessageByInitialPermutation(message); ciphertext = getCiphertextOrMessage(s, s1, s2, ciphertext); System.out.println(" The Ciphertext:\n " + ciphertext); // Decrypte DecryptionData dd = new DecryptionData(roundKey); s = dd.rangeCiphertextByInitialPermutation(s); ciphertext = getCiphertextOrMessage(s, s1, s2, ciphertext); System.out.println(" The Message's hesString:\n " + ciphertext); System.out.print(" The Message:\n "); for (int i = 0; i < ciphertext.length(); i += 2) { if (i != ciphertext.length() - 3) { if (Integer.parseInt(ciphertext.substring(i, i + 2), 16) != 0) { System.out.print((char) Integer.parseInt( ciphertext.substring(i, i + 2), 16)); } } else { if (Integer.parseInt(ciphertext.substring(i), 16) != 0) { System.out.print((char) Integer.parseInt( ciphertext.substring(i), 16)); } } } } private static String getCiphertextOrMessage(String s, String s1, String s2, String ciphertext) { s2 = s.substring(32); s1 = s.substring(0, 32); s1 = Long.toHexString(Long.parseLong(s1, 2)); while (s1.length() < 8) { s1 = '0' + s1; } s2 = Long.toHexString(Long.parseLong(s2, 2)); while (s2.length() < 8) { s2 = '0' + s2; } ciphertext = s1 + s2; return ciphertext; } }注意:
相关文章推荐
- Java☞DES加解密算法简介及实现
- 实现与JS相同的Des加解密算法【转】
- 【JAVA】常用加解密算法总结及JAVA实现【BASE64,MD5,SHA,DES,3DES,AES,RSA】
- 加密解密算法java实现(2)—DES
- 加密解密算法java实现(2)—DES
- DES 加密解密算法的C++实现
- 【密码学】DES加解密原理及其Java实现算法
- Java实现与JS相同的Des加解密算法完整实例
- 【转】asp.net(c#)加密解密算法之sha1、md5、des、aes实现源码详解
- Java☞DES加解密算法简介及实现
- DES加解密算法实现详解
- C语言实现数据保护算法(1)——DES&3DES加解密
- base64加密解密算法 C实现(转载)
- 算法实现: OTP(One-Time Pad) 一次一密密码本 加解密
- 笔记:des加解密,php和.net版的实现
- PHP和.net中des加解密的实现方法
- php实现 DES/CBC/PCCS5padding 加解密模式
- Oracle中des等算法的加解密
- DES 算法的 C++ 与 JAVA 互相加解密