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