mode constants are only in blockcipher
[python-cryptoplus.git] / src / Cipher / pyblowfish.py
blobf9199bbc676f4626d8dba52238d18395955dec80
2 # blowfish.py
3 # Copyright (C) Michael Gilfix <mgilfix@gmail.com>
5 # This module is open source; you can redistribute it and/or
6 # modify it under the terms of the GPL or Artistic License.
7 # These licenses are available at http://www.opensource.org
9 # This software must be used and distributed in accordance
10 # with the law. The author claims no liability for its
11 # misuse.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 """
19 Blowfish Encryption
21 This module is a pure python implementation of Bruce Schneier's
22 encryption scheme 'Blowfish'. Blowish is a 16-round Feistel Network
23 cipher and offers substantial speed gains over DES.
25 The key is a string of length anywhere between 64 and 448 bits, or
26 equivalently 8 and 56 bytes. The encryption and decryption functions
27 operate on 64-bit blocks, or 8 byte strings.
29 Send questions, comments, bugs my way. Or, just let me know you're
30 using the software:
31 Michael Gilfix <mgilfix@gmail.com>
32 """
34 __author__ = "Michael Gilfix <mgilfix@gmail.com>"
36 import copy
38 class Blowfish:
39 """Blowfish encryption Scheme
41 This class implements the encryption and decryption
42 functionality of the Blowfish cipher.
44 Public functions:
46 def __init__(self, key)
47 Creates an instance of blowfish using 'key'
48 as the encryption key. Key is a string of
49 length ranging from 8 to 56 bytes (64 to 448
50 bits). Once the instance of the object is
51 created, the key is no longer necessary.
53 def encrypt(self, data):
54 Convenience method. Calls crypt under the covers.
56 def decrypt(self, data):
57 Convenience method. Calls crypt under the covers.
59 def crypt(self, data, direction):
60 Performs actual encryption/decryption of data
61 depending on the direction. The data is broken
62 up into 8 byte chunks for the ciphering
63 process. If the data does not align on 8 byte
64 chunks, then null padding is added. This is
65 removed upon decryption.
67 def cipher(self, xl, xr, direction):
68 Encrypts a 64-bit block of data where xl is
69 the upper 32-bits and xr is the lower 32-bits.
70 'direction' is the direction to apply the
71 cipher, either ENCRYPT or DECRYPT constants.
72 returns a tuple of either encrypted or decrypted
73 data of the left half and right half of the
74 64-bit block.
76 Private members:
78 def __round_func(self, xl)
79 Performs an obscuring function on the 32-bit
80 block of data 'xl', which is the left half of
81 the 64-bit block of data. Returns the 32-bit
82 result as a long integer.
84 """
85 # Cipher directions
86 ENCRYPT = 0
87 DECRYPT = 1
89 # For the __round_func
90 MODULUS = 2L ** 32
92 # Constants
93 BLOCK_SIZE = 8
94 MAX_KEY_LENGTH = 56
96 P_BOXES = [
97 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
98 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
99 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
100 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
101 0x9216D5D9L, 0x8979FB1BL
104 S_BOXES = [
106 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
107 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
108 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
109 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
110 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
111 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
112 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
113 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
114 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
115 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
116 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
117 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
118 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
119 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
120 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
121 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
122 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
123 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
124 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
125 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
126 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
127 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
128 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
129 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
130 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
131 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
132 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
133 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
134 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
135 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
136 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
137 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
138 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
139 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
140 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
141 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
142 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
143 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
144 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
145 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
146 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
147 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
148 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
149 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
150 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
151 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
152 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
153 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
154 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
155 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
156 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
157 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
158 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
159 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
160 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
161 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
162 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
163 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
164 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
165 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
166 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
167 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
168 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
169 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076A
172 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
173 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
174 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
175 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
176 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
177 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
178 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
179 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
180 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
181 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
182 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
183 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
184 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
185 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
186 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
187 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
188 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
189 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
190 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
191 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
192 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
193 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
194 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
195 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
196 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
197 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
198 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
199 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
200 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
201 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
202 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
203 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
204 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
205 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
206 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
207 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
208 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
209 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
210 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
211 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
212 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
213 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
214 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
215 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
216 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
217 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
218 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
219 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
220 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
221 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
222 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
223 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
224 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
225 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
226 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
227 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
228 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
229 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
230 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
231 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
232 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
233 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
234 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
235 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7
238 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
239 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
240 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
241 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
242 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
243 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
244 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
245 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
246 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
247 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
248 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
249 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
250 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
251 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
252 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
253 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
254 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
255 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
256 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
257 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
258 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
259 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
260 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
261 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
262 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
263 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
264 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
265 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
266 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
267 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
268 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
269 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
270 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
271 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
272 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
273 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
274 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
275 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
276 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
277 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
278 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
279 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
280 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
281 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
282 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
283 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
284 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
285 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
286 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
287 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
288 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
289 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
290 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
291 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
292 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
293 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
294 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
295 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
296 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
297 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
298 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
299 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
300 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
301 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0
304 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
305 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
306 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
307 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
308 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
309 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
310 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
311 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
312 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
313 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
314 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
315 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
316 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
317 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
318 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
319 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
320 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
321 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
322 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
323 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
324 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
325 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
326 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
327 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
328 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
329 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
330 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
331 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
332 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
333 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
334 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
335 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
336 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
337 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
338 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
339 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
340 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
341 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
342 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
343 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
344 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
345 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
346 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
347 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
348 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
349 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
350 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
351 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
352 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
353 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
354 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
355 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
356 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
357 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
358 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
359 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
360 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
361 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
362 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
363 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
364 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
365 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
366 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
367 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6
371 def __init__(self, key):
372 if not key or len(key) < 8 or len(key) > 56:
373 raise ValueError, "Invalid cipher key length: %s" %len(key)
375 # Initialize cipher copies from static data
376 self.p_boxes = copy.deepcopy(self.P_BOXES)
377 self.s_boxes = copy.deepcopy(self.S_BOXES)
379 # Cycle through the p-boxes and round-robin XOR the
380 # key ordinals with the p-boxes
381 key_ord = map(ord, key)
382 key_len = len(key_ord)
383 index = 0
384 for i in range(len(self.p_boxes)):
385 val = (key_ord[index % key_len] << 24) + \
386 (key_ord[(index + 1) % key_len] << 16) + \
387 (key_ord[(index + 2) % key_len] << 8) + \
388 key_ord[(index + 3) % key_len]
389 self.p_boxes[i] = self.p_boxes[i] ^ val
390 index = index + 4
392 # For the chaining process
393 l, r = 0, 0
395 # Begin chain replacing the p-boxes
396 for i in range(0, len(self.p_boxes), 2):
397 l, r = self.cipher(l, r, self.ENCRYPT)
398 self.p_boxes[i] = l
399 self.p_boxes[i + 1] = r
401 # Chain replace the s-boxes
402 for i in range(len(self.s_boxes)):
403 for j in range(0, len(self.s_boxes[i]), 2):
404 l, r = self.cipher(l, r, self.ENCRYPT)
405 self.s_boxes[i][j] = l
406 self.s_boxes[i][j + 1] = r
408 def cipher(self, xl, xr, direction):
409 if direction == self.ENCRYPT:
410 for i in range(16):
411 xl = xl ^ self.p_boxes[i]
412 xr = self.__round_func(xl) ^ xr
413 xl, xr = xr, xl
414 xl, xr = xr, xl
415 xr = xr ^ self.p_boxes[16]
416 xl = xl ^ self.p_boxes[17]
417 else:
418 for i in range(17, 1, -1):
419 xl = xl ^ self.p_boxes[i]
420 xr = self.__round_func(xl) ^ xr
421 xl, xr = xr, xl
422 xl, xr = xr, xl
423 xr = xr ^ self.p_boxes[1]
424 xl = xl ^ self.p_boxes[0]
425 return xl, xr
427 def __round_func(self, xl):
428 a = (xl & 0xFF000000) >> 24
429 b = (xl & 0x00FF0000) >> 16
430 c = (xl & 0x0000FF00) >> 8
431 d = xl & 0x000000FF
433 # Perform all ops as longs then and out the last 32-bits to
434 # obtain the integer
435 f = (self.s_boxes[0][a] + self.s_boxes[1][b]) % self.MODULUS
436 f = f ^ self.s_boxes[2][c]
437 f = f + self.s_boxes[3][d]
438 f = (f % self.MODULUS) & 0xFFFFFFFF
439 return int(f)
441 def crypt(self, data, direction):
442 # Pad the data if need be so it has 8 byte chunks
443 align = len(data) % 8
444 if align != 0:
445 padding = '\x00' * (8 - align)
446 data += padding
448 result = ''
449 for i in range(0, len(data), 8):
450 # Use big endianess since that's what everyone else uses
451 chunk = map(ord, data[i : i + 8])
452 xl = chunk[3] | (chunk[2] << 8) | (chunk[1] << 16) | (chunk[0] << 24)
453 xr = chunk[7] | (chunk[6] << 8) | (chunk[5] << 16) | (chunk[4] << 24)
454 xl, xr = self.cipher(xl, xr, direction)
455 chunk = (
456 (xl >> 24) & 0xFF, (xl >> 16) & 0xFF, (xl >> 8) & 0xFF, xl & 0xFF,
457 (xr >> 24) & 0xFF, (xr >> 16) & 0xFF, (xr >> 8) & 0xFF, xr & 0xFF
459 result += ''.join(map(chr, chunk))
461 # Strip the padding if we decrypted
462 if direction == self.DECRYPT:
463 result = result.rstrip('\x00')
464 return result
466 def encrypt(self, data):
467 return self.crypt(data, self.ENCRYPT)
469 def decrypt(self, data):
470 return self.crypt(data, self.DECRYPT)
472 def block_size(self):
473 return self.BLOCK_SIZE
475 def max_key_length(self):
476 return self.MAX_KEY_LENGTH
478 def max_key_bits(self):
479 return self.max_key_length() * self.block_size()
481 ##############################################################
482 # Simple module testing
484 if __name__ == '__main__':
485 key = 'This is a simple test key'
486 cipher = Blowfish(key)
487 print "Max key bits: %s" %cipher.max_key_bits()
489 print "Testing encryption:"
490 xl = 123456
491 xr = 654321
492 print "\tPlain text: (%s, %s)" %(xl, xr)
493 cl, cr = cipher.cipher(xl, xr, cipher.ENCRYPT)
494 print "\tCrypted is: (%s, %s)" %(cl, cr)
495 dl, dr = cipher.cipher(cl, cr, cipher.DECRYPT)
496 print "\tUnencrypted is: (%s, %s)" %(dl, dr)
498 print "Testing buffer encrypt:"
499 text = 'This is my test string. Sample text goes here'
500 print "\tText: [%s], len: %s" %(text, len(text))
501 crypted = cipher.encrypt(text)
502 print "\tEncrypted: [%s]" %crypted
503 decrypted = cipher.decrypt(crypted)
504 print "\tDecrypted: [%s]" %decrypted
506 print "Testing decryption from separate instances:"
507 cipher1 = Blowfish(key)
508 crypted = cipher1.encrypt(text)
509 print "\tEncrypt cipher1: [%s]" %crypted
510 cipher2 = Blowfish(key)
511 decrypted = cipher2.decrypt(crypted)
512 print "\tDecrypt cipher2: [%s]" %decrypted