×

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

Difference between Blockchain and Database

A Blockchain is a distributed database or ledger in which data is stored in blocks. It is built on distributed ledger technology, which may be utilized between parties that do...

3 minutes read.

Blockchain Bitcoin Cash

Bitcoin Cash is an internet- grounded peer-to- peer electronic cash system. It is fully decentralized, with no central bank, and doesn’t calculate on third parties to serve. Bitcoin Cash is...

4 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 DAO

In Blockchain, the full form of DAO is Decentralized Autonomous Organization. As the DAO full form says, the organization is both decentralized & autonomous. Sometimes DAO is also known as...

3 minutes read.

Cryptography in Blockchain

What is Cryptography? Cryptography is a method for developing codes that prevent third parties from viewing private data. It helps in protecting data and information by using codes, such that it can only be...

4 minutes read.

Advantages of Cryptography

Cryptography is the practice of secure communication in the presence of third parties. It allows for the secure exchange of information between two or more parties and can be used...

4 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.

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.

Elliptic curve in cryptography

What is Elliptical Curve Cryptography (ECC)? Elliptic Curve Cryptography (ECC) is public key cryptography based on elliptic curve theory. It can be used to create smaller, faster and more efficient public...

4 minutes read.

DNA cryptography

What is DNA Cryptography? DNA Cryptography is the branch of science that is used to encrypt and decrypt the data for hiding propose. It has a significant role in the field...

3 minutes read.

Key Concepts in Bitcoin

There are many countries in this world and each country uses their currency for trading purpose. Some of them use the dollar, pound, euro, yen & rupee etc. These currencies...

3 minutes read.

Introduction and Features of Cryptography

What is Cryptography? Secret coding has been a part of military activities for many years. In old times people know how to communicate privately. So we can say that private communication...

3 minutes read.

Obtaining Free Test Ethers for the Rinkeby Test Network on the Ethereum Blockchain

On the Ethereum Blockchain network, each of us must pay a fee known as gas in order to conduct a transaction or carry out a contract. Therefore, on the Ethereum...

2 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.

Sending and Receiving 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.

Uses of Blockchain

Nowadays, there are a lot of applications for Blockchain technology exist. The main use of Blockchains is to serve as a distributed ledger for cryptocurrencies like Bitcoin; by the end...

5 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.

Consensus Algorithms in Blockchain

We all know that Blockchain is a decentralized distributed network that provides immutability, privacy, security, and transparency. Considering the absence of a central authority to authenticate & verify transactions, the...

4 minutes read.

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.

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.