×

Blowfish Algorithm in Cryptography

What is Blowfish?

Blowfish is a length variable and symmetric in nature. It is a 64-bit block cipher. It is a general proposed algorithm. It is developed by Bruce Schneier in the year of 1993. It is speedy and free for encryption and decryption processes. It also acts as the alternative to Data Encryption Standard (DES) and International data encryption algorithm (IDEA). 

The blowfish algorithm is not patented and is free for all users. But it has some limitations, so it could not completely replace the Data Encryption Standard (DES) and International data encryption algorithm (IDEA). These disadvantages are small block sizes and insecurities. 

Blowfish has a size of 64 bits that ranges from 32bits to 448 bits. Blowfish use a single encryption method that follows both encryption and decryptions. 

The Blowfish algorithm has two main parts. These two parts are as follows. 

  1. Data Encryption.
  2. Key expansion and subkeys.

Data encryptions

The data encryption takes place in 16 rounds. Each round of these 16 rounds consists of a key-dependent permutation and data and key-dependent substitutions. There is a significant key-dependent S box that combine worked with the substitution method and formed the central part of the data encryption standard of Blowfish. The whole encryption algorithm is performed by XOR operations with the addition of 32-bit words. 

Key expansion and sub keys-

In the key expansion process, a conversion occurs at 448 bits of data to 4168 bits of the array. These subkeys result from the main parts of the Blowfish algorithm. These subkeys are checked before any encryption and decryption take place. 

In Blowfish, the array consists of 32 bits of subkeys and 32 bits of S box. The calculation of the subkeys follows the below process.

  1. Both P-array and S-box are initialized by containing a string of hexadecimal digits.
  2. The first element of the P-array is XORed with the first 32 bits of the S-box. Then the second element of the P-array is XORed with the second 32 bits of the S-box. And the process is going in this manner. 
  3. All zero string elements are encrypted first, the same as the above process. 
  4. After the encryption of all the zero string elements, the first and second element of the P-array is replaced by the output of all the zero string elements.
  5. Then this output is encrypted with the help of the blowfish algorithm and its subkeys. 
  6. After we get the output of the P-array's first and second elements, we modify the P-array's third and fourth elements.
  7. This process continues until all the elements of the P-array and S-box are modified.

Example of Blowfish Algorithm for encryption

  1. Step-1
  • In this step, the subkeys for the algorithm are generated.
  • Let’s take 18 subkeys { P[0],P[1],P[2]………..P[17]}. We are going to encrypt and decrypt all the above elements, and with the help of the same subkeys, we are going to perform both operations.
  • The above 18 subkeys are stored in each element of the P-array.
  • The operation starts from Pi[?].
  • All these subkeys are represented with a hexadecimal value. These are as follows:

P[o]- "243f6a88"

P[1] - "85a308d3"

P[2]- “13198a2e”

P[3] – '03707344"

P[4] – "a4093822"

P[5] – "299f31d0"

P[6] – “082efa98’

P[7] – "ec4e6c89"

P[8] – "452821e6"

P[9] – "38d01377"

P[10]- “be5466cf”

P[11]- “34e90c6c”

P[12] – “c0ac29b7”

P[13] – “c97c50dd”

P[14] – “3f84d5b5”

P[15] – "b5470917"

P[16] – “9216d5d9”

P[17] – “8979fb1b”

.

Now, the subkeys are changed by the following process.

P[0] = P[0] xor 1st 32-bits of input key

P[1] = P[1] xor 2nd 32-bits of input key

.

.

.

P[i] = P[i] xor (i+1)th 32-bits of input key 

(roll over to 1st 32-bits depending on the key length)

.

.

.

P[17] = P[17] xor 18th 32-bits of input key 

(roll over to 1st 32-bits depending on key length)

Then the result of these subkeys is stored in the P-array, and these hexadecimal values are used in the entire process. 

2. Step-2

· In this step, we start our initialization process for S-box.

