Home | History | Annotate | Download | only in cipher
      1 package ch.ethz.ssh2.crypto.cipher;
      2 
      3 /*
      4  This file was shamelessly taken from the Bouncy Castle Crypto package.
      5  Their licence file states the following:
      6 
      7  Copyright (c) 2000 - 2004 The Legion Of The Bouncy Castle
      8  (http://www.bouncycastle.org)
      9 
     10  Permission is hereby granted, free of charge, to any person obtaining a copy
     11  of this software and associated documentation files (the "Software"), to deal
     12  in the Software without restriction, including without limitation the rights
     13  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     14  copies of the Software, and to permit persons to whom the Software is
     15  furnished to do so, subject to the following conditions:
     16 
     17  The above copyright notice and this permission notice shall be included in
     18  all copies or substantial portions of the Software.
     19 
     20  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     21  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     22  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     23  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     24  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     25  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     26  THE SOFTWARE.
     27  */
     28 
     29 /**
     30  * A class that provides Blowfish key encryption operations, such as encoding
     31  * data and generating keys. All the algorithms herein are from Applied
     32  * Cryptography and implement a simplified cryptography interface.
     33  *
     34  * @author See comments in the source file
     35  * @version 2.50, 03/15/10
     36  */
     37 public class BlowFish implements BlockCipher
     38 {
     39 
     40 	private final static int[] KP = { 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0,
     41 			0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5,
     42 			0xB5470917, 0x9216D5D9, 0x8979FB1B },
     43 
     44 	KS0 = { 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, 0x24A19947,
     45 			0xB3916CF7, 0x0801F2E2, 0x858EFC16, 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658,
     46 			0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, 0xC5D1B023, 0x286085F0, 0xCA417918,
     47 			0xB8DB38EF, 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
     48 			0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, 0xA15486AF,
     49 			0x7C72E993, 0xB3EE1411, 0x636FBC2A, 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C,
     50 			0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, 0x61D809CC, 0xFB21A991, 0x487CAC60,
     51 			0x5DEC8032, 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
     52 			0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, 0x6A51A0D2,
     53 			0xD8542F68, 0x960FA728, 0xAB5133A3, 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176,
     54 			0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, 0xE06F75D8, 0x85C12073, 0x401A449F,
     55 			0x56C16AA6, 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
     56 			0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, 0xC1A94FB6,
     57 			0x409F60C4, 0x5E5C9EC2, 0x196A2463, 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, 0x6DFC511F, 0x9B30952C,
     58 			0xCC814544, 0xAF5EBD09, 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, 0xC0CBA857, 0x45C8740F, 0xD20B5F39,
     59 			0xB9D3FBDB, 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
     60 			0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, 0x9E5C57BB,
     61 			0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, 0x695B27B0, 0xBBCA58C8,
     62 			0xE1FFA35D, 0xB8F011A0, 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, 0x9A53E479, 0xB6F84565, 0xD28E49BC,
     63 			0x4BFB9790, 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
     64 			0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, 0x8FF6E2FB,
     65 			0xF2122B64, 0x8888B812, 0x900DF01C, 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, 0x2F2F2218, 0xBE0E1777,
     66 			0xEA752DFE, 0x8B021FA1, 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81,
     67 			0xD2ADA8D9, 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
     68 			0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, 0x2464369B,
     69 			0xF009B91E, 0x5563911D, 0x59DFA6AA, 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, 0x83260376, 0x6295CFA9,
     70 			0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, 0xD60F573F, 0xBC9BC6E4, 0x2B60A476,
     71 			0x81E67400, 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
     72 			0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A },
     73 
     74 	KS1 = { 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, 0xECAA8C71,
     75 			0x699A17FF, 0x5664526C, 0xC2B19EE1, 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65,
     76 			0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, 0x4CDD2086, 0x8470EB26, 0x6382E9C6,
     77 			0x021ECC5E, 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
     78 			0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, 0xAE0CF51A,
     79 			0x3CB574B2, 0x25837A58, 0xDC0921BD, 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, 0x3AE5E581, 0x37C2DADC,
     80 			0xC8B57634, 0x9AF3DDA7, 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1,
     81 			0x183EB331, 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
     82 			0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, 0x7A584718,
     83 			0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, 0xEF1C1847, 0x3215D908,
     84 			0xDD433B37, 0x24C2BA16, 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, 0x71DFF89E, 0x10314E55, 0x81AC77D6,
     85 			0x5F11199B, 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
     86 			0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, 0x803E89D6,
     87 			0x5266C825, 0x2E4CC978, 0x9C10B36A, 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, 0xF2F74EA7, 0x361D2B3D,
     88 			0x1939260F, 0x19C27960, 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, 0xE3BC4595, 0xA67BC883, 0xB17F37D1,
     89 			0x018CFF28, 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
     90 			0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, 0xB5735C90,
     91 			0x4C70A239, 0xD59E9E0B, 0xCBAADE14, 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, 0x648B1EAF, 0x19BDF0CA,
     92 			0xA02369B9, 0x655ABB50, 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, 0x9B540B19, 0x875FA099, 0x95F7997E,
     93 			0x623D7DA8, 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
     94 			0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, 0x58EBF2EF,
     95 			0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, 0x45EEE2B6, 0xA3AAABEA,
     96 			0xDB6C4F15, 0xFACB4FD0, 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, 0xD81E799E, 0x86854DC7, 0xE44B476A,
     97 			0x3D816250, 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
     98 			0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, 0x3372F092,
     99 			0x8D937E41, 0xD65FECF1, 0x6C223BDB, 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, 0xA6078084, 0x19F8509E,
    100 			0xE8EFD855, 0x61D99735, 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, 0x9E447A2E, 0xC3453484, 0xFDD56705,
    101 			0x0E1E9EC9, 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
    102 			0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 },
    103 
    104 	KS2 = { 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, 0xD4082471,
    105 			0x3320F46A, 0x43B7D4B7, 0x500061AF, 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, 0x4D95FC1D, 0x96B591AF,
    106 			0x70F4DDD3, 0x66A02F45, 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, 0x96EB27B3, 0x55FD3941, 0xDA2547E6,
    107 			0xABCA0A9A, 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
    108 			0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, 0x20FE9E35,
    109 			0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, 0x3A6EFA74, 0xDD5B4332,
    110 			0x6841E7F7, 0xCA7820FB, 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, 0x55533A3A, 0x20838D87, 0xFE6BA9B7,
    111 			0xD096954B, 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
    112 			0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, 0x07F9C9EE,
    113 			0x41041F0F, 0x404779A4, 0x5D886E17, 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, 0x257B7834, 0x602A9C60,
    114 			0xDFF8E8A3, 0x1F636C1B, 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, 0x6B2395E0, 0x333E92E1, 0x3B240B62,
    115 			0xEEBEB922, 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
    116 			0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, 0xA812DC60,
    117 			0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, 0xF1290DC7, 0xCC00FFA3,
    118 			0xB5390F92, 0x690FED0B, 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, 0xBB132F88, 0x515BAD24, 0x7B9479BF,
    119 			0x763BD6EB, 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
    120 			0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, 0x44421659,
    121 			0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, 0x9DBC8057, 0xF0F7C086,
    122 			0x60787BF8, 0x6003604D, 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, 0x83426B33, 0xF01EAB71, 0xB0804187,
    123 			0x3C005E5F, 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
    124 			0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, 0x466E598E,
    125 			0x20B45770, 0x8CD55591, 0xC902DE4C, 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, 0xB77F19B6, 0xE0A9DC09,
    126 			0x662D09A1, 0xC4324633, 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F,
    127 			0x2868F169, 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
    128 			0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, 0x11E69ED7,
    129 			0x2338EA63, 0x53C2DD94, 0xC2C21634, 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, 0x6F05E409, 0x4B7C0188,
    130 			0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, 0xED545578, 0x08FCA5B5, 0xD83D7CD3,
    131 			0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
    132 			0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 },
    133 
    134 	KS3 = { 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, 0xD5118E9D,
    135 			0xBF0F7315, 0xD62D1C7E, 0xC700C47B, 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, 0x5748AB2F, 0xBC946E79,
    136 			0xC6A376D2, 0x6549C2C8, 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, 0x2939BBDB, 0xA9BA4650, 0xAC9526E8,
    137 			0xBE5EE304, 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
    138 			0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, 0xC72FEFD3,
    139 			0xF752F7DA, 0x3F046F69, 0x77FA0A59, 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, 0xE990FD5A, 0x9E34D797,
    140 			0x2CF0B7D9, 0x022B8B51, 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472,
    141 			0x5A88F54C, 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
    142 			0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, 0xC3EB9E15,
    143 			0x3C9057A2, 0x97271AEC, 0xA93A072A, 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, 0x7533D928, 0xB155FDF5,
    144 			0x03563482, 0x8ABA3CBB, 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, 0x4DE81751, 0x3830DC8E, 0x379D5862,
    145 			0x9320F991, 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
    146 			0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, 0x5BBEF7DD,
    147 			0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, 0x72EACEA8, 0xFA6484BB,
    148 			0x8D6612AE, 0xBF3C6F47, 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, 0x740E0D8D, 0xE75B1357, 0xF8721671,
    149 			0xAF537D5D, 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
    150 			0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, 0xA08839E1,
    151 			0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, 0x1A908749, 0xD44FBD9A,
    152 			0xD0DADECB, 0xD50ADA38, 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF,
    153 			0x27D9459C, 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
    154 			0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, 0x9F1F9532,
    155 			0xE0D392DF, 0xD3A0342B, 0x8971F21E, 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, 0xDF359F8D, 0x9B992F2E,
    156 			0xE60B6F47, 0x0FE3F11D, 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, 0x1618B166, 0xFD2C1D05, 0x848FD2C5,
    157 			0xF6FB2299, 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
    158 			0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, 0xC9AA53FD,
    159 			0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3,
    160 			0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0,
    161 			0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
    162 			0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 };
    163 
    164 	// ====================================
    165 	// Useful constants
    166 	// ====================================
    167 
    168 	private static final int ROUNDS = 16;
    169 	private static final int BLOCK_SIZE = 8; // bytes = 64 bits
    170 	private static final int SBOX_SK = 256;
    171 	private static final int P_SZ = ROUNDS + 2;
    172 
    173 	private final int[] S0, S1, S2, S3; // the s-boxes
    174 	private final int[] P; // the p-array
    175 
    176 	private boolean doEncrypt = false;
    177 
    178 	private byte[] workingKey = null;
    179 
    180 	public BlowFish()
    181 	{
    182 		S0 = new int[SBOX_SK];
    183 		S1 = new int[SBOX_SK];
    184 		S2 = new int[SBOX_SK];
    185 		S3 = new int[SBOX_SK];
    186 		P = new int[P_SZ];
    187 	}
    188 
    189 	/**
    190 	 * initialise a Blowfish cipher.
    191 	 *
    192 	 * @param encrypting
    193 	 *            whether or not we are for encryption.
    194 	 * @param key
    195 	 *            the key required to set up the cipher.
    196 	 * @exception IllegalArgumentException
    197 	 *                if the params argument is inappropriate.
    198 	 */
    199 	public void init(boolean encrypting, byte[] key)
    200 	{
    201 		this.doEncrypt = encrypting;
    202 		this.workingKey = key;
    203 		setKey(this.workingKey);
    204 	}
    205 
    206 	public String getAlgorithmName()
    207 	{
    208 		return "Blowfish";
    209 	}
    210 
    211 	public final void transformBlock(byte[] in, int inOff, byte[] out, int outOff)
    212 	{
    213 		if (workingKey == null)
    214 		{
    215 			throw new IllegalStateException("Blowfish not initialised");
    216 		}
    217 
    218 		if (doEncrypt)
    219 		{
    220 			encryptBlock(in, inOff, out, outOff);
    221 		}
    222 		else
    223 		{
    224 			decryptBlock(in, inOff, out, outOff);
    225 		}
    226 	}
    227 
    228 	public void reset()
    229 	{
    230 	}
    231 
    232 	public int getBlockSize()
    233 	{
    234 		return BLOCK_SIZE;
    235 	}
    236 
    237 	// ==================================
    238 	// Private Implementation
    239 	// ==================================
    240 
    241 	private int F(int x)
    242 	{
    243 		return (((S0[(x >>> 24)] + S1[(x >>> 16) & 0xff]) ^ S2[(x >>> 8) & 0xff]) + S3[x & 0xff]);
    244 	}
    245 
    246 	/**
    247 	 * apply the encryption cycle to each value pair in the table.
    248 	 */
    249 	private void processTable(int xl, int xr, int[] table)
    250 	{
    251 		int size = table.length;
    252 
    253 		for (int s = 0; s < size; s += 2)
    254 		{
    255 			xl ^= P[0];
    256 
    257 			for (int i = 1; i < ROUNDS; i += 2)
    258 			{
    259 				xr ^= F(xl) ^ P[i];
    260 				xl ^= F(xr) ^ P[i + 1];
    261 			}
    262 
    263 			xr ^= P[ROUNDS + 1];
    264 
    265 			table[s] = xr;
    266 			table[s + 1] = xl;
    267 
    268 			xr = xl; // end of cycle swap
    269 			xl = table[s];
    270 		}
    271 	}
    272 
    273 	private void setKey(byte[] key)
    274 	{
    275 		/*
    276 		 * - comments are from _Applied Crypto_, Schneier, p338 please be
    277 		 * careful comparing the two, AC numbers the arrays from 1, the enclosed
    278 		 * code from 0.
    279 		 *
    280 		 * (1) Initialise the S-boxes and the P-array, with a fixed string This
    281 		 * string contains the hexadecimal digits of pi (3.141...)
    282 		 */
    283 		System.arraycopy(KS0, 0, S0, 0, SBOX_SK);
    284 		System.arraycopy(KS1, 0, S1, 0, SBOX_SK);
    285 		System.arraycopy(KS2, 0, S2, 0, SBOX_SK);
    286 		System.arraycopy(KS3, 0, S3, 0, SBOX_SK);
    287 
    288 		System.arraycopy(KP, 0, P, 0, P_SZ);
    289 
    290 		/*
    291 		 * (2) Now, XOR P[0] with the first 32 bits of the key, XOR P[1] with
    292 		 * the second 32-bits of the key, and so on for all bits of the key (up
    293 		 * to P[17]). Repeatedly cycle through the key bits until the entire
    294 		 * P-array has been XOR-ed with the key bits
    295 		 */
    296 		int keyLength = key.length;
    297 		int keyIndex = 0;
    298 
    299 		for (int i = 0; i < P_SZ; i++)
    300 		{
    301 			// get the 32 bits of the key, in 4 * 8 bit chunks
    302 			int data = 0x0000000;
    303 			for (int j = 0; j < 4; j++)
    304 			{
    305 				// create a 32 bit block
    306 				data = (data << 8) | (key[keyIndex++] & 0xff);
    307 
    308 				// wrap when we get to the end of the key
    309 				if (keyIndex >= keyLength)
    310 				{
    311 					keyIndex = 0;
    312 				}
    313 			}
    314 			// XOR the newly created 32 bit chunk onto the P-array
    315 			P[i] ^= data;
    316 		}
    317 
    318 		/*
    319 		 * (3) Encrypt the all-zero string with the Blowfish algorithm, using
    320 		 * the subkeys described in (1) and (2)
    321 		 *
    322 		 * (4) Replace P1 and P2 with the output of step (3)
    323 		 *
    324 		 * (5) Encrypt the output of step(3) using the Blowfish algorithm, with
    325 		 * the modified subkeys.
    326 		 *
    327 		 * (6) Replace P3 and P4 with the output of step (5)
    328 		 *
    329 		 * (7) Continue the process, replacing all elements of the P-array and
    330 		 * then all four S-boxes in order, with the output of the continuously
    331 		 * changing Blowfish algorithm
    332 		 */
    333 
    334 		processTable(0, 0, P);
    335 		processTable(P[P_SZ - 2], P[P_SZ - 1], S0);
    336 		processTable(S0[SBOX_SK - 2], S0[SBOX_SK - 1], S1);
    337 		processTable(S1[SBOX_SK - 2], S1[SBOX_SK - 1], S2);
    338 		processTable(S2[SBOX_SK - 2], S2[SBOX_SK - 1], S3);
    339 	}
    340 
    341 	/**
    342 	 * Encrypt the given input starting at the given offset and place the result
    343 	 * in the provided buffer starting at the given offset. The input will be an
    344 	 * exact multiple of our blocksize.
    345 	 */
    346 	private void encryptBlock(byte[] src, int srcIndex, byte[] dst, int dstIndex)
    347 	{
    348 		int xl = BytesTo32bits(src, srcIndex);
    349 		int xr = BytesTo32bits(src, srcIndex + 4);
    350 
    351 		xl ^= P[0];
    352 
    353 		for (int i = 1; i < ROUNDS; i += 2)
    354 		{
    355 			xr ^= F(xl) ^ P[i];
    356 			xl ^= F(xr) ^ P[i + 1];
    357 		}
    358 
    359 		xr ^= P[ROUNDS + 1];
    360 
    361 		Bits32ToBytes(xr, dst, dstIndex);
    362 		Bits32ToBytes(xl, dst, dstIndex + 4);
    363 	}
    364 
    365 	/**
    366 	 * Decrypt the given input starting at the given offset and place the result
    367 	 * in the provided buffer starting at the given offset. The input will be an
    368 	 * exact multiple of our blocksize.
    369 	 */
    370 	private void decryptBlock(byte[] src, int srcIndex, byte[] dst, int dstIndex)
    371 	{
    372 		int xl = BytesTo32bits(src, srcIndex);
    373 		int xr = BytesTo32bits(src, srcIndex + 4);
    374 
    375 		xl ^= P[ROUNDS + 1];
    376 
    377 		for (int i = ROUNDS; i > 0; i -= 2)
    378 		{
    379 			xr ^= F(xl) ^ P[i];
    380 			xl ^= F(xr) ^ P[i - 1];
    381 		}
    382 
    383 		xr ^= P[0];
    384 
    385 		Bits32ToBytes(xr, dst, dstIndex);
    386 		Bits32ToBytes(xl, dst, dstIndex + 4);
    387 	}
    388 
    389 	private int BytesTo32bits(byte[] b, int i)
    390 	{
    391 		return ((b[i] & 0xff) << 24) | ((b[i + 1] & 0xff) << 16) | ((b[i + 2] & 0xff) << 8) | ((b[i + 3] & 0xff));
    392 	}
    393 
    394 	private void Bits32ToBytes(int in, byte[] b, int offset)
    395 	{
    396 		b[offset + 3] = (byte) in;
    397 		b[offset + 2] = (byte) (in >> 8);
    398 		b[offset + 1] = (byte) (in >> 16);
    399 		b[offset] = (byte) (in >> 24);
    400 	}
    401 
    402 }
    403