Blowfish

package com.thealgorithms.ciphers;

/*
 * Java program for Blowfish Algorithm 
 * Wikipedia: https://en.wikipedia.org/wiki/Blowfish_(cipher)
 * 
 * Author: Akshay Dubey (https://github.com/itsAkshayDubey)
 * 
 * */

public class Blowfish {
	
	//Initializing substitution boxes
	String S[][]
			= { { "d1310ba6", "98dfb5ac", "2ffd72db", "d01adfb7", "b8e1afed",
				"6a267e96", "ba7c9045", "f12c7f99", "24a19947", "b3916cf7",
				"0801f2e2", "858efc16", "636920d8", "71574e69", "a458fea3",
				"f4933d7e", "0d95748f", "728eb658", "718bcd58", "82154aee",
				"7b54a41d", "c25a59b5", "9c30d539", "2af26013", "c5d1b023",
				"286085f0", "ca417918", "b8db38ef", "8e79dcb0", "603a180e",
				"6c9e0e8b", "b01e8a3e", "d71577c1", "bd314b27", "78af2fda",
				"55605c60", "e65525f3", "aa55ab94", "57489862", "63e81440",
				"55ca396a", "2aab10b6", "b4cc5c34", "1141e8ce", "a15486af",
				"7c72e993", "b3ee1411", "636fbc2a", "2ba9c55d", "741831f6",
				"ce5c3e16", "9b87931e", "afd6ba33", "6c24cf5c", "7a325381",
				"28958677", "3b8f4898", "6b4bb9af", "c4bfe81b", "66282193",
				"61d809cc", "fb21a991", "487cac60", "5dec8032", "ef845d5d",
				"e98575b1", "dc262302", "eb651b88", "23893e81", "d396acc5",
				"0f6d6ff3", "83f44239", "2e0b4482", "a4842004", "69c8f04a",
				"9e1f9b5e", "21c66842", "f6e96c9a", "670c9c61", "abd388f0",
				"6a51a0d2", "d8542f68", "960fa728", "ab5133a3", "6eef0b6c",
				"137a3be4", "ba3bf050", "7efb2a98", "a1f1651d", "39af0176",
				"66ca593e", "82430e88", "8cee8619", "456f9fb4", "7d84a5c3",
				"3b8b5ebe", "e06f75d8", "85c12073", "401a449f", "56c16aa6",
				"4ed3aa62", "363f7706", "1bfedf72", "429b023d", "37d0d724",
				"d00a1248", "db0fead3", "49f1c09b", "075372c9", "80991b7b",
				"25d479d8", "f6e8def7", "e3fe501a", "b6794c3b", "976ce0bd",
				"04c006ba", "c1a94fb6", "409f60c4", "5e5c9ec2", "196a2463",
				"68fb6faf", "3e6c53b5", "1339b2eb", "3b52ec6f", "6dfc511f",
				"9b30952c", "cc814544", "af5ebd09", "bee3d004", "de334afd",
				"660f2807", "192e4bb3", "c0cba857", "45c8740f", "d20b5f39",
				"b9d3fbdb", "5579c0bd", "1a60320a", "d6a100c6", "402c7279",
				"679f25fe", "fb1fa3cc", "8ea5e9f8", "db3222f8", "3c7516df",
				"fd616b15", "2f501ec8", "ad0552ab", "323db5fa", "fd238760",
				"53317b48", "3e00df82", "9e5c57bb", "ca6f8ca0", "1a87562e",
				"df1769db", "d542a8f6", "287effc3", "ac6732c6", "8c4f5573",
				"695b27b0", "bbca58c8", "e1ffa35d", "b8f011a0", "10fa3d98",
				"fd2183b8", "4afcb56c", "2dd1d35b", "9a53e479", "b6f84565",
				"d28e49bc", "4bfb9790", "e1ddf2da", "a4cb7e33", "62fb1341",
				"cee4c6e8", "ef20cada", "36774c01", "d07e9efe", "2bf11fb4",
				"95dbda4d", "ae909198", "eaad8e71", "6b93d5a0", "d08ed1d0",
				"afc725e0", "8e3c5b2f", "8e7594b7", "8ff6e2fb", "f2122b64",
				"8888b812", "900df01c", "4fad5ea0", "688fc31c", "d1cff191",
				"b3a8c1ad", "2f2f2218", "be0e1777", "ea752dfe", "8b021fa1",
				"e5a0cc0f", "b56f74e8", "18acf3d6", "ce89e299", "b4a84fe0",
				"fd13e0b7", "7cc43b81", "d2ada8d9", "165fa266", "80957705",
				"93cc7314", "211a1477", "e6ad2065", "77b5fa86", "c75442f5",
				"fb9d35cf", "ebcdaf0c", "7b3e89a0", "d6411bd3", "ae1e7e49",
				"00250e2d", "2071b35e", "226800bb", "57b8e0af", "2464369b",
				"f009b91e", "5563911d", "59dfa6aa", "78c14389", "d95a537f",
				"207d5ba2", "02e5b9c5", "83260376", "6295cfa9", "11c81968",
				"4e734a41", "b3472dca", "7b14a94a", "1b510052", "9a532915",
				"d60f573f", "bc9bc6e4", "2b60a476", "81e67400", "08ba6fb5",
				"571be91f", "f296ec6b", "2a0dd915", "b6636521", "e7b9f9b6",
				"ff34052e", "c5855664", "53b02d5d", "a99f8fa1", "08ba4799",
			"6e85076a" },
					{ "4b7a70e9", "b5b32944", "db75092e", "c4192623", "ad6ea6b0",
				"49a7df7d", "9cee60b8", "8fedb266", "ecaa8c71", "699a17ff",
				"5664526c", "c2b19ee1", "193602a5", "75094c29", "a0591340",
				"e4183a3e", "3f54989a", "5b429d65", "6b8fe4d6", "99f73fd6",
				"a1d29c07", "efe830f5", "4d2d38e6", "f0255dc1", "4cdd2086",
				"8470eb26", "6382e9c6", "021ecc5e", "09686b3f", "3ebaefc9",
				"3c971814", "6b6a70a1", "687f3584", "52a0e286", "b79c5305",
				"aa500737", "3e07841c", "7fdeae5c", "8e7d44ec", "5716f2b8",
				"b03ada37", "f0500c0d", "f01c1f04", "0200b3ff", "ae0cf51a",
				"3cb574b2", "25837a58", "dc0921bd", "d19113f9", "7ca92ff6",
				"94324773", "22f54701", "3ae5e581", "37c2dadc", "c8b57634",
				"9af3dda7", "a9446146", "0fd0030e", "ecc8c73e", "a4751e41",
				"e238cd99", "3bea0e2f", "3280bba1", "183eb331", "4e548b38",
				"4f6db908", "6f420d03", "f60a04bf", "2cb81290", "24977c79",
				"5679b072", "bcaf89af", "de9a771f", "d9930810", "b38bae12",
				"dccf3f2e", "5512721f", "2e6b7124", "501adde6", "9f84cd87",
				"7a584718", "7408da17", "bc9f9abc", "e94b7d8c", "ec7aec3a",
				"db851dfa", "63094366", "c464c3d2", "ef1c1847", "3215d908",
				"dd433b37", "24c2ba16", "12a14d43", "2a65c451", "50940002",
				"133ae4dd", "71dff89e", "10314e55", "81ac77d6", "5f11199b",
				"043556f1", "d7a3c76b", "3c11183b", "5924a509", "f28fe6ed",
				"97f1fbfa", "9ebabf2c", "1e153c6e", "86e34570", "eae96fb1",
				"860e5e0a", "5a3e2ab3", "771fe71c", "4e3d06fa", "2965dcb9",
				"99e71d0f", "803e89d6", "5266c825", "2e4cc978", "9c10b36a",
				"c6150eba", "94e2ea78", "a5fc3c53", "1e0a2df4", "f2f74ea7",
				"361d2b3d", "1939260f", "19c27960", "5223a708", "f71312b6",
				"ebadfe6e", "eac31f66", "e3bc4595", "a67bc883", "b17f37d1",
				"018cff28", "c332ddef", "be6c5aa5", "65582185", "68ab9802",
				"eecea50f", "db2f953b", "2aef7dad", "5b6e2f84", "1521b628",
				"29076170", "ecdd4775", "619f1510", "13cca830", "eb61bd96",
				"0334fe1e", "aa0363cf", "b5735c90", "4c70a239", "d59e9e0b",
				"cbaade14", "eecc86bc", "60622ca7", "9cab5cab", "b2f3846e",
				"648b1eaf", "19bdf0ca", "a02369b9", "655abb50", "40685a32",
				"3c2ab4b3", "319ee9d5", "c021b8f7", "9b540b19", "875fa099",
				"95f7997e", "623d7da8", "f837889a", "97e32d77", "11ed935f",
				"16681281", "0e358829", "c7e61fd6", "96dedfa1", "7858ba99",
				"57f584a5", "1b227263", "9b83c3ff", "1ac24696", "cdb30aeb",
				"532e3054", "8fd948e4", "6dbc3128", "58ebf2ef", "34c6ffea",
				"fe28ed61", "ee7c3c73", "5d4a14d9", "e864b7e3", "42105d14",
				"203e13e0", "45eee2b6", "a3aaabea", "db6c4f15", "facb4fd0",
				"c742f442", "ef6abbb5", "654f3b1d", "41cd2105", "d81e799e",
				"86854dc7", "e44b476a", "3d816250", "cf62a1f2", "5b8d2646",
				"fc8883a0", "c1c7b6a3", "7f1524c3", "69cb7492", "47848a0b",
				"5692b285", "095bbf00", "ad19489d", "1462b174", "23820e00",
				"58428d2a", "0c55f5ea", "1dadf43e", "233f7061", "3372f092",
				"8d937e41", "d65fecf1", "6c223bdb", "7cde3759", "cbee7460",
				"4085f2a7", "ce77326e", "a6078084", "19f8509e", "e8efd855",
				"61d99735", "a969a7aa", "c50c06c2", "5a04abfc", "800bcadc",
				"9e447a2e", "c3453484", "fdd56705", "0e1e9ec9", "db73dbd3",
				"105588cd", "675fda79", "e3674340", "c5c43465", "713e38d8",
				"3d28f89e", "f16dff20", "153e21e7", "8fb03d4a", "e6e39f2b",
					"db83adf7" },
					{ "e93d5a68", "948140f7", "f64c261c", "94692934", "411520f7",
						"7602d4f7", "bcf46b2e", "d4a20068", "d4082471", "3320f46a",
						"43b7d4b7", "500061af", "1e39f62e", "97244546", "14214f74",
						"bf8b8840", "4d95fc1d", "96b591af", "70f4ddd3", "66a02f45",
						"bfbc09ec", "03bd9785", "7fac6dd0", "31cb8504", "96eb27b3",
						"55fd3941", "da2547e6", "abca0a9a", "28507825", "530429f4",
						"0a2c86da", "e9b66dfb", "68dc1462", "d7486900", "680ec0a4",
						"27a18dee", "4f3ffea2", "e887ad8c", "b58ce006", "7af4d6b6",
						"aace1e7c", "d3375fec", "ce78a399", "406b2a42", "20fe9e35",
						"d9f385b9", "ee39d7ab", "3b124e8b", "1dc9faf7", "4b6d1856",
						"26a36631", "eae397b2", "3a6efa74", "dd5b4332", "6841e7f7",
						"ca7820fb", "fb0af54e", "d8feb397", "454056ac", "ba489527",
						"55533a3a", "20838d87", "fe6ba9b7", "d096954b", "55a867bc",
						"a1159a58", "cca92963", "99e1db33", "a62a4a56", "3f3125f9",
						"5ef47e1c", "9029317c", "fdf8e802", "04272f70", "80bb155c",
						"05282ce3", "95c11548", "e4c66d22", "48c1133f", "c70f86dc",
						"07f9c9ee", "41041f0f", "404779a4", "5d886e17", "325f51eb",
						"d59bc0d1", "f2bcc18f", "41113564", "257b7834", "602a9c60",
						"dff8e8a3", "1f636c1b", "0e12b4c2", "02e1329e", "af664fd1",
						"cad18115", "6b2395e0", "333e92e1", "3b240b62", "eebeb922",
						"85b2a20e", "e6ba0d99", "de720c8c", "2da2f728", "d0127845",
						"95b794fd", "647d0862", "e7ccf5f0", "5449a36f", "877d48fa",
						"c39dfd27", "f33e8d1e", "0a476341", "992eff74", "3a6f6eab",
						"f4f8fd37", "a812dc60", "a1ebddf8", "991be14c", "db6e6b0d",
						"c67b5510", "6d672c37", "2765d43b", "dcd0e804", "f1290dc7",
						"cc00ffa3", "b5390f92", "690fed0b", "667b9ffb", "cedb7d9c",
						"a091cf0b", "d9155ea3", "bb132f88", "515bad24", "7b9479bf",
						"763bd6eb", "37392eb3", "cc115979", "8026e297", "f42e312d",
						"6842ada7", "c66a2b3b", "12754ccc", "782ef11c", "6a124237",
						"b79251e7", "06a1bbe6", "4bfb6350", "1a6b1018", "11caedfa",
						"3d25bdd8", "e2e1c3c9", "44421659", "0a121386", "d90cec6e",
						"d5abea2a", "64af674e", "da86a85f", "bebfe988", "64e4c3fe",
						"9dbc8057", "f0f7c086", "60787bf8", "6003604d", "d1fd8346",
						"f6381fb0", "7745ae04", "d736fccc", "83426b33", "f01eab71",
						"b0804187", "3c005e5f", "77a057be", "bde8ae24", "55464299",
						"bf582e61", "4e58f48f", "f2ddfda2", "f474ef38", "8789bdc2",
						"5366f9c3", "c8b38e74", "b475f255", "46fcd9b9", "7aeb2661",
						"8b1ddf84", "846a0e79", "915f95e2", "466e598e", "20b45770",
						"8cd55591", "c902de4c", "b90bace1", "bb8205d0", "11a86248",
						"7574a99e", "b77f19b6", "e0a9dc09", "662d09a1", "c4324633",
						"e85a1f02", "09f0be8c", "4a99a025", "1d6efe10", "1ab93d1d",
						"0ba5a4df", "a186f20f", "2868f169", "dcb7da83", "573906fe",
						"a1e2ce9b", "4fcd7f52", "50115e01", "a70683fa", "a002b5c4",
						"0de6d027", "9af88c27", "773f8641", "c3604c06", "61a806b5",
						"f0177a28", "c0f586e0", "006058aa", "30dc7d62", "11e69ed7",
						"2338ea63", "53c2dd94", "c2c21634", "bbcbee56", "90bcb6de",
						"ebfc7da1", "ce591d76", "6f05e409", "4b7c0188", "39720a3d",
						"7c927c24", "86e3725f", "724d9db9", "1ac15bb4", "d39eb8fc",
						"ed545578", "08fca5b5", "d83d7cd3", "4dad0fc4", "1e50ef5e",
						"b161e6f8", "a28514d9", "6c51133c", "6fd5c7e7", "56e14ec4",
						"362abfce", "ddc6c837", "d79a3234", "92638212", "670efa8e",
					"406000e0" },
					{ "3a39ce37", "d3faf5cf", "abc27737", "5ac52d1b", "5cb0679e",
						"4fa33742", "d3822740", "99bc9bbe", "d5118e9d", "bf0f7315",
						"d62d1c7e", "c700c47b", "b78c1b6b", "21a19045", "b26eb1be",
						"6a366eb4", "5748ab2f", "bc946e79", "c6a376d2", "6549c2c8",
						"530ff8ee", "468dde7d", "d5730a1d", "4cd04dc6", "2939bbdb",
						"a9ba4650", "ac9526e8", "be5ee304", "a1fad5f0", "6a2d519a",
						"63ef8ce2", "9a86ee22", "c089c2b8", "43242ef6", "a51e03aa",
						"9cf2d0a4", "83c061ba", "9be96a4d", "8fe51550", "ba645bd6",
						"2826a2f9", "a73a3ae1", "4ba99586", "ef5562e9", "c72fefd3",
						"f752f7da", "3f046f69", "77fa0a59", "80e4a915", "87b08601",
						"9b09e6ad", "3b3ee593", "e990fd5a", "9e34d797", "2cf0b7d9",
						"022b8b51", "96d5ac3a", "017da67d", "d1cf3ed6", "7c7d2d28",
						"1f9f25cf", "adf2b89b", "5ad6b472", "5a88f54c", "e029ac71",
						"e019a5e6", "47b0acfd", "ed93fa9b", "e8d3c48d", "283b57cc",
						"f8d56629", "79132e28", "785f0191", "ed756055", "f7960e44",
						"e3d35e8c", "15056dd4", "88f46dba", "03a16125", "0564f0bd",
						"c3eb9e15", "3c9057a2", "97271aec", "a93a072a", "1b3f6d9b",
						"1e6321f5", "f59c66fb", "26dcf319", "7533d928", "b155fdf5",
						"03563482", "8aba3cbb", "28517711", "c20ad9f8", "abcc5167",
						"ccad925f", "4de81751", "3830dc8e", "379d5862", "9320f991",
						"ea7a90c2", "fb3e7bce", "5121ce64", "774fbe32", "a8b6e37e",
						"c3293d46", "48de5369", "6413e680", "a2ae0810", "dd6db224",
						"69852dfd", "09072166", "b39a460a", "6445c0dd", "586cdecf",
						"1c20c8ae", "5bbef7dd", "1b588d40", "ccd2017f", "6bb4e3bb",
						"dda26a7e", "3a59ff45", "3e350a44", "bcb4cdd5", "72eacea8",
						"fa6484bb", "8d6612ae", "bf3c6f47", "d29be463", "542f5d9e",
						"aec2771b", "f64e6370", "740e0d8d", "e75b1357", "f8721671",
						"af537d5d", "4040cb08", "4eb4e2cc", "34d2466a", "0115af84",
						"e1b00428", "95983a1d", "06b89fb4", "ce6ea048", "6f3f3b82",
						"3520ab82", "011a1d4b", "277227f8", "611560b1", "e7933fdc",
						"bb3a792b", "344525bd", "a08839e1", "51ce794b", "2f32c9b7",
						"a01fbac9", "e01cc87e", "bcc7d1f6", "cf0111c3", "a1e8aac7",
						"1a908749", "d44fbd9a", "d0dadecb", "d50ada38", "0339c32a",
						"c6913667", "8df9317c", "e0b12b4f", "f79e59b7", "43f5bb3a",
						"f2d519ff", "27d9459c", "bf97222c", "15e6fc2a", "0f91fc71",
						"9b941525", "fae59361", "ceb69ceb", "c2a86459", "12baa8d1",
						"b6c1075e", "e3056a0c", "10d25065", "cb03a442", "e0ec6e0e",
						"1698db3b", "4c98a0be", "3278e964", "9f1f9532", "e0d392df",
						"d3a0342b", "8971f21e", "1b0a7441", "4ba3348c", "c5be7120",
						"c37632d8", "df359f8d", "9b992f2e", "e60b6f47", "0fe3f11d",
						"e54cda54", "1edad891", "ce6279cf", "cd3e7e6f", "1618b166",
						"fd2c1d05", "848fd2c5", "f6fb2299", "f523f357", "a6327623",
						"93a83531", "56cccd02", "acf08162", "5a75ebb5", "6e163697",
						"88d273cc", "de966292", "81b949d0", "4c50901b", "71c65614",
						"e6c6c7bd", "327a140a", "45e1d006", "c3f27b9a", "c9aa53fd",
						"62a80f00", "bb25bfe2", "35bdd2f6", "71126905", "b2040222",
						"b6cbcf7c", "cd769c2b", "53113ec0", "1640e3d3", "38abbd60",
						"2547adf0", "ba38209c", "f746ce76", "77afa1c5", "20756060",
						"85cbfe4e", "8ae88dd8", "7aaaf9b0", "4cf9aa7e", "1948c25c",
						"02fb8a8c", "01c36ae4", "d6ebe1f9", "90d4f869", "a65cdea0",
						"3f09252d", "c208e69f", "b74e6132", "ce77e25b", "578fdfe3",
					"3ac372e6" } };

