Blowfish is an encryption technique designed by Bruce Schneier in 1993 as an alternative to DES Encryption Technique. It is significantly faster than DES and provides a good encryption rate with no effective cryptanalysis technique found to date. It is one of the first, secure block cyphers not subject to any patents and hence freely available for anyone to use. It is symmetric block cipher algorithm.
- blockSize: 64-bits
- keySize: 32-bits to 448-bits variable size
- number of subkeys: 18 [P-array]
- number of rounds: 16
- number of substitution boxes: 4 [each having 512 entries of 32-bits each]
Blowfish Encryption Algorithm
The entire encryption process can be elaborated as:
Lets see each step one by one:
Step1: Generation of subkeys:
- 18 subkeys{P[0]…P[17]} are needed in both encryption as well as decryption process and the same subkeys are used for both the processes.
- These 18 subkeys are stored in a P-array with each array element being a 32-bit entry.
- It is initialized with the digits of pi(?).
- The hexadecimal representation of each of the subkeys is given by:
P[0] = "243f6a88"
P[1] = "85a308d3"
.
.
.
P[17] = "8979fb1b"
- Now each of the subkey is changed with respect to the input key as:
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)
The resultant P-array holds 18 subkeys that is used during the entire encryption process
Step2: initialise Substitution Boxes:
- 4 Substitution boxes(S-boxes) are needed{S[0]…S[4]} in both encryption aswell as decryption process with each S-box having 256 entries{S[i][0]…S[i][255], 0&lei&le4} where each entry is 32-bit.
- It is initialized with the digits of pi(?) after initializing the P-array. You may find the s-boxes in here!
Step3: Encryption:
- The encryption function consists of two parts:
a. Rounds: The encryption consists of 16 rounds with each round(Ri) taking inputs the plainText(P.T.) from previous round and corresponding subkey(Pi). The description of each round is as follows:
The description of the function ” F ” is as follows:
Here the function “add” is addition modulo 2^32.
b. Post-processing: The output after the 16 rounds is processed as follows:
Below is a Java Program to demonstrate Blowfish encryption:
Java
// Java Program to demonstrate Blowfish encryption import java.util.*; public class Main { // Substitution boxes each string is a 32 bit hexadecimal value. 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" } }; // Subkeys initialisation with digits of pi. String P[] = { "243f6a88" , "85a308d3" , "13198a2e" , "03707344" , "a4093822" , "299f31d0" , "082efa98" , "ec4e6c89" , "452821e6" , "38d01377" , "be5466cf" , "34e90c6c" , "c0ac29b7" , "c97c50dd" , "3f84d5b5" , "b5470917" , "9216d5d9" , "8979fb1b" }; // to store 2^32(for addition modulo 2^32). long modVal = 1 ; // to convert hexadecimal to binary. 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); // each value in hexadecimal is 4 bits in binary. binary4B = "0000" + binary4B; binary4B = binary4B.substring(binary4B.length() - 4 ); binary += binary4B; } return binary; } // convert from binary to hexadecimal. private String binToHex(String plainText) { long num = Long.parseUnsignedLong(plainText, 2 ); String hexa = Long.toHexString(num); while (hexa.length() < (plainText.length() / 4 )) // maintain output length same length // as input by appending leading zeroes. hexa = "0" + hexa; return hexa; } // xor two hexadecimal strings of the same length. 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; } // addition modulo 2^32 of two hexadecimal strings. 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 ); } // function F explained above. private String f(String plainText) { String a[] = new String[ 4 ]; String ans = "" ; for ( int i = 0 ; i < 8 ; i += 2 ) { // the column number for S-box // is 8-bit value(8*4 = 32 bit plain text) long col = Long.parseUnsignedLong( hexToBin( plainText .substring(i, i + 2 )), 2 ); a[i / 2 ] = S[i / 2 ][( int )col]; } ans = addBin(a[ 0 ], a[ 1 ]); ans = xor(ans, a[ 2 ]); ans = addBin(ans, a[ 3 ]); return ans; } // generate subkeys. private void keyGenerate(String key) { int j = 0 ; for ( int i = 0 ; i < P.length; i++) { // xor-ing 32-bit parts of the key // with initial subkeys. P[i] = xor(P[i], key.substring(j, j + 8 )); System.out.println( "subkey " + (i + 1 ) + ": " + P[i]); j = (j + 8 ) % key.length(); } } // round function private String round( int time, String plainText) { String left, right; left = plainText.substring( 0 , 8 ); right = plainText.substring( 8 , 16 ); left = xor(left, P[time]); // output from F function String fOut = f(left); right = xor(fOut, right); System.out.println( "round " + time + ": " + right + left); // swap left and right return right + left; } // encryption private String encrypt(String plainText) { for ( int i = 0 ; i < 16 ; i++) plainText = round(i, plainText); // postprocessing String right = plainText.substring( 0 , 8 ); String left = plainText.substring( 8 , 16 ); right = xor(right, P[ 16 ]); left = xor(left, P[ 17 ]); return left + right; } Main() { // storing 2^32 in modVal //(<<1 is equivalent to multiply by 2) 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(); } } // This code is contributed by AbhayBhat |
subkey 1: 8e846390 subkey 2: a295c40e subkey 3: b9a28336 subkey 4: 2446bf99 subkey 5: 0eb2313a subkey 6: 0ea9fd0d subkey 7: a295f380 subkey 8: cb78a054 subkey 9: ef9328fe subkey 10: 1fe6dfaa subkey 11: 14ef6fd7 subkey 12: 13dfc0b1 subkey 13: 6a1720af subkey 14: ee4a9c00 subkey 15: 953fdcad subkey 16: 9271c5ca subkey 17: 38addcc1 subkey 18: ae4f37c6 -----Encryption----- round 0: 77b3ba639cb0353b round 1: 0cc7d63fd5267e6d round 2: c799728ab5655509 round 3: 69612395e3dfcd13 round 4: f3f5b74b67d312af round 5: 52023d4efd5c4a46 round 6: 5b785180f097cece round 7: cc946d119000f1d4 round 8: 6af47a4b230745ef round 9: 9fb82cc57512a5e1 round 10: 1106c1ab8b574312 round 11: 7d7a616502d9011a round 12: 81e9ce71176d41ca round 13: 9727e50a6fa35271 round 14: eb761e34021839a7 round 15: 0599d9367907dbfe Cipher Text: d748ec383d3405f7
The decryption process is similar to that of encryption and the subkeys are used in reverse{P[17] – P[0]}. The entire decryption process can be elaborated as:
Lets see each step one by one:
Step1: Generation of subkeys:
- 18 subkeys{P[0]…P[17]} are needed in decryption process.
- These 18 subkeys are stored in a P-array with each array element being a 32-bit entry.
- It is initialized with the digits of pi(?).
- The hexadecimal representation of each of the subkeys is given by:
P[0] = "243f6a88"
P[1] = "85a308d3"
.
.
.
P[17] = "8979fb1b"
Note: See encryption for the initial values of P-array.
- Now each of the subkeys is changed with respect to the input key as:
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)
The resultant P-array holds 18 subkeys that is used during the entire encryption process
Step2: initialize Substitution Boxes:
- 4 Substitution boxes(S-boxes) are needed{S[0]…S[4]} in both encryption aswell as decryption process with each S-box having 256 entries{S[i][0]…S[i][255], 0&lei&le4} where each entry is 32-bit.
- It is initialized with the digits of pi(?) after initializing the P-array. You may find the s-boxes in here !
Step3: Decryption:
- The Decryption function also consists of two parts:
- Rounds: The decryption also consists of 16 rounds with each round(Ri)(as explained above) taking inputs the cipherText(C.T.) from previous round and corresponding subkey(P[17-i])(i.e for decryption the subkeys are used in reverse).
- Post-processing: The output after the 16 rounds is processed as follows:
Below is a Java program to demonstrate decryption
Java
// Java program to demonstrate // Blowfish decryption Algorithm import java.util.*; public class Main { // Substitution boxes each string is a 32 bit hexadecimal value. 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" } }; // Subkeys initialisation with digits of pi. String P[] = { "243f6a88" , "85a308d3" , "13198a2e" , "03707344" , "a4093822" , "299f31d0" , "082efa98" , "ec4e6c89" , "452821e6" , "38d01377" , "be5466cf" , "34e90c6c" , "c0ac29b7" , "c97c50dd" , "3f84d5b5" , "b5470917" , "9216d5d9" , "8979fb1b" }; // to store 2^32(for addition modulo 2^32). long modVal = 1 ; // to convert hexadecimal to binary. 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); // each value in hexadecimal // is 4 bits in binary. binary4B = "0000" + binary4B; binary4B = binary4B.substring( binary4B.length() - 4 ); binary += binary4B; } return binary; } // convert from binary to hexadecimal. private String binToHex(String plainText) { long num = Long.parseUnsignedLong(plainText, 2 ); String hexa = Long.toHexString(num); while (hexa.length() < (plainText.length() / 4 )) // maintain output length same length // as input by appending leading zeroes. hexa = "0" + hexa; return hexa; } // xor two hexadecimal strings of same length. 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; } // addition modulo 2^32 of two hexadecimal strings. 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 ); } // function F explained above. private String f(String plainText) { String a[] = new String[ 4 ]; String ans = "" ; for ( int i = 0 ; i < 8 ; i += 2 ) { // the column number for S-box // is 8-bit value(8*4 = 32 bit plain text) long col = Long.parseUnsignedLong( hexToBin( plainText.substring(i, i + 2 )), 2 ); a[i / 2 ] = S[i / 2 ][( int )col]; } ans = addBin(a[ 0 ], a[ 1 ]); ans = xor(ans, a[ 2 ]); ans = addBin(ans, a[ 3 ]); return ans; } // generate subkeys. private void keyGenerate(String key) { int j = 0 ; for ( int i = 0 ; i < P.length; i++) { P[i] = xor(P[i], key.substring(j, j + 8 )); System.out.println( "subkey " + (i + 1 ) + ": " + P[i]); j = (j + 8 ) % key.length(); } } // round function private String round( int time, String plainText) { String left, right; left = plainText.substring( 0 , 8 ); right = plainText.substring( 8 , 16 ); left = xor(left, P[time]); String fOut = f(left); // output from F function right = xor(fOut, right); System.out.println( "round " + time + ": " + right + left); // swap left and right return right + left; } // decryption private String decrypt(String plainText) { for ( int i = 17 ; i > 1 ; i--) plainText = round(i, plainText); // postprocessing 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() { // storing 2^32 in modVal //(<<1 is equivalent to multiply by 2) 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(); } } // This code is contributed by AbhayBhat |
subkey 1: 8e846390 subkey 2: a295c40e subkey 3: b9a28336 subkey 4: 2446bf99 subkey 5: 0eb2313a subkey 6: 0ea9fd0d subkey 7: a295f380 subkey 8: cb78a054 subkey 9: ef9328fe subkey 10: 1fe6dfaa subkey 11: 14ef6fd7 subkey 12: 13dfc0b1 subkey 13: 6a1720af subkey 14: ee4a9c00 subkey 15: 953fdcad subkey 16: 9271c5ca subkey 17: 38addcc1 subkey 18: ae4f37c6 -----Decryption----- round 17: 3ab5e5667907dbfe round 16: fdd297bb021839a7 round 15: 82529d676fa35271 round 14: ec939d1a176d41ca round 13: e14063bd02d9011a round 12: 66cd65508b574312 round 11: 37e82a387512a5e1 round 10: 8fe62e7e230745ef round 9: 1f04e6309000f1d4 round 8: 3624ea12f097cece round 7: c546e12ffd5c4a46 round 6: ed76301e67d312af round 5: bbd76433e3dfcd13 round 4: f160c1f4b5655509 round 3: 2512b60dd5267e6d round 2: 6f86e1389cb0353b Plain Text: 123456abcd132536
- Blowfish is a fast block cipher except when changing keys. Each new key requires a pre-processing equivalent to 4KB of text.
- It is faster and much better than DES Encryption.
- Blowfish uses a 64-bit block size which makes it vulnerable to birthday attacks.
- A reduced round variant of blowfish is known to be susceptible to known plain text attacks(2nd order differential attacks – 4 rounds).
- Bulk Encryption.
- Packet Encryption(ATM Packets)
- Password Hashing
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!