root / trunk / sandbox / jhb / oc2 / blowfish.py

Revision 319, 26.6 kB (checked in by ocjhb, 3 years ago)

when storing: removed b64, added zlib

  • Property svn:mime-type set to text/plain
  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1#
2# blowfish.py
3# Copyright (C) 2002 Michael Gilfix <mgilfix@eecs.tufts.edu>
4#
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
8#
9# This software must be used and distributed in accordance
10# with the law. The author claims no liability for its
11# misuse.
12#
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.
16#
17
18# This software was modified by Ivan Voras: CTR cipher mode of
19# operation was added, together with testing and example code.
20# These changes are (c) 2007./08. Ivan Voras <ivoras@gmail.com>
21# These changes can be used, modified ad distributed under the
22# GPL or Artistic License, the same as the original module.
23# All disclaimers of warranty from the original module also
24# apply to these changes.
25
26"""
27Blowfish Encryption
28
29This module is a pure python implementation of Bruce Schneier's
30encryption scheme 'Blowfish'. Blowish is a 16-round Feistel Network
31cipher and offers substantial speed gains over DES.
32
33The key is a string of length anywhere between 64 and 448 bits, or
34equivalently 8 and 56 bytes. The encryption and decryption functions operate
35on 64-bit blocks, or 8 byte strings.
36
37Send questions, comments, bugs my way:
38    Michael Gilfix <mgilfix@eecs.tufts.edu>
39   
40The module has been expanded to include CTR stream encryption/decryption
41mode, built from the primitives from the orignal module. This change
42did not alter any of the base Blowfish code from the original author.
43
44The author of CTR changes is:
45    Ivan Voras <ivoras@gmail.com>
46"""
47
48import struct, types
49
50__author__ = "Michael Gilfix <mgilfix@eecs.tufts.edu>"
51
52class Blowfish:
53
54    """Blowfish encryption Scheme
55
56    This class implements the encryption and decryption
57    functionality of the Blowfish cipher.
58
59    Public functions:
60
61        def __init__ (self, key)
62            Creates an instance of blowfish using 'key'
63            as the encryption key. Key is a string of
64            length ranging from 8 to 56 bytes (64 to 448
65            bits). Once the instance of the object is
66            created, the key is no longer necessary.
67
68        def encrypt (self, data):
69            Encrypt an 8 byte (64-bit) block of text
70            where 'data' is an 8 byte string. Returns an
71            8-byte encrypted string.
72
73        def decrypt (self, data):
74            Decrypt an 8 byte (64-bit) encrypted block
75            of text, where 'data' is the 8 byte encrypted
76            string. Returns an 8-byte string of plaintext.
77
78        def cipher (self, xl, xr, direction):
79            Encrypts a 64-bit block of data where xl is
80            the upper 32-bits and xr is the lower 32-bits.
81            'direction' is the direction to apply the
82            cipher, either ENCRYPT or DECRYPT constants.
83            returns a tuple of either encrypted or decrypted
84            data of the left half and right half of the
85            64-bit block.
86
87        def initCTR(self):
88            Initializes CTR engine for encryption or decryption.
89           
90        def encryptCTR(self, data):
91            Encrypts an arbitrary string and returns the
92            encrypted string. The method can be called successively
93            for multiple string blocks.
94           
95        def decryptCTR(self, data):
96            Decrypts a string encrypted with encryptCTR() and
97            returns the decrypted string.
98           
99    Private members:
100
101        def __round_func (self, xl)
102            Performs an obscuring function on the 32-bit
103            block of data 'xl', which is the left half of
104            the 64-bit block of data. Returns the 32-bit
105            result as a long integer.
106
107    """
108
109    # Cipher directions
110    ENCRYPT = 0
111    DECRYPT = 1
112
113    # For the __round_func
114    modulus = long (2) ** 32
115
116    def __init__ (self, key):
117
118        if not key or len (key) < 8 or len (key) > 56:
119            raise RuntimeError, "Attempted to initialize Blowfish cipher with key of invalid length: %s" %len (key)
120
121        self.p_boxes = [
122            0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
123            0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
124            0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
125            0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
126            0x9216D5D9, 0x8979FB1B
127        ]
128
129        self.s_boxes = [
130            [
131                0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
132                0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
133                0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
134                0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
135                0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
136                0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
137                0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
138                0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
139                0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
140                0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
141                0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
142                0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
143                0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
144                0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
145                0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
146                0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
147                0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
148                0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
149                0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
150                0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
151                0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
152                0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
153                0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
154                0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
155                0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
156                0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
157                0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
158                0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
159                0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
160                0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
161                0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
162                0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
163                0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
164                0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
165                0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
166                0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
167                0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
168                0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
169                0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
170                0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
171                0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
172                0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
173                0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
174                0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
175                0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
176                0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
177                0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
178                0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
179                0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
180                0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
181                0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
182                0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
183                0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
184                0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
185                0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
186                0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
187                0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
188                0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
189                0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
190                0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
191                0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
192                0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
193                0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
194                0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A
195            ],
196            [
197                0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
198                0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
199                0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
200                0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
201                0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
202                0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
203                0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
204                0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
205                0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
206                0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
207                0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
208                0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
209                0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
210                0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
211                0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
212                0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
213                0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
214                0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
215                0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
216                0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
217                0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
218                0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
219                0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
220                0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
221                0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
222                0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
223                0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
224                0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
225                0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
226                0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
227                0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
228                0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
229                0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
230                0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
231                0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
232                0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
233                0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
234                0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
235                0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
236                0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
237                0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
238                0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
239                0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
240                0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
241                0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
242                0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
243                0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
244                0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
245                0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
246                0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
247                0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
248                0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
249                0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
250                0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
251                0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
252                0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
253                0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
254                0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
255                0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
256                0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
257                0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
258                0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
259                0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
260                0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7
261            ],
262            [
263                0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
264                0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
265                0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
266                0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
267                0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
268                0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
269                0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
270                0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
271                0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
272                0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
273                0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
274                0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
275                0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
276                0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
277                0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
278                0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
279                0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
280                0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
281                0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
282                0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
283                0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
284                0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
285                0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
286                0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
287                0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
288                0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
289                0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
290                0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
291                0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
292                0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
293                0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
294                0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
295                0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
296                0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
297                0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
298                0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
299                0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
300                0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
301                0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
302                0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
303                0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
304                0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
305                0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
306                0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
307                0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
308                0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
309                0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
310                0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
311                0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
312                0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
313                0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
314                0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
315                0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
316                0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
317                0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
318                0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
319                0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
320                0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
321                0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
322                0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
323                0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
324                0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
325                0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
326                0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0
327            ],
328            [
329                0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
330                0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
331                0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
332                0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
333                0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
334                0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
335                0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
336                0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
337                0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
338                0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
339                0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
340                0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
341                0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
342                0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
343                0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
344                0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
345                0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
346                0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
347                0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
348                0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
349                0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
350                0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
351                0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
352                0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
353                0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
354                0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
355                0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
356                0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
357                0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
358                0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
359                0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
360                0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
361                0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
362                0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
363                0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
364                0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
365                0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
366                0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
367                0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
368                0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
369                0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
370                0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
371                0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
372                0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
373                0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
374                0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
375                0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
376                0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
377                0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
378                0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
379                0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
380                0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
381                0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
382                0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
383                0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
384                0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
385                0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
386                0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
387                0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
388                0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
389                0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
390                0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
391                0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
392                0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6
393            ]
394        ]
395
396        # Cycle through the p-boxes and round-robin XOR the
397        # key with the p-boxes
398        key_len = len (key)
399        index = 0
400        for i in range (len (self.p_boxes)):
401            val = (ord (key[index % key_len]) << 24) + \
402                  (ord (key[(index + 1) % key_len]) << 16) + \
403                  (ord (key[(index + 2) % key_len]) << 8) + \
404                   ord (key[(index + 3) % key_len])
405            self.p_boxes[i] = self.p_boxes[i] ^ val
406            index = index + 4
407
408        # For the chaining process
409        l, r = 0, 0
410
411        # Begin chain replacing the p-boxes
412        for i in range (0, len (self.p_boxes), 2):
413            l, r = self.cipher (l, r, self.ENCRYPT)
414            self.p_boxes[i] = l
415            self.p_boxes[i + 1] = r
416
417        # Chain replace the s-boxes
418        for i in range (len (self.s_boxes)):
419            for j in range (0, len (self.s_boxes[i]), 2):
420                l, r = self.cipher (l, r, self.ENCRYPT)
421                self.s_boxes[i][j] = l
422                self.s_boxes[i][j + 1] = r
423
424        self.initCTR()
425
426
427    def cipher (self, xl, xr, direction):
428        """Encryption primitive"""
429        if direction == self.ENCRYPT:
430            for i in range (16):
431                xl = xl ^ self.p_boxes[i]
432                xr = self.__round_func (xl) ^ xr
433                xl, xr = xr, xl
434            xl, xr = xr, xl
435            xr = xr ^ self.p_boxes[16]
436            xl = xl ^ self.p_boxes[17]
437        else:
438            for i in range (17, 1, -1):
439                xl = xl ^ self.p_boxes[i]
440                xr = self.__round_func (xl) ^ xr
441                xl, xr = xr, xl
442            xl, xr = xr, xl
443            xr = xr ^ self.p_boxes[1]
444            xl = xl ^ self.p_boxes[0]
445        return xl, xr
446
447
448    def __round_func (self, xl):
449        a = (xl & 0xFF000000) >> 24
450        b = (xl & 0x00FF0000) >> 16
451        c = (xl & 0x0000FF00) >> 8
452        d = xl & 0x000000FF
453
454        # Perform all ops as longs then and out the last 32-bits to
455        # obtain the integer
456        f = (long (self.s_boxes[0][a]) + long (self.s_boxes[1][b])) % self.modulus
457        f = f ^ long (self.s_boxes[2][c])
458        f = f + long (self.s_boxes[3][d])
459        f = (f % self.modulus) & 0xFFFFFFFF
460
461        return f
462
463
464    def encrypt (self, data):
465        if not len (data) == 8:
466            raise RuntimeError, "Attempted to encrypt data of invalid block length: %s" %len (data)
467
468        # Use big endianess since that's what everyone else uses
469        xl = ord (data[3]) | (ord (data[2]) << 8) | (ord (data[1]) << 16) | (ord (data[0]) << 24)
470        xr = ord (data[7]) | (ord (data[6]) << 8) | (ord (data[5]) << 16) | (ord (data[4]) << 24)
471
472        cl, cr = self.cipher (xl, xr, self.ENCRYPT)
473        chars = ''.join ([
474            chr ((cl >> 24) & 0xFF), chr ((cl >> 16) & 0xFF), chr ((cl >> 8) & 0xFF), chr (cl & 0xFF),
475            chr ((cr >> 24) & 0xFF), chr ((cr >> 16) & 0xFF), chr ((cr >> 8) & 0xFF), chr (cr & 0xFF)
476        ])
477        return chars
478
479
480    def decrypt (self, data):
481        if not len (data) == 8:
482            raise RuntimeError, "Attempted to encrypt data of invalid block length: %s" %len (data)
483
484        # Use big endianess since that's what everyone else uses
485        cl = ord (data[3]) | (ord (data[2]) << 8) | (ord (data[1]) << 16) | (ord (data[0]) << 24)
486        cr = ord (data[7]) | (ord (data[6]) << 8) | (ord (data[5]) << 16) | (ord (data[4]) << 24)
487
488        xl, xr = self.cipher (cl, cr, self.DECRYPT)
489        chars = ''.join ([
490            chr ((xl >> 24) & 0xFF), chr ((xl >> 16) & 0xFF), chr ((xl >> 8) & 0xFF), chr (xl & 0xFF),
491            chr ((xr >> 24) & 0xFF), chr ((xr >> 16) & 0xFF), chr ((xr >> 8) & 0xFF), chr (xr & 0xFF)
492        ])
493        return chars
494
495
496    def initCTR(self, iv=0):
497        """Initializes CTR mode of the cypher"""
498        assert struct.calcsize("Q") == self.blocksize()
499        self.ctr_iv = iv
500        self._calcCTRBUF()
501
502
503    def _calcCTRBUF(self):
504        """Calculates one block of CTR keystream"""
505        self.ctr_cks = self.encrypt(struct.pack("Q", self.ctr_iv)) # keystream block
506        self.ctr_iv += 1
507        self.ctr_pos = 0
508
509
510    def _nextCTRByte(self):
511        """Returns one byte of CTR keystream"""
512        b = ord(self.ctr_cks[self.ctr_pos])
513        self.ctr_pos += 1
514        if self.ctr_pos >= len(self.ctr_cks):
515            self._calcCTRBUF()
516        return b
517
518
519    def encryptCTR(self, data):
520        """
521        Encrypts a buffer of data with CTR mode. Multiple successive buffers
522        (belonging to the same logical stream of buffers) can be encrypted
523        with this method one after the other without any intermediate work.
524        """
525        if type(data) != types.StringType:
526            raise RuntimeException, "Can only work on 8-bit strings"
527        result = []
528        for ch in data:
529            result.append(chr(ord(ch) ^ self._nextCTRByte()))
530        return "".join(result)
531
532
533    def decryptCTR(self, data):
534        return self.encryptCTR(data)
535
536
537    def blocksize (self):
538        return 8
539
540
541    def key_length (self):
542        return 56
543
544
545    def key_bits (self):
546        return 56 * 8
547
548##############################################################
549# Module testing
550
551if __name__ == '__main__':
552    key = 'This is a test key'
553    cipher = Blowfish (key)
554
555    print "Testing encryption:"
556    xl = 123456
557    xr = 654321
558    print "\tPlain text: (%s, %s)" %(xl, xr)
559    cl, cr = cipher.cipher (xl, xr, cipher.ENCRYPT)
560    print "\tCrypted is: (%s, %s)" %(cl, cr)
561    dl, dr = cipher.cipher (cl, cr, cipher.DECRYPT)
562    print "\tUnencrypted is: (%s, %s)" %(dl, dr)
563
564    print "Testing block encrypt:"
565    text = 'testtest'
566    print "\tText:\t\t%s" %text
567    crypted = cipher.encrypt (text)
568    print "\tEncrypted:\t%s" %crypted
569    decrypted = cipher.decrypt (crypted)
570    print "\tDecrypted:\t%s" %decrypted
571   
572    print "Testing CTR encrypt:"
573    cipher.initCTR()
574    text = "The quick brown fox jumps over the lazy dog"
575    text = 'h' * 100000
576    #print "\tText:\t\t", text
577    crypted = cipher.encryptCTR(text)
578    #print "\tEncrypted:\t", crypted
579    cipher.initCTR()
580    decrypted = cipher.decryptCTR(crypted)
581    #print "\tDecrypted:\t", decrypted
Note: See TracBrowser for help on using the browser.