mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-25 05:22:39 +08:00
1236 lines
30 KiB
Java
1236 lines
30 KiB
Java
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;
|
|
}
|
|
}
|