· For this operation we need four S-boxes{ {S[0]…S[4]} during the entire encryption and decryption process. S-box consists of 256 entries, where each box contains 32 entries.

3. Step-3

In this step, the encryption for the blowfish algorithm takes place. This encryption function has two parts.

a) Rounds

The complete encryption process takes place in 16 rounds. In this step, it takes input from corresponding subkeys(Pi). 

b) Post-processing

After receiving the input from 16 rounds, it starts processing it and then gives the output.

Let's take an example of java programming for the encryption of the Blowfish algorithm.

Code:

import java.util.*;


public class Main {




        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" } };


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


               
               long modVal = 1;


               
               private String hexToBin(String plainText)
               {
                               String binary = "";
                               Long num;
                               String binary4B;
                               int n = plainText.length();
                               for (int i = 0; i < n; i++) {


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


                                               
                                               binary4B = "0000" + binary4B;


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


               
               private String binToHex(String plainText)
               {


                               long num = Long.parseUnsignedLong(plainText, 2);
                               String hexa = Long.toHexString(num);
                               while (hexa.length() < (plainText.length() / 4))




                                               
                                               hexa = "0" + hexa;


                               return hexa;
               }




               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;
               }




               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);
               }


               private String f(String plainText)
               {
                               String a[] = new String[4];
                               String ans = "";
                               for (int i = 0; i < 8; i += 2) {
                                               
                                               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;
               }


               
               private void keyGenerate(String key)
               {
                               int j = 0;
                               for (int i = 0; i < P.length; i++) {
                                               P[i] = xor(P[i], key.substring(j, j + 8));


                                               System.out.println("subkey "
                                                                                                               + (i + 1) + ": "
                                                                                                               + P[i]);
                                               j = (j + 8) % key.length();
                               }
               }


               
               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]);


                               
                               String fOut = f(left);
right = xor(fOut, right);


                               System.out.println(
                                               "round " + time + ": "
                                               + right + left);


               
                               return right + left;
               }


               
               private String encrypt(String plainText)
               {
                               for (int i = 0; i < 16; i++)
                                               plainText = round(i, plainText);


                               
                               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;
               }


               Main()
               {
                               
                               for (int i = 0; i < 32; i++)
                                               modVal = modVal << 1;


                               String plainText = "123456abcd132536";
                               String key = "aabb09182736ccdd";


                               keyGenerate(key);


                               System.out.println("-----Encryption-----");
                               String cipherText = encrypt(plainText);
                               System.out.println("Cipher Text: " + cipherText);
               }


               public static void main(String args[])
               {
                               new Main();
               }
}


Output:

Blowfish Algorithm in Cryptography

Example of Blowfish Algorithm for Decription

The decryption process of the blowfish algorithm is similar to the encryption process of the blowfish algorithm. The detailed procedure is described below.

  1. Step-1:-
  • There are 18 subkeys{P[0],......P[17]} required for the decryption process.
  • These 18 subkeys are stored in P-array and each subkey store 32bits.
  • The decryption process starts with the pi(?).
  • Each subkey has a hexadecimal value which is shown below.

P[o]- "243f6a88"

P[1] - "85a308d3"

P[2]- “13198a2e”

P[3] – '03707344"

P[4] – "a4093822"

P[5] – "299f31d0"

P[6] – “082efa98’

P[7] – "ec4e6c89"

P[8] – "452821e6"

P[9] – "38d01377"

P[10]- “be5466cf”

P[11]- “34e90c6c”

P[12] – “c0ac29b7”

P[13] – “c97c50dd”

P[14] – “3f84d5b5”

P[15] – "b5470917"

P[16] – “9216d5d9”

P[17] – “8979fb1b”

Now, the subkeys are changed by the following process.

P[0] = P[0] xor 1st 32-bits of input key

P[1] = P[1] xor 2nd 32-bits of input key

.

.

.

P[i] = P[i] xor (i+1)th 32-bits of input key 

(roll over to 1st 32-bits depending on the key length)

.

.

.

P[17] = P[17] xor 18th 32-bits of input key 

(roll over to 1st 32-bits depending on key length)