	//Initializing subkeys with digits of pi
	String P[] = { "243f6a88", "85a308d3", "13198a2e", "03707344", "a4093822",
			"299f31d0", "082efa98", "ec4e6c89", "452821e6", "38d01377",
			"be5466cf", "34e90c6c", "c0ac29b7", "c97c50dd", "3f84d5b5",
			"b5470917", "9216d5d9", "8979fb1b" };

	//Initializing modVal to 2^32
	long modVal = 4294967296L;
	

    /**
     * This method returns binary representation of the hexadecimal number passed as parameter
     *
     * @param hex Number for which binary representation is required
     * @return String object which is a binary representation of the hex number passed as parameter
     */
	private String hexToBin(String hex)
	{
		String binary = "";
		Long num;
		String binary4B;
		int n = hex.length();
		for (int i = 0; i < n; i++) {

			num = Long.parseUnsignedLong(
					hex.charAt(i) + "", 16);
			binary4B = Long.toBinaryString(num);

			binary4B = "0000" + binary4B;

			binary4B = binary4B.substring(binary4B.length() - 4);
			binary += binary4B;
		}
		return binary;
	}

    /**
     * This method returns hexadecimal representation of the binary number passed as parameter
     *
     * @param binary Number for which hexadecimal representation is required
     * @return String object which is a hexadecimal representation of the binary number passed as parameter
     */
	private String binToHex(String binary)
	{

		long num = Long.parseUnsignedLong(binary, 2);
		String hex = Long.toHexString(num);
		while (hex.length() < (binary.length() / 4))
			hex = "0" + hex;

		return hex;
	}

