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