Then the result of these subkeys is stored in the P-array, and these hexadecimal values are used in the entire process. 

2. Step-2

· In this step, we start our initialization process for S-box.

· For this operation we need four S-boxes{ {S[0]…S[4]} during the entire encryption and decryption process. S-box consists of 256 entries, where each box contains 32 entries

3. Step-3

In this step, the decryption for the blowfish algorithm takes place. This decryption function has two parts.

a) Rounds

The complete decryption process takes place in 16 rounds. In this step, it takes input from corresponding subkeys (P[17-i]). 

  b) Post-processing

    After receiving the input from 16 rounds, it starts processing it and then gives the output.

Let's take an example of java programming for the decryption of the Blowfish algorithm.

Code:

import java.util.*;


public class Main {
               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" } };


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


               
               long modVal = 1;




               private String hexToBin(String plainText)
               {
                               String binary = "";
                               Long num;
                               String binary4B;
                               int n = plainText.length();
                               for (int i = 0; i < n; i++) {
                                               num
                                                               = Long.parseUnsignedLong(
                                                                               plainText.charAt(i) + "", 16);
                                               binary4B = Long.toBinaryString(num);


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




               private String binToHex(String plainText)
               {
                               long num = Long.parseUnsignedLong(plainText, 2);
                               String hexa = Long.toHexString(num);
                               while (hexa.length() < (plainText.length() / 4))
                                               hexa = "0" + hexa;
                               return hexa;
               }


               
               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;
               }


               
               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);
               }
               private String f(String plainText)
               {
                               String a[] = new String[4];
                               String ans = "";
                               for (int i = 0; i < 8; i += 2) {
                                               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;
               }




               private void keyGenerate(String key)
               {
                               int j = 0;
                               for (int i = 0; i < P.length; i++) {
                                               P[i] = xor(P[i], key.substring(j, j + 8));
                                               System.out.println("subkey "
                                                                                                               + (i + 1) + ": "
                                                                                                               + P[i]);
                                               j = (j + 8) % key.length();
                               }
               }




               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]);
                               String fOut = f(left); // output from F function
                               right = xor(fOut, right);


                               System.out.println("round " + time + ": "
                                                                                              + right + left);




                               return right + left;
               }


               
               private String decrypt(String plainText)
               {
                               for (int i = 17; i > 1; i--)
                                               plainText = round(i, plainText);


                               
                               String right = plainText.substring(0, 8);
                               String left = plainText.substring(8, 16);
                               right = xor(right, P[1]);
                               left = xor(left, P[0]);
                               return left + right;
               }


               Main()
               {
                               for (int i = 0; i < 32; i++)
                                               modVal = modVal << 1;
                               String cipherText = "d748ec383d3405f7";
                               String key = "aabb09182736ccdd";


                               keyGenerate(key);


                               System.out.println("-----Decryption-----");
                               String plainText = decrypt(cipherText);
                               System.out.println("Plain Text: "
                                                                                               + plainText);
               }


               public static void main(String args[])
               {
                               new Main();
               }
}

Output:

Blowfish Algorithm in Cryptography

Advantages of Blowfish Algorithm

The blowfish algorithm is one of the most popular compact block ciphers used publicly. The blowfish algorithm converts the encryption key into a cipher key by the symmetric method. The blowfish algorithm is used worldwide because of the following reason.

  • It is more efficient and faster than the IDEA and DES algorithms.
  • It is free to use without any license.
  • It provides security to the java developed application.

Disadvantages of Blowfish Algorithm

There are some disadvantages of the Blowfish algorithm. These are as follows.

  • When we change the encryption key, then it affects the speed of the Blowfish algorithm.
  • The scheduling of keys takes so much time to process.
  • Each new key requires preprocessing equivalent to 4 KB of text, which affects its speed, making it unusable for some applications.

Related Topics

Working of Blockchain

How Blockchain Works A Blockchain is simply a collection of records of time-stamped transactions that are managed by a group of servers. There is no central authority who controls the database....

2 minutes read.

Kerberos in Cryptography and Network Security