    /**
     * This method returns a string obtained by XOR-ing two strings of same length passed a method parameters
     *      
     * @param String a and b are string objects which will be XORed and are to be of same length
     * @return String object obtained by XOR operation on String a and String b
     * */
	private String xor(String a, String b)
	{
		a = hexToBin(a);
		b = hexToBin(b);
		String ans = "";
		for (int i = 0; i < a.length(); i++)
			ans += (char)(((a.charAt(i) - '0')
					^ (b.charAt(i) - '0'))
					+ '0');
		ans = binToHex(ans);
		return ans;
	}

    /**
     * This method returns addition of two hexadecimal numbers passed as parameters and moded with 2^32 
     *
     * @param String a and b are hexadecimal numbers
     * @return String object which is a is addition that is then moded with 2^32 of hex numbers passed as parameters
     */
	private String addBin(String a, String b)
	{
		String ans = "";
		long n1 = Long.parseUnsignedLong(a, 16);
		long n2 = Long.parseUnsignedLong(b, 16);
		n1 = (n1 + n2) % modVal;
		ans = Long.toHexString(n1);
		ans = "00000000" + ans;
		return ans.substring(ans.length() - 8);
	}

	/*F-function splits the 32-bit input into four 8-bit quarters 
	 and uses the quarters as input to the S-boxes. 
	 The S-boxes accept 8-bit input and produce 32-bit output. 
	 The outputs are added modulo 232 and XORed to produce the final 32-bit output 
	*/
	private String f(String plainText)
	{
		String a[] = new String[4];
		String ans = "";
		for (int i = 0; i < 8; i += 2) {
			//column number for S-box is a 8-bit value
			long col
			= Long.parseUnsignedLong(
					hexToBin(
							plainText
							.substring(i, i + 2)),
					2);
			a[i / 2] = S[i / 2][(int)col];
		}
		ans = addBin(a[0], a[1]);
		ans = xor(ans, a[2]);
		ans = addBin(ans, a[3]);
		return ans;
	}

