root/camellia/trunk/pycamellia.py

リビジョン 17, 25.5 kB (コミッタ: sgk, コミット時期: 3 年 前)

camellia.pyが、ccamellia.soかpycamellia.pyをimportするようにした。

Line 
1 '''
2 pycamellia.py v 0.0
3
4 http://omake.accense.com/wiki/PythonCamellia
5
6 Portions Copyright (c) 2006 by Accense Technology, Inc.
7 on the work to port for Python derived from the Camellia source code
8 distributed as 'camellia-BSD-1.0.tar.gz'.
9
10 https://info.isl.ntt.co.jp/crypt/eng/camellia/index_s.html
11
12 Copyright (c) 2006
13  NTT (Nippon Telegraph and Telephone Corporation) . All rights reserved.
14
15 Redistribution and use in source and binary forms, with or without
16 modification, are permitted provided that the following conditions
17 are met:
18 1. Redistributions of source code must retain the above copyright
19    notice, this list of conditions and the following disclaimer as
20    the first lines of this file unmodified.
21 2. Redistributions in binary form must reproduce the above copyright
22    notice, this list of conditions and the following disclaimer in the
23    documentation and/or other materials provided with the distribution.
24
25 THIS SOFTWARE IS PROVIDED BY NTT ``AS IS'' AND ANY EXPRESS OR
26 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28 IN NO EVENT SHALL NTT BE LIABLE FOR ANY DIRECT, INDIRECT,
29 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
34 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 '''
36
37 __all__ = ['Ekeygen', 'EncryptBlock', 'DecryptBlock']
38
39 #
40 # S-box data
41 #
42 SBOX1_1110 = (
43   0x70707000L, 0x82828200L, 0x2c2c2c00L, 0xececec00L, 0xb3b3b300L, 0x27272700L,
44   0xc0c0c000L, 0xe5e5e500L, 0xe4e4e400L, 0x85858500L, 0x57575700L, 0x35353500L,
45   0xeaeaea00L, 0x0c0c0c00L, 0xaeaeae00L, 0x41414100L, 0x23232300L, 0xefefef00L,
46   0x6b6b6b00L, 0x93939300L, 0x45454500L, 0x19191900L, 0xa5a5a500L, 0x21212100L,
47   0xededed00L, 0x0e0e0e00L, 0x4f4f4f00L, 0x4e4e4e00L, 0x1d1d1d00L, 0x65656500L,
48   0x92929200L, 0xbdbdbd00L, 0x86868600L, 0xb8b8b800L, 0xafafaf00L, 0x8f8f8f00L,
49   0x7c7c7c00L, 0xebebeb00L, 0x1f1f1f00L, 0xcecece00L, 0x3e3e3e00L, 0x30303000L,
50   0xdcdcdc00L, 0x5f5f5f00L, 0x5e5e5e00L, 0xc5c5c500L, 0x0b0b0b00L, 0x1a1a1a00L,
51   0xa6a6a600L, 0xe1e1e100L, 0x39393900L, 0xcacaca00L, 0xd5d5d500L, 0x47474700L,
52   0x5d5d5d00L, 0x3d3d3d00L, 0xd9d9d900L, 0x01010100L, 0x5a5a5a00L, 0xd6d6d600L,
53   0x51515100L, 0x56565600L, 0x6c6c6c00L, 0x4d4d4d00L, 0x8b8b8b00L, 0x0d0d0d00L,
54   0x9a9a9a00L, 0x66666600L, 0xfbfbfb00L, 0xcccccc00L, 0xb0b0b000L, 0x2d2d2d00L,
55   0x74747400L, 0x12121200L, 0x2b2b2b00L, 0x20202000L, 0xf0f0f000L, 0xb1b1b100L,
56   0x84848400L, 0x99999900L, 0xdfdfdf00L, 0x4c4c4c00L, 0xcbcbcb00L, 0xc2c2c200L,
57   0x34343400L, 0x7e7e7e00L, 0x76767600L, 0x05050500L, 0x6d6d6d00L, 0xb7b7b700L,
58   0xa9a9a900L, 0x31313100L, 0xd1d1d100L, 0x17171700L, 0x04040400L, 0xd7d7d700L,
59   0x14141400L, 0x58585800L, 0x3a3a3a00L, 0x61616100L, 0xdedede00L, 0x1b1b1b00L,
60   0x11111100L, 0x1c1c1c00L, 0x32323200L, 0x0f0f0f00L, 0x9c9c9c00L, 0x16161600L,
61   0x53535300L, 0x18181800L, 0xf2f2f200L, 0x22222200L, 0xfefefe00L, 0x44444400L,
62   0xcfcfcf00L, 0xb2b2b200L, 0xc3c3c300L, 0xb5b5b500L, 0x7a7a7a00L, 0x91919100L,
63   0x24242400L, 0x08080800L, 0xe8e8e800L, 0xa8a8a800L, 0x60606000L, 0xfcfcfc00L,
64   0x69696900L, 0x50505000L, 0xaaaaaa00L, 0xd0d0d000L, 0xa0a0a000L, 0x7d7d7d00L,
65   0xa1a1a100L, 0x89898900L, 0x62626200L, 0x97979700L, 0x54545400L, 0x5b5b5b00L,
66   0x1e1e1e00L, 0x95959500L, 0xe0e0e000L, 0xffffff00L, 0x64646400L, 0xd2d2d200L,
67   0x10101000L, 0xc4c4c400L, 0x00000000L, 0x48484800L, 0xa3a3a300L, 0xf7f7f700L,
68   0x75757500L, 0xdbdbdb00L, 0x8a8a8a00L, 0x03030300L, 0xe6e6e600L, 0xdadada00L,
69   0x09090900L, 0x3f3f3f00L, 0xdddddd00L, 0x94949400L, 0x87878700L, 0x5c5c5c00L,
70   0x83838300L, 0x02020200L, 0xcdcdcd00L, 0x4a4a4a00L, 0x90909000L, 0x33333300L,
71   0x73737300L, 0x67676700L, 0xf6f6f600L, 0xf3f3f300L, 0x9d9d9d00L, 0x7f7f7f00L,
72   0xbfbfbf00L, 0xe2e2e200L, 0x52525200L, 0x9b9b9b00L, 0xd8d8d800L, 0x26262600L,
73   0xc8c8c800L, 0x37373700L, 0xc6c6c600L, 0x3b3b3b00L, 0x81818100L, 0x96969600L,
74   0x6f6f6f00L, 0x4b4b4b00L, 0x13131300L, 0xbebebe00L, 0x63636300L, 0x2e2e2e00L,
75   0xe9e9e900L, 0x79797900L, 0xa7a7a700L, 0x8c8c8c00L, 0x9f9f9f00L, 0x6e6e6e00L,
76   0xbcbcbc00L, 0x8e8e8e00L, 0x29292900L, 0xf5f5f500L, 0xf9f9f900L, 0xb6b6b600L,
77   0x2f2f2f00L, 0xfdfdfd00L, 0xb4b4b400L, 0x59595900L, 0x78787800L, 0x98989800L,
78   0x06060600L, 0x6a6a6a00L, 0xe7e7e700L, 0x46464600L, 0x71717100L, 0xbababa00L,
79   0xd4d4d400L, 0x25252500L, 0xababab00L, 0x42424200L, 0x88888800L, 0xa2a2a200L,
80   0x8d8d8d00L, 0xfafafa00L, 0x72727200L, 0x07070700L, 0xb9b9b900L, 0x55555500L,
81   0xf8f8f800L, 0xeeeeee00L, 0xacacac00L, 0x0a0a0a00L, 0x36363600L, 0x49494900L,
82   0x2a2a2a00L, 0x68686800L, 0x3c3c3c00L, 0x38383800L, 0xf1f1f100L, 0xa4a4a400L,
83   0x40404000L, 0x28282800L, 0xd3d3d300L, 0x7b7b7b00L, 0xbbbbbb00L, 0xc9c9c900L,
84   0x43434300L, 0xc1c1c100L, 0x15151500L, 0xe3e3e300L, 0xadadad00L, 0xf4f4f400L,
85   0x77777700L, 0xc7c7c700L, 0x80808000L, 0x9e9e9e00L
86 )
87
88 SBOX4_4404 = (
89   0x70700070L, 0x2c2c002cL, 0xb3b300b3L, 0xc0c000c0L, 0xe4e400e4L, 0x57570057L,
90   0xeaea00eaL, 0xaeae00aeL, 0x23230023L, 0x6b6b006bL, 0x45450045L, 0xa5a500a5L,
91   0xeded00edL, 0x4f4f004fL, 0x1d1d001dL, 0x92920092L, 0x86860086L, 0xafaf00afL,
92   0x7c7c007cL, 0x1f1f001fL, 0x3e3e003eL, 0xdcdc00dcL, 0x5e5e005eL, 0x0b0b000bL,
93   0xa6a600a6L, 0x39390039L, 0xd5d500d5L, 0x5d5d005dL, 0xd9d900d9L, 0x5a5a005aL,
94   0x51510051L, 0x6c6c006cL, 0x8b8b008bL, 0x9a9a009aL, 0xfbfb00fbL, 0xb0b000b0L,
95   0x74740074L, 0x2b2b002bL, 0xf0f000f0L, 0x84840084L, 0xdfdf00dfL, 0xcbcb00cbL,
96   0x34340034L, 0x76760076L, 0x6d6d006dL, 0xa9a900a9L, 0xd1d100d1L, 0x04040004L,
97   0x14140014L, 0x3a3a003aL, 0xdede00deL, 0x11110011L, 0x32320032L, 0x9c9c009cL,
98   0x53530053L, 0xf2f200f2L, 0xfefe00feL, 0xcfcf00cfL, 0xc3c300c3L, 0x7a7a007aL,
99   0x24240024L, 0xe8e800e8L, 0x60600060L, 0x69690069L, 0xaaaa00aaL, 0xa0a000a0L,
100   0xa1a100a1L, 0x62620062L, 0x54540054L, 0x1e1e001eL, 0xe0e000e0L, 0x64640064L,
101   0x10100010L, 0x00000000L, 0xa3a300a3L, 0x75750075L, 0x8a8a008aL, 0xe6e600e6L,
102   0x09090009L, 0xdddd00ddL, 0x87870087L, 0x83830083L, 0xcdcd00cdL, 0x90900090L,
103   0x73730073L, 0xf6f600f6L, 0x9d9d009dL, 0xbfbf00bfL, 0x52520052L, 0xd8d800d8L,
104   0xc8c800c8L, 0xc6c600c6L, 0x81810081L, 0x6f6f006fL, 0x13130013L, 0x63630063L,
105   0xe9e900e9L, 0xa7a700a7L, 0x9f9f009fL, 0xbcbc00bcL, 0x29290029L, 0xf9f900f9L,
106   0x2f2f002fL, 0xb4b400b4L, 0x78780078L, 0x06060006L, 0xe7e700e7L, 0x71710071L,
107   0xd4d400d4L, 0xabab00abL, 0x88880088L, 0x8d8d008dL, 0x72720072L, 0xb9b900b9L,
108   0xf8f800f8L, 0xacac00acL, 0x36360036L, 0x2a2a002aL, 0x3c3c003cL, 0xf1f100f1L,
109   0x40400040L, 0xd3d300d3L, 0xbbbb00bbL, 0x43430043L, 0x15150015L, 0xadad00adL,
110   0x77770077L, 0x80800080L, 0x82820082L, 0xecec00ecL, 0x27270027L, 0xe5e500e5L,
111   0x85850085L, 0x35350035L, 0x0c0c000cL, 0x41410041L, 0xefef00efL, 0x93930093L,
112   0x19190019L, 0x21210021L, 0x0e0e000eL, 0x4e4e004eL, 0x65650065L, 0xbdbd00bdL,
113   0xb8b800b8L, 0x8f8f008fL, 0xebeb00ebL, 0xcece00ceL, 0x30300030L, 0x5f5f005fL,
114   0xc5c500c5L, 0x1a1a001aL, 0xe1e100e1L, 0xcaca00caL, 0x47470047L, 0x3d3d003dL,
115   0x01010001L, 0xd6d600d6L, 0x56560056L, 0x4d4d004dL, 0x0d0d000dL, 0x66660066L,
116   0xcccc00ccL, 0x2d2d002dL, 0x12120012L, 0x20200020L, 0xb1b100b1L, 0x99990099L,
117   0x4c4c004cL, 0xc2c200c2L, 0x7e7e007eL, 0x05050005L, 0xb7b700b7L, 0x31310031L,
118   0x17170017L, 0xd7d700d7L, 0x58580058L, 0x61610061L, 0x1b1b001bL, 0x1c1c001cL,
119   0x0f0f000fL, 0x16160016L, 0x18180018L, 0x22220022L, 0x44440044L, 0xb2b200b2L,
120   0xb5b500b5L, 0x91910091L, 0x08080008L, 0xa8a800a8L, 0xfcfc00fcL, 0x50500050L,
121   0xd0d000d0L, 0x7d7d007dL, 0x89890089L, 0x97970097L, 0x5b5b005bL, 0x95950095L,
122   0xffff00ffL, 0xd2d200d2L, 0xc4c400c4L, 0x48480048L, 0xf7f700f7L, 0xdbdb00dbL,
123   0x03030003L, 0xdada00daL, 0x3f3f003fL, 0x94940094L, 0x5c5c005cL, 0x02020002L,
124   0x4a4a004aL, 0x33330033L, 0x67670067L, 0xf3f300f3L, 0x7f7f007fL, 0xe2e200e2L,
125   0x9b9b009bL, 0x26260026L, 0x37370037L, 0x3b3b003bL, 0x96960096L, 0x4b4b004bL,
126   0xbebe00beL, 0x2e2e002eL, 0x79790079L, 0x8c8c008cL, 0x6e6e006eL, 0x8e8e008eL,
127   0xf5f500f5L, 0xb6b600b6L, 0xfdfd00fdL, 0x59590059L, 0x98980098L, 0x6a6a006aL,
128   0x46460046L, 0xbaba00baL, 0x25250025L, 0x42420042L, 0xa2a200a2L, 0xfafa00faL,
129   0x07070007L, 0x55550055L, 0xeeee00eeL, 0x0a0a000aL, 0x49490049L, 0x68680068L,
130   0x38380038L, 0xa4a400a4L, 0x28280028L, 0x7b7b007bL, 0xc9c900c9L, 0xc1c100c1L,
131   0xe3e300e3L, 0xf4f400f4L, 0xc7c700c7L, 0x9e9e009eL
132 )
133
134 SBOX2_0222 = (
135   0x00e0e0e0L, 0x00050505L, 0x00585858L, 0x00d9d9d9L, 0x00676767L, 0x004e4e4eL,
136   0x00818181L, 0x00cbcbcbL, 0x00c9c9c9L, 0x000b0b0bL, 0x00aeaeaeL, 0x006a6a6aL,
137   0x00d5d5d5L, 0x00181818L, 0x005d5d5dL, 0x00828282L, 0x00464646L, 0x00dfdfdfL,
138   0x00d6d6d6L, 0x00272727L, 0x008a8a8aL, 0x00323232L, 0x004b4b4bL, 0x00424242L,
139   0x00dbdbdbL, 0x001c1c1cL, 0x009e9e9eL, 0x009c9c9cL, 0x003a3a3aL, 0x00cacacaL,
140   0x00252525L, 0x007b7b7bL, 0x000d0d0dL, 0x00717171L, 0x005f5f5fL, 0x001f1f1fL,
141   0x00f8f8f8L, 0x00d7d7d7L, 0x003e3e3eL, 0x009d9d9dL, 0x007c7c7cL, 0x00606060L,
142   0x00b9b9b9L, 0x00bebebeL, 0x00bcbcbcL, 0x008b8b8bL, 0x00161616L, 0x00343434L,
143   0x004d4d4dL, 0x00c3c3c3L, 0x00727272L, 0x00959595L, 0x00abababL, 0x008e8e8eL,
144   0x00bababaL, 0x007a7a7aL, 0x00b3b3b3L, 0x00020202L, 0x00b4b4b4L, 0x00adadadL,
145   0x00a2a2a2L, 0x00acacacL, 0x00d8d8d8L, 0x009a9a9aL, 0x00171717L, 0x001a1a1aL,
146   0x00353535L, 0x00ccccccL, 0x00f7f7f7L, 0x00999999L, 0x00616161L, 0x005a5a5aL,
147   0x00e8e8e8L, 0x00242424L, 0x00565656L, 0x00404040L, 0x00e1e1e1L, 0x00636363L,
148   0x00090909L, 0x00333333L, 0x00bfbfbfL, 0x00989898L, 0x00979797L, 0x00858585L,
149   0x00686868L, 0x00fcfcfcL, 0x00ecececL, 0x000a0a0aL, 0x00dadadaL, 0x006f6f6fL,
150   0x00535353L, 0x00626262L, 0x00a3a3a3L, 0x002e2e2eL, 0x00080808L, 0x00afafafL,
151   0x00282828L, 0x00b0b0b0L, 0x00747474L, 0x00c2c2c2L, 0x00bdbdbdL, 0x00363636L,
152   0x00222222L, 0x00383838L, 0x00646464L, 0x001e1e1eL, 0x00393939L, 0x002c2c2cL,
153   0x00a6a6a6L, 0x00303030L, 0x00e5e5e5L, 0x00444444L, 0x00fdfdfdL, 0x00888888L,
154   0x009f9f9fL, 0x00656565L, 0x00878787L, 0x006b6b6bL, 0x00f4f4f4L, 0x00232323L,
155   0x00484848L, 0x00101010L, 0x00d1d1d1L, 0x00515151L, 0x00c0c0c0L, 0x00f9f9f9L,
156   0x00d2d2d2L, 0x00a0a0a0L, 0x00555555L, 0x00a1a1a1L, 0x00414141L, 0x00fafafaL,
157   0x00434343L, 0x00131313L, 0x00c4c4c4L, 0x002f2f2fL, 0x00a8a8a8L, 0x00b6b6b6L,
158   0x003c3c3cL, 0x002b2b2bL, 0x00c1c1c1L, 0x00ffffffL, 0x00c8c8c8L, 0x00a5a5a5L,
159   0x00202020L, 0x00898989L, 0x00000000L, 0x00909090L, 0x00474747L, 0x00efefefL,
160   0x00eaeaeaL, 0x00b7b7b7L, 0x00151515L, 0x00060606L, 0x00cdcdcdL, 0x00b5b5b5L,
161   0x00121212L, 0x007e7e7eL, 0x00bbbbbbL, 0x00292929L, 0x000f0f0fL, 0x00b8b8b8L,
162   0x00070707L, 0x00040404L, 0x009b9b9bL, 0x00949494L, 0x00212121L, 0x00666666L,
163   0x00e6e6e6L, 0x00cececeL, 0x00edededL, 0x00e7e7e7L, 0x003b3b3bL, 0x00fefefeL,
164   0x007f7f7fL, 0x00c5c5c5L, 0x00a4a4a4L, 0x00373737L, 0x00b1b1b1L, 0x004c4c4cL,
165   0x00919191L, 0x006e6e6eL, 0x008d8d8dL, 0x00767676L, 0x00030303L, 0x002d2d2dL,
166   0x00dededeL, 0x00969696L, 0x00262626L, 0x007d7d7dL, 0x00c6c6c6L, 0x005c5c5cL,
167   0x00d3d3d3L, 0x00f2f2f2L, 0x004f4f4fL, 0x00191919L, 0x003f3f3fL, 0x00dcdcdcL,
168   0x00797979L, 0x001d1d1dL, 0x00525252L, 0x00ebebebL, 0x00f3f3f3L, 0x006d6d6dL,
169   0x005e5e5eL, 0x00fbfbfbL, 0x00696969L, 0x00b2b2b2L, 0x00f0f0f0L, 0x00313131L,
170   0x000c0c0cL, 0x00d4d4d4L, 0x00cfcfcfL, 0x008c8c8cL, 0x00e2e2e2L, 0x00757575L,
171   0x00a9a9a9L, 0x004a4a4aL, 0x00575757L, 0x00848484L, 0x00111111L, 0x00454545L,
172   0x001b1b1bL, 0x00f5f5f5L, 0x00e4e4e4L, 0x000e0e0eL, 0x00737373L, 0x00aaaaaaL,
173   0x00f1f1f1L, 0x00ddddddL, 0x00595959L, 0x00141414L, 0x006c6c6cL, 0x00929292L,
174   0x00545454L, 0x00d0d0d0L, 0x00787878L, 0x00707070L, 0x00e3e3e3L, 0x00494949L,
175   0x00808080L, 0x00505050L, 0x00a7a7a7L, 0x00f6f6f6L, 0x00777777L, 0x00939393L,
176   0x00868686L, 0x00838383L, 0x002a2a2aL, 0x00c7c7c7L, 0x005b5b5bL, 0x00e9e9e9L,
177   0x00eeeeeeL, 0x008f8f8fL, 0x00010101L, 0x003d3d3dL
178 )
179
180 SBOX3_3033 = (
181   0x38003838L, 0x41004141L, 0x16001616L, 0x76007676L, 0xd900d9d9L, 0x93009393L,
182   0x60006060L, 0xf200f2f2L, 0x72007272L, 0xc200c2c2L, 0xab00ababL, 0x9a009a9aL,
183   0x75007575L, 0x06000606L, 0x57005757L, 0xa000a0a0L, 0x91009191L, 0xf700f7f7L,
184   0xb500b5b5L, 0xc900c9c9L, 0xa200a2a2L, 0x8c008c8cL, 0xd200d2d2L, 0x90009090L,
185   0xf600f6f6L, 0x07000707L, 0xa700a7a7L, 0x27002727L, 0x8e008e8eL, 0xb200b2b2L,
186   0x49004949L, 0xde00dedeL, 0x43004343L, 0x5c005c5cL, 0xd700d7d7L, 0xc700c7c7L,
187   0x3e003e3eL, 0xf500f5f5L, 0x8f008f8fL, 0x67006767L, 0x1f001f1fL, 0x18001818L,
188   0x6e006e6eL, 0xaf00afafL, 0x2f002f2fL, 0xe200e2e2L, 0x85008585L, 0x0d000d0dL,
189   0x53005353L, 0xf000f0f0L, 0x9c009c9cL, 0x65006565L, 0xea00eaeaL, 0xa300a3a3L,
190   0xae00aeaeL, 0x9e009e9eL, 0xec00ececL, 0x80008080L, 0x2d002d2dL, 0x6b006b6bL,
191   0xa800a8a8L, 0x2b002b2bL, 0x36003636L, 0xa600a6a6L, 0xc500c5c5L, 0x86008686L,
192   0x4d004d4dL, 0x33003333L, 0xfd00fdfdL, 0x66006666L, 0x58005858L, 0x96009696L,
193   0x3a003a3aL, 0x09000909L, 0x95009595L, 0x10001010L, 0x78007878L, 0xd800d8d8L,
194   0x42004242L, 0xcc00ccccL, 0xef00efefL, 0x26002626L, 0xe500e5e5L, 0x61006161L,
195   0x1a001a1aL, 0x3f003f3fL, 0x3b003b3bL, 0x82008282L, 0xb600b6b6L, 0xdb00dbdbL,
196   0xd400d4d4L, 0x98009898L, 0xe800e8e8L, 0x8b008b8bL, 0x02000202L, 0xeb00ebebL,
197   0x0a000a0aL, 0x2c002c2cL, 0x1d001d1dL, 0xb000b0b0L, 0x6f006f6fL, 0x8d008d8dL,
198   0x88008888L, 0x0e000e0eL, 0x19001919L, 0x87008787L, 0x4e004e4eL, 0x0b000b0bL,
199   0xa900a9a9L, 0x0c000c0cL, 0x79007979L, 0x11001111L, 0x7f007f7fL, 0x22002222L,
200   0xe700e7e7L, 0x59005959L, 0xe100e1e1L, 0xda00dadaL, 0x3d003d3dL, 0xc800c8c8L,
201   0x12001212L, 0x04000404L, 0x74007474L, 0x54005454L, 0x30003030L, 0x7e007e7eL,
202   0xb400b4b4L, 0x28002828L, 0x55005555L, 0x68006868L, 0x50005050L, 0xbe00bebeL,
203   0xd000d0d0L, 0xc400c4c4L, 0x31003131L, 0xcb00cbcbL, 0x2a002a2aL, 0xad00adadL,
204   0x0f000f0fL, 0xca00cacaL, 0x70007070L, 0xff00ffffL, 0x32003232L, 0x69006969L,
205   0x08000808L, 0x62006262L, 0x00000000L, 0x24002424L, 0xd100d1d1L, 0xfb00fbfbL,
206   0xba00babaL, 0xed00ededL, 0x45004545L, 0x81008181L, 0x73007373L, 0x6d006d6dL,
207   0x84008484L, 0x9f009f9fL, 0xee00eeeeL, 0x4a004a4aL, 0xc300c3c3L, 0x2e002e2eL,
208   0xc100c1c1L, 0x01000101L, 0xe600e6e6L, 0x25002525L, 0x48004848L, 0x99009999L,
209   0xb900b9b9L, 0xb300b3b3L, 0x7b007b7bL, 0xf900f9f9L, 0xce00ceceL, 0xbf00bfbfL,
210   0xdf00dfdfL, 0x71007171L, 0x29002929L, 0xcd00cdcdL, 0x6c006c6cL, 0x13001313L,
211   0x64006464L, 0x9b009b9bL, 0x63006363L, 0x9d009d9dL, 0xc000c0c0L, 0x4b004b4bL,
212   0xb700b7b7L, 0xa500a5a5L, 0x89008989L, 0x5f005f5fL, 0xb100b1b1L, 0x17001717L,
213   0xf400f4f4L, 0xbc00bcbcL, 0xd300d3d3L, 0x46004646L, 0xcf00cfcfL, 0x37003737L,
214   0x5e005e5eL, 0x47004747L, 0x94009494L, 0xfa00fafaL, 0xfc00fcfcL, 0x5b005b5bL,
215   0x97009797L, 0xfe00fefeL, 0x5a005a5aL, 0xac00acacL, 0x3c003c3cL, 0x4c004c4cL,
216   0x03000303L, 0x35003535L, 0xf300f3f3L, 0x23002323L, 0xb800b8b8L, 0x5d005d5dL,
217   0x6a006a6aL, 0x92009292L, 0xd500d5d5L, 0x21002121L, 0x44004444L, 0x51005151L,
218   0xc600c6c6L, 0x7d007d7dL, 0x39003939L, 0x83008383L, 0xdc00dcdcL, 0xaa00aaaaL,
219   0x7c007c7cL, 0x77007777L, 0x56005656L, 0x05000505L, 0x1b001b1bL, 0xa400a4a4L,
220   0x15001515L, 0x34003434L, 0x1e001e1eL, 0x1c001c1cL, 0xf800f8f8L, 0x52005252L,
221   0x20002020L, 0x14001414L, 0xe900e9e9L, 0xbd00bdbdL, 0xdd00ddddL, 0xe400e4e4L,
222   0xa100a1a1L, 0xe000e0e0L, 0x8a008a8aL, 0xf100f1f1L, 0xd600d6d6L, 0x7a007a7aL,
223   0xbb00bbbbL, 0xe300e3e3L, 0x40004040L, 0x4f004f4fL
224 )
225
226
227 # Key generation constants
228 SIGMA1 = ( 0xa09e667fL, 0x3bcc908bL, 0xb67ae858L, 0x4caa73b2L )
229 SIGMA2 = ( 0xc6ef372fL, 0xe94f82beL, 0x54ff53a5L, 0xf1d36f1cL )
230 SIGMA3 = ( 0x10e527faL, 0xde682d1dL, 0xb05688c2L, 0xb3e6c1fdL )
231
232
233 # rotate right 8 bits
234 def rightRotate8(x):
235   return ((x >> 8) | (x << 24)) % 0x100000000
236
237 # rotate left 1 bit
238 def leftRotate1(x):
239   return ((x << 1) | (x >> 31)) % 0x100000000
240
241 def feistel1(x, k):
242   s = x[0] ^ k[0]
243   U  = SBOX4_4404[ s        & 0x000000ff]
244   U ^= SBOX3_3033[(s >>  8) & 0x000000ff]
245   U ^= SBOX2_0222[(s >> 16) & 0x000000ff]
246   U ^= SBOX1_1110[(s >> 24) & 0x000000ff]
247
248   s = x[1] ^ k[1]
249   D  = SBOX1_1110[ s        & 0x000000ff]
250   D ^= SBOX4_4404[(s >>  8) & 0x000000ff]
251   D ^= SBOX3_3033[(s >> 16) & 0x000000ff]
252   D ^= SBOX2_0222[(s >> 24) & 0x000000ff]
253
254   x[2] ^= D ^ U
255   x[3] ^= D ^ U ^ rightRotate8(U)
256
257   s = x[2] ^ k[2]
258   U  = SBOX4_4404[ s        & 0x000000ff]
259   U ^= SBOX3_3033[(s >>  8) & 0x000000ff]
260   U ^= SBOX2_0222[(s >> 16) & 0x000000ff]
261   U ^= SBOX1_1110[(s >> 24) & 0x000000ff]
262
263   s = x[3] ^ k[3]
264   D  = SBOX1_1110[ s        & 0x000000ff]
265   D ^= SBOX4_4404[(s >>  8) & 0x000000ff]
266   D ^= SBOX3_3033[(s >> 16) & 0x000000ff]
267   D ^= SBOX2_0222[(s >> 24) & 0x000000ff]
268
269   x[0] ^= D ^ U
270   x[1] ^= D ^ U ^ rightRotate8(U)
271
272 def feistel2(x, k):
273   s = x[0] ^ k[2]
274   U  = SBOX4_4404[ s        & 0x000000ff]
275   U ^= SBOX3_3033[(s >>  8) & 0x000000ff]
276   U ^= SBOX2_0222[(s >> 16) & 0x000000ff]
277   U ^= SBOX1_1110[(s >> 24) & 0x000000ff]
278
279   s = x[1] ^ k[3]
280   D  = SBOX1_1110[ s        & 0x000000ff]
281   D ^= SBOX4_4404[(s >>  8) & 0x000000ff]
282   D ^= SBOX3_3033[(s >> 16) & 0x000000ff]
283   D ^= SBOX2_0222[(s >> 24) & 0x000000ff]
284
285   x[2] ^= D ^ U
286   x[3] ^= D ^ U ^ rightRotate8(U)
287
288   s = x[2] ^ k[0]
289   U  = SBOX4_4404[ s        & 0x000000ff]
290   U ^= SBOX3_3033[(s >>  8) & 0x000000ff]
291   U ^= SBOX2_0222[(s >> 16) & 0x000000ff]
292   U ^= SBOX1_1110[(s >> 24) & 0x000000ff]
293
294   s = x[3] ^ k[1]
295   D  = SBOX1_1110[ s        & 0x000000ff]
296   D ^= SBOX4_4404[(s >>  8) & 0x000000ff]
297   D ^= SBOX3_3033[(s >> 16) & 0x000000ff]
298   D ^= SBOX2_0222[(s >> 24) & 0x000000ff]
299
300   x[0] ^= D ^ U
301   x[1] ^= D ^ U ^ rightRotate8(U)
302
303
304 import struct
305
306 # public
307 def Ekeygen(rawKey):
308   '''Ekeygen(rawKey)
309
310   rawKey: string; 16 or 24 or 32 character length
311   returns: keyTable'''
312
313   def rot(x, n):
314     (idx, r) = divmod(n, 0x20)          # r must not be 0
315     idx1 = (idx  + 1) & 0x03
316     idx2 = (idx1 + 1) & 0x03
317     return [
318       ((x[idx ] << r) | (x[idx1] >> (32 - r))) % 0x100000000,
319       ((x[idx1] << r) | (x[idx2] >> (32 - r))) % 0x100000000]
320
321   keyLength = len(rawKey)
322   if keyLength == 16:
323     t = struct.unpack('!IIII', rawKey)
324     u = (0, 0, 0, 0)
325   elif keyLength == 24:
326     t = struct.unpack('!IIIIII', rawKey)
327     (t, u) = (t[0:4], t[4:6])
328     u = u + (~u[0] % 0x100000000, ~u[1] % 0x100000000)
329   elif keyLength == 32:
330     t = struct.unpack('!IIIIIIII', rawKey)
331     (t, u) = (t[0:4], t[4:8])
332   else:
333     raise ValueError, 'rawKey must be 16, 24 or 32 characters length.'
334
335   if keyLength == 16:
336     v = list(t)
337     feistel1(v, SIGMA1)
338     v = map(lambda a,b:a^b, v, t)
339     feistel1(v, SIGMA2)
340     t = list(t)
341     t += v
342     t += rot(t,  15)
343     t += rot(t,  79)
344     t += rot(v,  15)
345     t += rot(v,  79)
346     t += rot(v,  30)
347     t += rot(v,  94)
348     t += rot(t,  45)
349     t += rot(t, 109)
350     t += rot(v,  45)
351     t += rot(t, 124)
352     t += rot(v,  60)
353     t += rot(v, 124)
354     t += rot(t,  77)
355     t += rot(t,  13)
356     t += rot(t,  94)
357     t += rot(t,  30)
358     t += rot(v,  94)
359     t += rot(v,  30)
360     t += rot(t, 111)
361     t += rot(t,  47)
362     t += rot(v, 111)
363     t += rot(v,  47)
364     return tuple(t)
365
366   else:
367     v = map(lambda a,b:a^b, t, u)
368     feistel1(v, SIGMA1)
369     v = map(lambda a,b:a^b, v, t)
370     feistel1(v, SIGMA2)
371     w = map(lambda a,b:a^b, u, v)
372     feistel1(w, SIGMA3)
373     t = list(t)
374     t += w
375     t += rot(u,  15)
376     t += rot(u,  79)
377     t += rot(v,  15)
378     t += rot(v,  79)
379     t += rot(u,  30)
380     t += rot(u,  94)
381     t += rot(w,  30)
382     t += rot(w,  94)
383     t += rot(t,  45)
384     t += rot(t, 109)
385     t += rot(v,  45)
386     t += rot(v, 109)
387     t += rot(t,  60)
388     t += rot(t, 124)
389     t += rot(u,  60)
390     t += rot(u, 124)
391     t += rot(w,  60)
392     t += rot(w, 124)
393     t += rot(t,  77)
394     t += rot(t,  13)
395     t += rot(v,  77)
396     t += rot(v,  13)
397     t += rot(u,  94)
398     t += rot(u,  30)
399     t += rot(v,  94)
400     t += rot(v,  30)
401     t += rot(t, 111)
402     t += rot(t,  47)
403     t += rot(w, 111)
404     t += rot(w,  47)
405     return tuple(t)
406
407   return keyTable
408
409
410 def EncryptBlock(plainText, keyTable):
411   '''EncryptBlock(plainText, keyTable)
412
413   plainText: string; plain text 16 characters
414   keyTable: key generated by Ekeygen()
415   returns: string; chipher text 16 characters'''
416
417   t = list(struct.unpack('!IIII', plainText))
418   t = map(lambda a,b:a^b, t, keyTable[0:4])
419
420   feistel1(t, keyTable[4:8])
421   feistel1(t, keyTable[8:12])
422   feistel1(t, keyTable[12:16])
423   t[1] ^= leftRotate1(t[0] & keyTable[16])
424   t[0] ^= t[1] | keyTable[17]
425   t[2] ^= t[3] | keyTable[19]
426   t[3] ^= leftRotate1(t[2] & keyTable[18])
427   feistel1(t, keyTable[20:24])
428   feistel1(t, keyTable[24:28])
429   feistel1(t, keyTable[28:32])
430   t[1] ^= leftRotate1(t[0] & keyTable[32])
431   t[0] ^= t[1] | keyTable[33]
432   t[2] ^= t[3] | keyTable[35]
433   t[3] ^= leftRotate1(t[2] & keyTable[34])
434   feistel1(t, keyTable[36:40])
435   feistel1(t, keyTable[40:44])
436   feistel1(t, keyTable[44:48])
437
438   if len(keyTable) == 52:
439     # 128 bit key
440     t = map(lambda a,b:a^b, (t[2], t[3], t[0], t[1]), keyTable[48:52])
441   else:
442     # 192 or 256 bit key
443     t[1] ^= leftRotate1(t[0] & keyTable[48])
444     t[0] ^= t[1] | keyTable[49]
445     t[2] ^= t[3] | keyTable[51]
446     t[3] ^= leftRotate1(t[2] & keyTable[50])
447     feistel1(t, keyTable[52:56])
448     feistel1(t, keyTable[56:60])
449     feistel1(t, keyTable[60:64])
450     t = map(lambda a,b:a^b, (t[2], t[3], t[0], t[1]), keyTable[64:68])
451
452   return struct.pack('!IIII', *t)
453
454
455 def DecryptBlock(cipherText, keyTable):
456   '''EncryptBlock(plainText, keyTable)
457
458   cipherText: string; cipher text 16 characters
459   keyTable: key generated by Ekeygen()
460   returns: string; plain text 16 characters'''
461
462   t = list(struct.unpack('!IIII', cipherText))
463
464   if len(keyTable) == 52:
465     # 128 bit key
466     t = map(lambda a,b:a^b, t, keyTable[48:52])
467   else:
468     # 192 or 256 bit key
469     t = map(lambda a,b:a^b, t, keyTable[64:68])
470     feistel2(t, keyTable[60:64])
471     feistel2(t, keyTable[56:60])
472     feistel2(t, keyTable[52:56])
473     t[1] ^= leftRotate1(t[0] & keyTable[50])
474     t[0] ^= t[1] | keyTable[51]
475     t[2] ^= t[3] | keyTable[49]
476     t[3] ^= leftRotate1(t[2] & keyTable[48])
477
478   feistel2(t, keyTable[44:48])
479   feistel2(t, keyTable[40:44])
480   feistel2(t, keyTable[36:40])
481   t[1] ^= leftRotate1(t[0] & keyTable[34])
482   t[0] ^= t[1] | keyTable[35]
483   t[2] ^= t[3] | keyTable[33]
484   t[3] ^= leftRotate1(t[2] & keyTable[32])
485   feistel2(t, keyTable[28:32])
486   feistel2(t, keyTable[24:28])
487   feistel2(t, keyTable[20:24])
488   t[1] ^= leftRotate1(t[0] & keyTable[18])
489   t[0] ^= t[1] | keyTable[19]
490   t[2] ^= t[3] | keyTable[17]
491   t[3] ^= leftRotate1(t[2] & keyTable[16])
492   feistel2(t, keyTable[12:16])
493   feistel2(t, keyTable[8:12])
494   feistel2(t, keyTable[4:8])
495
496   t = map(lambda a,b:a^b, (t[2], t[3], t[0], t[1]), keyTable[0:4])
497   return struct.pack('!IIII', *t)
498
499
500 if __name__ == '__main__':
501   key128 = Ekeygen("0123456789abcdef")
502   key192 = Ekeygen("0123456789abcdef01234567")
503   key256 = Ekeygen("0123456789abcdef0123456789abcdef")
504
505   plain = "0123456789abcdef"
506   enc128 = EncryptBlock(plain, key128)
507   dec128 = DecryptBlock(enc128, key128)
508   enc192 = EncryptBlock(plain, key192)
509   dec192 = DecryptBlock(enc192, key192)
510   enc256 = EncryptBlock(plain, key256)
511   dec256 = DecryptBlock(enc256, key256)
512
513   assert key128 == (
514     0x30313233L, 0x34353637L, 0x38396162L, 0x63646566L,
515     0xbee4aba3L, 0x77ee43c1L, 0xd3b3f232L, 0xb7a1096bL,
516     0x99199a1aL, 0x9b1b9c1cL, 0xb0b131b2L, 0x32b31818L,
517     0x55d1bbf7L, 0x21e0e9d9L, 0xf9195bd0L, 0x84b5df72L,
518     0xddfb90f0L, 0x74ecfc8cL, 0xade8425aL, 0xefb92ae8L,
519     0xa6c6e707L, 0x2c2c4c6cL, 0x8cacc606L, 0x26466686L,
520     0xc8783a76L, 0x7e4656f4L, 0x63031323L, 0x33435363L,
521     0x1d3b3f23L, 0x2b7a1096L, 0xbbee4abaL, 0x377ee43cL,
522     0x2c2c4c6cL, 0x8cacc606L, 0x26466686L, 0xa6c6e707L,
523     0x98d91959L, 0x8c0c4c8cL, 0xcd0d4d8dL, 0xce0e5858L,
524     0xade8425aL, 0xefb92ae8L, 0xddfb90f0L, 0x74ecfc8cL,
525     0x32b31818L, 0x99199a1aL, 0x9b1b9c1cL, 0xb0b131b2L,
526     0x84b5df72L, 0x55d1bbf7L, 0x21e0e9d9L, 0xf9195bd0L )
527
528   assert key192 == (
529     0x30313233L, 0x34353637L, 0x38396162L, 0x63646566L,
530     0xfd057652L, 0xc26e4ca4L, 0x0af90b80L, 0x390ad47bL,
531     0x99199a1aL, 0x9b1be7e7L, 0x66e665e5L, 0x64e41818L,
532     0x8822fe51L, 0x12d1bd00L, 0xa155e71eL, 0xefc78edeL,
533     0xcd0d4d8dL, 0xf3f3b373L, 0x32f2b272L, 0x0c0c4c8cL,
534     0xb09b9329L, 0x02be42e0L, 0x0e42b51eL, 0xff415d94L,
535     0xa6c6e707L, 0x2c2c4c6cL, 0x8cacc606L, 0x26466686L,
536     0x44b46f40L, 0x285579c7L, 0xbbf1e3b7L, 0xa208bf94L,
537     0x73839616L, 0x26364656L, 0x63031323L, 0x33435363L,
538     0x7cfcecdcL, 0xccbcac9cL, 0x83031323L, 0x33435363L,
539     0x40af90b8L, 0x0390ad47L, 0xbfd05765L, 0x2c26e4caL,
540     0x2c2c4c6cL, 0x8cacc606L, 0x26466686L, 0xa6c6e707L,
541     0x285579c7L, 0xbbf1e3b7L, 0xa208bf94L, 0x44b46f40L,
542     0x32f2b272L, 0x0c0c4c8cL, 0xcd0d4d8dL, 0xf3f3b373L,
543     0xf38f77e3L, 0xc76f4411L, 0x7f288968L, 0xde8050aaL,
544     0x32b31818L, 0x99199a1aL, 0x9b1b9c1cL, 0xb0b131b2L,
545     0x6a3dfe82L, 0xbb296137L, 0x2652057cL, 0x85c01c85L )
546
547   assert key256 == (
548     0x30313233L, 0x34353637L, 0x38396162L, 0x63646566L,
549     0xb9eec79aL, 0x34da1bd7L, 0xe220590fL, 0x57ba15c5L,
550     0x99199a1aL, 0x9b1b9c1cL, 0xb0b131b2L, 0x32b31818L,
551     0xa35ab48cL, 0x3dc7f437L, 0x5a6a652fL, 0x6920413aL,
552     0xcd0d4d8dL, 0xce0e5858L, 0x98d91959L, 0x8c0c4c8cL,
553     0x8d3686f5L, 0xf8881643L, 0xd5ee8571L, 0x6e7bb1e6L,
554     0xa6c6e707L, 0x2c2c4c6cL, 0x8cacc606L, 0x26466686L,
555     0x0f71fd0dL, 0xd69a994bL, 0xda48104eL, 0xa8d6ad23L,
556     0x73839616L, 0x26364656L, 0x63031323L, 0x33435363L,
557     0x73839616L, 0x26364656L, 0x63031323L, 0x33435363L,
558     0x7e220590L, 0xf57ba15cL, 0x5b9eec79L, 0xa34da1bdL,
559     0x2c2c4c6cL, 0x8cacc606L, 0x26466686L, 0xa6c6e707L,
560     0xd69a994bL, 0xda48104eL, 0xa8d6ad23L, 0x0f71fd0dL,
561     0x98d91959L, 0x8c0c4c8cL, 0xcd0d4d8dL, 0xce0e5858L,
562     0x3297b490L, 0x209d51adL, 0x5a461ee3L, 0xfa1bad35L,
563     0x32b31818L, 0x99199a1aL, 0x9b1b9c1cL, 0xb0b131b2L,
564     0x0ae2dcf7L, 0x63cd1a6dL, 0x0debf110L, 0x2c87abddL )
565
566   assert enc128 == 'jr\xa9\x8b\x8a\x1d\x96f\xe8\x05\x98ot\x04tS'
567   assert enc192 == '\xbd\x91\xe2\x05\x10W\xb0\xa2EA\xefJ5\x04\x95\xed'
568   assert enc256 == '\xe1\xab\x1b\xa6\xa1x:\xff\xd4\x18\xb4y\xe5\xba\x9a\xf9'
569
570   assert dec128 == plain
571   assert dec192 == plain
572   assert dec256 == plain
573
574   print 'basic test ok'
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。