Kerberos is a system that is used for managing user authentication. With the help of Kerberos, the user can access their service without remembering multiple authentication passwords. It is not...

3 minutes read.

Blockchain Hash Function

A hash function is a type of function which takes input in string format (alphabets, media files, numbers) of any length provided by the users and converts it to a...

3 minutes read.

Role of Bitcoin Miners

Let us first know what Bitcoin Mining is and then learn about the role of Bitcoin Miners. What is Bitcoin Mining? Bitcoin Mining is a process where transaction records are added to...

3 minutes read.

Ethereum 2.0

What is Eth2? Eth2 refers to a set of improvements to security, Ethereum's scalability and long-term sustainability. These improvements are being worked on by a number of teams from throughout the Ethereum...

6 minutes read.

What does Blockchain contain?

A Blockchain is a network of interconnected blocks. Four components make up a block: NonceMerkle tree rootPrevious HashThe timestamp A cryptographic hash of the contents from the preceding block is contained in...

3 minutes read.

Blowfish Algorithm in Cryptography

What is Blowfish? Blowfish is a length variable and symmetric in nature. It is a 64-bit block cipher. It is a general proposed algorithm. It is developed by Bruce Schneier in...

25 minutes read.

Feistel Cipher in Cryptography

What is Feistel Cipher? A Feistel Cipher is a structural model that is used to build various symmetric block Ciphers similar to DES. This structural model can be self in veritable....

4 minutes read.

HMAC Algorithm in Cryptography

HMAC stands for Hash-Based Message Authentication Code. It is a type of message authentication code that is obtained by executing a cryptographic hash function that is used to be authenticated...

3 minutes read.

Who sets the Bitcoin Price

The function of Bitcoin is very similar to a commodity. Bitcoin's price is decided by the market where it is traded. To put it another way, how much someone is...

4 minutes read.

Blockchain Tutorial

The 21st century is all about digitalization and technology. With the rising need for modernization in our daily lives, people are exploring new technologies. Blockchain technology has created a stir...

6 minutes read.

Getting Started with Bitcoin

The goal of this part is to show you how to get started with Bitcoin in a simple way. 1. Get to Know Bitcoin Bitcoin has certain unusual characteristics. It behaves similarly...

4 minutes read.

Coinbase Transaction

Several transactions occur on a cryptocurrency network, but these transactions may not be transactions between two people. Some transactions which take place are a bit different from other transactions. &...

4 minutes read.

Blockchain Explorer

Blockchain Explorer A blockchain explorer is an online webpage similar to Mozilla and Google Chrome, which allows users to browse and explore information about blockchain technology. All bitcoin and ether users depend on blockchain explorer...

3 minutes read.

How can Blockchain Technology help IoT to reach its full potential

The Blockchain technology has huge potential to speed up the IoT's efficient operation. Since then, security has been a big worry with IoT, which has hampered its widespread adoption. IoT...

4 minutes read.

ElGamal Algorithm

What is ElGamal Algorithm? ElGamal Algorithm is an asymmetric key encryption technique for communicating between two parties and encrypting the message. With the help of cryptography, the employee can communicate securely....

3 minutes read.

Blockchains vs Distributed ledger Technology

Blockchains VS Distributed ledger Technology Blockchain is explored by a wide range of audiences daily. There are lots of terms used for the Blockchain technology; one of them is Distributed Ledger Technology (DLT)....

3 minutes read.

Blockchain Merkle Tree

The Merkle tree is an essential component of Blockchain technology. It is a mathematical data structure composed of hash of various data blocks that serves as an overview of all...

4 minutes read.

IP Security in Cryptography

IPsec (Internet Protocol Security) is a collection of algorithms and protocols used to secure the data transmitted over a public network. The Internet Engineering Task Force (IETF) was developed in...

6 minutes read.

Blockchain Terminologies

Blockchain Terminologies: In this section, we will learn about a few terminologies used in Blockchain technology. Understanding these terms will help you to learn the blockchain technology in an efficient...

3 minutes read.