Blockchain Tutorial

Blockchain Tutorial History of Blockchain Blockchain Terminologies Working of Blockchain Blockchain vs DLT Blockchain Versions Smart Contracts Blockchain Applications Cryptography Role of Bitcoin Miners Blockchain Hash Function Bitcoin Basic Component Blockchain Block Hashing How to Block Hashes Work in Blockchain Blockchain Pow Coinbase Transaction Key Concepts in Bitcoin Key Areas of Blockchain Blockchain Cryptocurrency Blockchain DAO Blockchain Double Spending Blockchain Bitcoin Cash Bitcoin Forks and SegWit Blockchain Merkle Tree Difference between Blockchain and Database Bitcoin Mitigating Attacks Who sets the Bitcoin Price Getting Started with Bitcoin How to choose Bitcoin Wallet Sending and Receiving Bitcoin Converting Bitcoins to Fiat Currency Ethereum 2.0 Blockchain Data Management Steps to become a Blockchain developer Smart Contracts Advantages of Blockchain in healthcare Decentralized Voting System using Blockchain Demur-rage currencies in Blockchain How can Blockchain Technology help IoT to reach its full potential Project Ideas on Blockchain for Professionals Consensus Algorithms in Blockchain Top 10 Blockchain Project Concepts Uses of Blockchain Obtaining Free Test Ethers What does a Blockchain contain What does the IT industry mean by BaaS Top Blockchain Project Ideas for Beginners

Cryptography

Introduction and Features of Cryptography DNA cryptography ECB Mode in Cryptography Elliptic curve in cryptography Format String Vulnerabilities in Cryptography and Network Security Kerberos in Cryptography and Network Security Blowfish Algorithm in Cryptography Data Encryption Standards Feistel Cipher in Cryptography HMAC Algorithm in Cryptography IP Security in Cryptography ElGamal Algorithm ElGamal Cryptosystem What is IDEA Advantages of Cryptography Role of Bitcoin Miners Blockchain Hash Function Blockchain Merkle Tree Blockchain Pow Coinbase Transactions Consensus Algorithms in Blockchain Converting Bitcoins to Fiat Currency Decentralized Voting System using Blockchain Demur-rage currencies in Blockchain Difference between Blockchain and Database Difference between Symmetric and Asymmetric Encryption Ethereum 2.0 Getting Started With Bitcoin How can Blockchain Technology help IoT to reach its full potential? How does Digital Signature Work Advantages of Blockchain in healthcare Basic Component of Bitcoin Bitcoin Forks and SegWit Bitcoin Mitigating Attacks Blockchain Bitcoin Cash Blockchain Block Hashing Blockchain Cryptocurrency Blockchain DAO Blockchain Data Management Blockchain Double Spending What does Blockchain contain? What does the IT industry mean by BaaS (Blockchain as a Service)? Who sets the Bitcoin Price? Working of Block Hashes in Blockchain How to Choose Bitcoin Wallet? Key Areas of Blockchain Key Concepts in Bitcoin Obtaining Free Test Ethers for the Rinkeby Test Network on the Ethereum Blockchain Project Ideas on Blockchain for Professionals Sending and Receiving Bitcoin Top 10 Blockchain Project Concepts Uses of Blockchain What do you need to do to become a Blockchain Developer? Blockchain Technology-Introduction

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.