Merge branch 'master' of git://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin...
[phpmyadmin/thilanka.git] / libraries / blowfish.php
blob0c04106831f4c40ad2a19c033853cfaf203d3420
1 <?php
2 /* vim: set expandtab sw=4 ts=4 sts=4: */
3 /**
4 * The Horde_Cipher_Blowfish:: class implements the Horde_Cipher interface
5 * encryption data using the Blowfish algorithm.
7 * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
9 * See the enclosed file COPYING for license information (LGPL). If you
10 * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
12 * @author Mike Cochrane <mike@graftonhall.co.nz>
13 * @package Horde_Cipher
15 class Horde_Cipher_blowfish
17 /**
18 * Pi Array
20 * @var array
22 protected $p = array(
23 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
24 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
25 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
26 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
27 0x9216D5D9, 0x8979FB1B);
29 /**
30 * S Box (s1)
32 * @var array
34 protected $s1 = array(
35 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
36 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
37 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
38 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
39 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
40 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
41 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
42 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
43 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
44 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
45 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
46 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
47 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
48 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
49 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
50 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
51 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
52 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
53 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
54 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
55 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
56 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
57 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
58 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
59 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
60 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
61 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
62 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
63 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
64 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
65 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
66 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
67 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
68 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
69 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
70 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
71 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
72 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
73 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
74 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
75 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
76 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
77 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
78 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
79 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
80 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
81 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
82 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
83 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
84 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
85 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
86 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
87 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
88 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
89 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
90 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
91 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
92 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
93 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
94 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
95 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
96 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
97 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
98 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A);
101 * S Box (s2)
103 * @var array
105 protected $s2 = array(
106 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
107 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
108 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
109 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
110 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
111 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
112 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
113 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
114 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
115 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
116 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
117 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
118 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
119 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
120 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
121 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
122 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
123 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
124 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
125 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
126 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
127 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
128 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
129 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
130 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
131 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
132 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
133 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
134 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
135 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
136 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
137 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
138 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
139 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
140 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
141 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
142 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
143 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
144 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
145 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
146 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
147 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
148 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
149 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
150 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
151 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
152 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
153 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
154 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
155 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
156 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
157 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
158 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
159 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
160 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
161 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
162 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
163 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
164 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
165 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
166 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
167 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
168 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
169 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7);
172 * S Box (s3)
174 * @var array
176 protected $s3 = array(
177 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
178 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
179 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
180 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
181 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
182 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
183 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
184 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
185 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
186 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
187 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
188 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
189 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
190 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
191 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
192 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
193 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
194 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
195 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
196 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
197 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
198 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
199 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
200 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
201 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
202 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
203 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
204 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
205 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
206 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
207 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
208 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
209 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
210 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
211 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
212 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
213 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
214 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
215 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
216 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
217 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
218 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
219 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
220 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
221 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
222 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
223 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
224 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
225 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
226 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
227 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
228 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
229 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
230 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
231 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
232 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
233 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
234 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
235 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
236 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
237 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
238 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
239 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
240 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0);
243 * S Box (s4)
245 * @var array
247 protected $s4 = array(
248 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
249 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
250 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
251 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
252 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
253 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
254 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
255 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
256 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
257 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
258 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
259 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
260 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
261 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
262 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
263 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
264 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
265 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
266 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
267 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
268 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
269 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
270 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
271 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
272 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
273 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
274 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
275 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
276 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
277 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
278 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
279 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
280 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
281 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
282 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
283 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
284 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
285 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
286 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
287 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
288 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
289 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
290 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
291 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
292 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
293 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
294 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
295 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
296 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
297 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
298 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
299 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
300 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
301 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
302 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
303 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
304 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
305 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
306 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
307 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
308 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
309 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
310 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
311 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6);
314 * The number of rounds to do
316 * @var integer
318 protected $_rounds = 16;
321 * Set the key to be used for en/decryption.
323 * @param string $key The key to use.
324 * @return bool
326 public function setKey($key)
328 $key = array_values(unpack('C*', $key));
329 $keyLen = count($key);
330 if ($keyLen == 0) {
331 return false;
334 $keyPos = $keyXor = 0;
335 for ($i = 0, $iMax = count($this->p); $i < $iMax; ++$i) {
336 for ($t = 0; $t < 4; $t++) {
337 $keyXor = ($keyXor << 8) | (($key[$keyPos]) & 0x0ff);
338 if (++$keyPos == $keyLen) {
339 $keyPos = 0;
342 $this->p[$i] = $this->p[$i] ^ $keyXor;
345 $encZero = array('L' => 0, 'R' => 0);
346 for ($i = 0; $i + 1 < $iMax; $i += 2) {
347 $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);
348 $this->p[$i] = $encZero['L'];
349 $this->p[$i + 1] = $encZero['R'];
352 $iMax = count($this->s1);
353 for ($i = 0; $i < $iMax; $i += 2) {
354 $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);
355 $this->s1[$i] = $encZero['L'];
356 $this->s1[$i + 1] = $encZero['R'];
359 $iMax = count($this->s2);
360 for ($i = 0; $i < $iMax; $i += 2) {
361 $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);
362 $this->s2[$i] = $encZero['L'];
363 $this->s2[$i + 1] = $encZero['R'];
366 $iMax = count($this->s3);
367 for ($i = 0; $i < $iMax; $i += 2) {
368 $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);
369 $this->s3[$i] = $encZero['L'];
370 $this->s3[$i + 1] = $encZero['R'];
373 $iMax = count($this->s4);
374 for ($i = 0; $i < $iMax; $i += 2) {
375 $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);
376 $this->s4[$i] = $encZero['L'];
377 $this->s4[$i + 1] = $encZero['R'];
382 * Encrypt a block of data.
384 * @param string $block The data to encrypt.
385 * @param string $key The key to use.
387 * @return string The encrypted output.
389 public function encryptBlock($block, $key = null)
391 if (!is_null($key)) {
392 $this->setKey($key);
395 list($L, $R) = array_values(unpack('N*', $block));
396 $parts = $this->_encryptBlock($L, $R);
397 return pack('NN', $parts['L'], $parts['R']);
401 * Encrypt left and right halves of a block of data.
403 * @param integer $L Left half of the data.
404 * @param integer $R Right half of the data.
406 * @return array A hash, with keys 'L' and 'R', and the encrypted data as
407 * the values.
409 protected function _encryptBlock($L, $R)
411 $L ^= $this->p[0];
412 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[1];
413 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[2];
414 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[3];
415 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[4];
416 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[5];
417 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[6];
418 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[7];
419 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[8];
420 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[9];
421 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[10];
422 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[11];
423 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[12];
424 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[13];
425 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[14];
426 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[15];
427 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[16];
428 $R ^= $this->p[17];
430 return array('L' => $R, 'R' => $L);
434 * Decrypt a block of data.
436 * @param string $block The data to decrypt.
437 * @param string $key The key to use.
439 * @return string The decrypted output.
441 public function decryptBlock($block, $key = null)
443 if (!is_null($key)) {
444 $this->setKey($key);
447 // change for phpMyAdmin
448 $L = null;
449 $R = null;
451 $retarray = array_values(unpack('N*', $block));
452 if (isset($retarray[0])) {
453 $L = $retarray[0];
455 if (isset($retarray[1])) {
456 $R = $retarray[1];
458 // end change for phpMyAdmin
460 $L ^= $this->p[17];
461 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[16];
462 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[15];
463 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[14];
464 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[13];
465 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[12];
466 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[11];
467 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[10];
468 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[9];
469 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[8];
470 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[7];
471 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[6];
472 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[5];
473 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[4];
474 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[3];
475 $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[2];
476 $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[1];
478 return pack("NN", $R ^ $this->p[0], $L);
483 // higher-level functions:
485 * Encryption using blowfish algorithm
487 * @param string original data
488 * @param string the secret
490 * @return string the encrypted result
492 * @access public
495 function PMA_blowfish_encrypt($data, $secret)
497 $pma_cipher = new Horde_Cipher_blowfish;
498 $encrypt = '';
500 $mod = strlen($data) % 8;
502 if ($mod > 0) {
503 $data .= str_repeat("\0", 8 - $mod);
506 foreach (str_split($data, 8) as $chunk) {
507 $encrypt .= $pma_cipher->encryptBlock($chunk, $secret);
509 return base64_encode($encrypt);
513 * Decryption using blowfish algorithm
515 * @param string encrypted data
516 * @param string the secret
518 * @return string original data
520 * @access public
523 function PMA_blowfish_decrypt($encdata, $secret)
525 $pma_cipher = new Horde_Cipher_blowfish;
526 $decrypt = '';
527 $data = base64_decode($encdata);
529 foreach (str_split($data, 8) as $chunk) {
530 $decrypt .= $pma_cipher->decryptBlock($chunk, $secret);
532 return trim($decrypt);