	//generate subkeys
	private void keyGenerate(String key)
	{
		int j = 0;
		for (int i = 0; i < P.length; i++) {

			//XOR-ing 32-bit parts of the key with initial subkeys
			P[i] = xor(P[i], key.substring(j, j + 8));

			j = (j + 8) % key.length();
		}
	}

	//round function
	private String round(int time, String plainText)
	{
		String left, right;
		left = plainText.substring(0, 8);
		right = plainText.substring(8, 16);
		left = xor(left, P[time]);

		//output from F function
		String fOut = f(left);

		right = xor(fOut, right);

		//swap left and right
		return right + left;
	}

    /**
     * This method returns cipher text for the plaintext passed as the first parameter generated
     * using the key passed as the second parameter
     *
     * @param String plainText is the text which is to be encrypted
     * @param String key is the key which is to be used for generating cipher text
     * @return String cipherText is the encrypted value
     */
	String encrypt(String plainText, String key)
	{
		//generating key
		keyGenerate(key);
		
		for (int i = 0; i < 16; i++)
			plainText = round(i, plainText);

		//postprocessing
		String right = plainText.substring(0, 8);
		String left = plainText.substring(8, 16);
		right = xor(right, P[16]);
		left = xor(left, P[17]);
		return left + right;
	}
	
    /**
     * This method returns plaintext for the ciphertext passed as the first parameter decoded
     * using the key passed as the second parameter
     *
     * @param String ciphertext is the text which is to be decrypted
     * @param String key is the key which is to be used for generating cipher text
     * @return String plainText is the decrypted text
     */
    String decrypt(String cipherText,String key)
    {
    	//generating key
    	keyGenerate(key);
    	
        for (int i = 17; i > 1; i--)
            cipherText = round(i, cipherText);
 
        //postprocessing
        String right = cipherText.substring(0, 8);
        String left = cipherText.substring(8, 16);
        right = xor(right, P[1]);
        left = xor(left, P[0]);
        return left + right;
    }

}
Algerlogo

Β© Alger 2022

About us

We are a group of programmers helping each other build new things, whether it be writing complex encryption programs, or simple ciphers. Our goal is to work together to document and model beautiful, helpful and interesting algorithms using code. We are an open-source community - anyone can contribute. We check each other's work, communicate and collaborate to solve problems. We strive to be welcoming, respectful, yet make sure that our code follows the latest programming guidelines.