1 /* 2 * This file is part of "The Java Telnet Application". 3 * 4 * (c) Matthias L. Jugel, Marcus Meißner 1996-2002. All Rights Reserved. 5 * The file was changed by Radek Polak to work as midlet in MIDP 1.0 6 * 7 * Please visit http://javatelnet.org/ for updates and contact. 8 * 9 * --LICENSE NOTICE-- 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23 * --LICENSE NOTICE-- 24 * 25 * 26 * This code is based on Bruce Schneiders code: 27 * Bruce Schneier: Applied Cryptography 2nd ed., John Wiley & Sons, 1996 28 */ 29 30 package ssh; 31 32 33 /** 34 * @author Marcus Meissner 35 * @version $Id: Blowfish.java,v 1.2 2002/10/26 07:15:59 leo Exp $ 36 */ 37 public final class Blowfish extends Cipher { 38 39 protected int[] S0 = new int[256]; 40 protected int[] S1 = new int[256]; 41 protected int[] S2 = new int[256]; 42 protected int[] S3 = new int[256]; 43 protected int[] P = new int[18]; 44 45 private int IV0; 46 private int IV1; 47 48 public Blowfish() { 49 } 50 51 // Set key of this Blowfish from a String 52 53 public void setKey(String skey) { 54 byte[] key = skey.getBytes(); 55 setKey(key); 56 } 57 58 // Set key of this Blowfish from a bytearray 59 60 public void setKey(byte[] key) { 61 62 int i, j, k, len = key.length; 63 int temp; 64 int L, R; 65 int[] output = new int[2]; 66 67 System.arraycopy(blowfish_pbox, 0, P, 0, 18); 68 System.arraycopy(blowfish_sbox, 0, S0, 0, 256); 69 System.arraycopy(blowfish_sbox, 256, S1, 0, 256); 70 System.arraycopy(blowfish_sbox, 512, S2, 0, 256); 71 System.arraycopy(blowfish_sbox, 768, S3, 0, 256); 72 73 // Actual subkey generation 74 // 75 for (j = 0, i = 0; i < 16 + 2; i++) { 76 temp = (((key[j] & 0xff) << 24) | 77 ((key[(j + 1) % len] & 0xff) << 16) | 78 ((key[(j + 2) % len] & 0xff) << 8) | 79 ((key[(j + 3) % len] & 0xff))); 80 P[i] = P[i] ^ temp; 81 j = (j + 4) % len; 82 } 83 84 L = 0; 85 R = 0; 86 87 for (i = 0; i < 16 + 2; i += 2) { 88 encrypt(L, R, output); 89 L = output[0]; 90 R = output[1]; 91 P[i] = L; 92 P[i + 1] = R; 93 } 94 95 for (j = 0; j < 256; j += 2) { 96 encrypt(L, R, output); 97 L = output[0]; 98 R = output[1]; 99 S0[j] = L; 100 S0[j + 1] = R; 101 } 102 for (j = 0; j < 256; j += 2) { 103 encrypt(L, R, output); 104 L = output[0]; 105 R = output[1]; 106 S1[j] = L; 107 S1[j + 1] = R; 108 } 109 for (j = 0; j < 256; j += 2) { 110 encrypt(L, R, output); 111 L = output[0]; 112 R = output[1]; 113 S2[j] = L; 114 S2[j + 1] = R; 115 } 116 for (j = 0; j < 256; j += 2) { 117 encrypt(L, R, output); 118 L = output[0]; 119 R = output[1]; 120 S3[j] = L; 121 S3[j + 1] = R; 122 } 123 124 IV0 = 0; 125 IV1 = 0; 126 127 } 128 129 public synchronized void encrypt(byte[] src, int srcOff, byte[] dest, int destOff, int len) { 130 int[] out = new int[2]; 131 int iv0 = IV0; 132 int iv1 = IV1; 133 int end = srcOff + len; 134 135 for (int si = srcOff, di = destOff; si < end; si += 8, di += 8) { 136 iv0 ^= ((src[si] & 0xff) | ((src[si + 1] & 0xff) << 8) | 137 ((src[si + 2] & 0xff) << 16) | ((src[si + 3] & 0xff) << 24)); 138 iv1 ^= ((src[si + 4] & 0xff) | ((src[si + 5] & 0xff) << 8) | 139 ((src[si + 6] & 0xff) << 16) | ((src[si + 7] & 0xff) << 24)); 140 encrypt(iv0, iv1, out); 141 iv0 = out[0]; 142 iv1 = out[1]; 143 dest[di] = (byte) (iv0 & 0xff); 144 dest[di + 1] = (byte) ((iv0 >>> 8) & 0xff); 145 dest[di + 2] = (byte) ((iv0 >>> 16) & 0xff); 146 dest[di + 3] = (byte) ((iv0 >>> 24) & 0xff); 147 dest[di + 4] = (byte) (iv1 & 0xff); 148 dest[di + 5] = (byte) ((iv1 >>> 8) & 0xff); 149 dest[di + 6] = (byte) ((iv1 >>> 16) & 0xff); 150 dest[di + 7] = (byte) ((iv1 >>> 24) & 0xff); 151 } 152 IV0 = iv0; 153 IV1 = iv1; 154 } 155 156 public void encrypt(int xL, int xR, int[] out) { 157 int L, R; 158 159 L = xL; 160 R = xR; 161 162 L ^= P[0]; 163 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 164 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[1]); 165 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 166 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[2]); 167 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 168 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[3]); 169 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 170 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[4]); 171 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 172 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[5]); 173 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 174 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[6]); 175 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 176 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[7]); 177 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 178 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[8]); 179 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 180 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[9]); 181 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 182 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[10]); 183 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 184 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[11]); 185 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 186 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[12]); 187 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 188 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[13]); 189 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 190 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[14]); 191 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 192 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[15]); 193 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 194 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[16]); 195 R ^= P[17]; 196 197 out[0] = R; 198 out[1] = L; 199 } 200 201 public synchronized void decrypt(byte[] src, int srcOff, byte[] dest, int destOff, int len) { 202 int[] out = new int[2]; 203 int iv0 = IV0; 204 int iv1 = IV1; 205 int d0; 206 int d1; 207 int end = srcOff + len; 208 209 for (int si = srcOff, di = destOff; si < end; si += 8, di += 8) { 210 d0 = ((src[si] & 0xff) | ((src[si + 1] & 0xff) << 8) | 211 ((src[si + 2] & 0xff) << 16) | ((src[si + 3] & 0xff) << 24)); 212 d1 = ((src[si + 4] & 0xff) | ((src[si + 5] & 0xff) << 8) | 213 ((src[si + 6] & 0xff) << 16) | ((src[si + 7] & 0xff) << 24)); 214 decrypt(d0, d1, out); 215 iv0 ^= out[0]; 216 iv1 ^= out[1]; 217 dest[di] = (byte) (iv0 & 0xff); 218 dest[di + 1] = (byte) ((iv0 >>> 8) & 0xff); 219 dest[di + 2] = (byte) ((iv0 >>> 16) & 0xff); 220 dest[di + 3] = (byte) ((iv0 >>> 24) & 0xff); 221 dest[di + 4] = (byte) (iv1 & 0xff); 222 dest[di + 5] = (byte) ((iv1 >>> 8) & 0xff); 223 dest[di + 6] = (byte) ((iv1 >>> 16) & 0xff); 224 dest[di + 7] = (byte) ((iv1 >>> 24) & 0xff); 225 iv0 = d0; 226 iv1 = d1; 227 } 228 IV0 = iv0; 229 IV1 = iv1; 230 } 231 232 public int[] decrypt(int xL, int xR, int[] out) { 233 int L, R; 234 235 L = xL; 236 R = xR; 237 238 L ^= P[17]; 239 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 240 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[16]); 241 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 242 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[15]); 243 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 244 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[14]); 245 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 246 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[13]); 247 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 248 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[12]); 249 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 250 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[11]); 251 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 252 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[10]); 253 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 254 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[9]); 255 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 256 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[8]); 257 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 258 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[7]); 259 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 260 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[6]); 261 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 262 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[5]); 263 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 264 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[4]); 265 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 266 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[3]); 267 R ^= ((((S0[(int) ((L >>> 24) & 0xff)] + S1[(int) ((L >>> 16) & 0xff)]) ^ 268 S2[(int) ((L >>> 8) & 0xff)]) + S3[(int) (L & 0xff)]) ^ P[2]); 269 L ^= ((((S0[(int) ((R >>> 24) & 0xff)] + S1[(int) ((R >>> 16) & 0xff)]) ^ 270 S2[(int) ((R >>> 8) & 0xff)]) + S3[(int) (R & 0xff)]) ^ P[1]); 271 R ^= P[0]; 272 273 out[0] = R; 274 out[1] = L; 275 276 return out; 277 } 278 279 /* Blowfish's P and S -boxes, respectively. These were taken 280 from Bruce Schneier's public-domain implementation. */ 281 282 final static int[] blowfish_pbox = 283 { 284 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 285 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 286 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 287 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 288 0x9216d5d9, 0x8979fb1b 289 }; 290 291 final static int[] blowfish_sbox = 292 { 293 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 294 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 295 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 296 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 297 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 298 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 299 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 300 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 301 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 302 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 303 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 304 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 305 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 306 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 307 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 308 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 309 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 310 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 311 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 312 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 313 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 314 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 315 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 316 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 317 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 318 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 319 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 320 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 321 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 322 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 323 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 324 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 325 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 326 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 327 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 328 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 329 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 330 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 331 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 332 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 333 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 334 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 335 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 336 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 337 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 338 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 339 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 340 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 341 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 342 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 343 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 344 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 345 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 346 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 347 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 348 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 349 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 350 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 351 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 352 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 353 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 354 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 355 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 356 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, 357 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 358 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 359 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 360 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 361 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 362 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 363 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 364 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 365 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 366 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 367 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 368 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 369 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 370 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 371 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 372 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 373 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 374 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 375 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 376 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 377 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 378 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 379 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 380 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 381 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 382 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 383 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 384 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 385 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 386 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 387 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 388 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 389 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 390 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 391 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 392 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 393 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 394 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 395 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 396 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 397 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 398 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 399 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 400 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 401 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 402 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 403 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 404 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 405 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 406 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 407 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 408 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 409 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 410 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 411 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 412 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 413 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 414 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 415 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 416 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 417 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 418 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 419 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 420 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, 421 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 422 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 423 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 424 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 425 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 426 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 427 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 428 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 429 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 430 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 431 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 432 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 433 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 434 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 435 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 436 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 437 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 438 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 439 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 440 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 441 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 442 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 443 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 444 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 445 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 446 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 447 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 448 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 449 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 450 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 451 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 452 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 453 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 454 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 455 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 456 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 457 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 458 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 459 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 460 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 461 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 462 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 463 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 464 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 465 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 466 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 467 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 468 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 469 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 470 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 471 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 472 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 473 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 474 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 475 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 476 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 477 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 478 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 479 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 480 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 481 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 482 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 483 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 484 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, 485 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 486 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 487 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 488 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 489 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 490 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 491 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 492 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 493 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 494 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 495 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 496 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 497 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 498 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 499 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 500 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 501 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 502 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 503 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 504 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 505 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 506 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 507 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 508 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 509 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 510 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 511 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 512 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 513 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 514 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 515 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 516 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 517 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 518 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 519 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 520 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 521 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 522 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 523 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 524 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 525 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 526 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 527 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 528 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 529 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 530 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 531 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 532 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 533 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 534 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 535 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 536 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 537 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 538 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 539 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 540 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 541 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 542 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 543 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 544 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 545 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 546 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 547 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 548 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 549 }; 550 551 /* !!! DEBUG 552 public static void main(String[] argv) { 553 byte[] key = { 554 (byte)0xd3, (byte)0x96, (byte)0xcf, (byte)0x07, (byte)0xfa, (byte)0xa2, (byte)0x64, 555 (byte)0xfe, (byte)0xf3, (byte)0xa2, (byte)0x06, (byte)0x07, (byte)0x1a, (byte)0xb6, 556 (byte)0x13, (byte)0xf6, (byte)0x06, (byte)0x18, (byte)0xf6, (byte)0xcc, (byte)0x32, 557 (byte)0xd9, (byte)0xbb, (byte)0x56, (byte)0x5b, (byte)0xa6, (byte)0xa1, (byte)0x72, 558 (byte)0x28, (byte)0xb3, (byte)0xec, (byte)0x64 }; 559 560 byte[] txt = { 561 (byte)0x2e, (byte)0xbe, (byte)0xc5, (byte)0xac, (byte)0x02, (byte)0xa1, (byte)0xd5, 562 (byte)0x7f, (byte)0x01, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x1f, (byte)0x43, 563 (byte)0x6f, (byte)0x72, (byte)0x72, (byte)0x75, (byte)0x70, (byte)0x74, (byte)0x65, 564 (byte)0x64, (byte)0x20, (byte)0x63, (byte)0x68, (byte)0x65, (byte)0x63, (byte)0x6b, 565 (byte)0x20, (byte)0x62, (byte)0x79, (byte)0x74, (byte)0x65, (byte)0x73, (byte)0x20, 566 (byte)0x6f, (byte)0x6e, (byte)0x20, (byte)0x69, (byte)0x6e, (byte)0x70, (byte)0x75, 567 (byte)0x74, (byte)0x2e, (byte)0x91, (byte)0x9a, (byte)0x57, (byte)0xdd 568 }; 569 ENC: b5 44 c6 69 9b e7 d7 3d 45 25 0d 8b b3 5a 28 f5 98 eb 3e ea a3 27 e3 ac 64 de fc b7 f5 49 c6 3f 31 5c ce 99 79 b5 3b a9 cc 44 67 f0 46 a3 7e ed 570 571 byte[] txt = { 572 (byte)0x00, (byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44, (byte)0x55, (byte)0x66, 573 (byte)0x77 }; 574 575 byte[] enc; 576 byte[] dec; 577 578 System.out.println("key: " + printHex(key)); 579 System.out.println("txt: " + printHex(txt)); 580 581 Blowfish cipher = new Blowfish(); 582 cipher.setKey(key); 583 584 enc = cipher.encrypt(txt); 585 System.out.println("enc: " + printHex(enc)); 586 587 cipher = new Blowfish(); 588 cipher.setKey(key); 589 dec = cipher.decrypt(enc); 590 591 System.out.println("dec: " + printHex(dec)); 592 } 593 594 static String printHex(byte[] buf) { 595 byte[] out = new byte[buf.length + 1]; 596 out[0] = 0; 597 System.arraycopy(buf, 0, out, 1, buf.length); 598 BigInteger big = new BigInteger(out); 599 return big.toString(16); 600 } 601 602 */ 603 604 } |