Dr. Dobb's is part of the Informa Tech Division of Informa PLC

This site is operated by a business or businesses owned by Informa PLC and all copyright resides with them. Informa PLC's registered office is 5 Howick Place, London SW1P 1WG. Registered in England and Wales. Number 8860726.


Channels ▼
RSS

The Blowfish Encryption Algorithm: One Year Later


SEP95: ALGORITHM ALLEY

DES is the workhorse of cryptography algorithms, but it's long been time to replace the 19-year-old standard. The recent design of a $1M machine that could recover a DES key in 3.5 hours only confirmed what everybody knew--DES's key size is far too small.

From the outset, DES was trusted only because it survived the scrutiny of the NSA. Experts trusted DES because it was a published standard, and because it survived 20 years of intensive scrutiny by cryptographers around the world. Cryptography is like that: Confidence in an algorithm grows as group after group fails to break it.

Recently, candidates that can be considered serious DES replacements are emerging, although none have yet taken widespread hold. Triple-DES is the conservative approach; IDEA (used in PGP) is the most promising new algorithm. And there are a bevy of unpatented also-rans: RC4 (once a trade secret of RSA Data Security, but now publicly available on the Internet), SAFER, and my own Blowfish.

I first presented Blowfish at the Cambridge Algorithms Workshop; see "Description of a New Variable-Length Key, 64-bit Block Cipher (Blowfish)," Fast Software Encryption, R. Anderson, ed., Lecture Notes in Computer Science #809 (Springer-Verlag, 1994) and in DDJ ("The Blowfish Encryption Algorithm," April 1994). From the start, Blowfish was intended to be a completely free--unpatented, unlicensed, and uncopyrighted--alternative to DES. Since then it has been analyzed, and we've begun to see its application in both public and private systems. In this article, I'll present new Blowfish code, as well as updates on the algorithm's security.

Description of Blowfish

Blowfish is a block cipher that encrypts data in 8-byte blocks. The algorithm consists of two parts: a key-expansion part and a data-encryption part. Key expansion converts a variable-length key of at most 56 bytes (448 bits) into several subkey arrays totaling 4168 bytes. (Note that the description presented here differs slightly from the one in the April 1994 DDJ, specifically in steps 5 and 6 of the subkey-generation algorithm.)

Blowfish has 16 rounds. Each round consists of a key-dependent permutation and a key- and data-dependent substitution. All operations are XORs and additions on 32-bit words. The only additional operations are four indexed-array data lookups per round.

Subkeys. Blowfish uses many subkeys, which must be precomputed before any data encryption or decryption. The P-array consists of 18 32-bit subkeys: P1, P2,..., P18. There are also four 32-bit S-boxes with 256 entries each: S1,0, S1,1,..., S1,255; S2,0, S2,1,..., S2,255; S3,0, S3,1,..., S3,255; S4,0, S4,1,..., S4,255.

Encryption and decryption. Blowfish has 16 rounds. The input is a 64-bit data element, x. Divide x into two 32-bit halves: xL, xR. Then, for i=1 to 16:

  • xL=xL XOR Pi
  • xR=F(xL) XOR xR
  • Swap xL and xR
After the 16th round, swap xL and xR again to undo the last swap. Then, xR=xR XOR P17 and xL=xL XOR P18. Finally, recombine xL and xR to get the ciphertext.

Function F. For Function F, divide xL into four 8-bit quarters: a, b, c, and d. Then, F(xL)=((S1,a+S2,b mod 232) XOR S3,c)+S4,d mod 232.

Decryption is exactly the same as encryption, except that P1, P2,..., P18 are used in the reverse order.

Generating the subkeys. The subkeys are calculated using the Blowfish algorithm:

  1. Initialize first the P-array and then the four S-boxes, in order, with a fixed string consisting of the hexadecimal digits of pi (less the initial 3): P1=0x243f6a88, P2=0x85a308d3, P3=0x13198a2e, P4=0x03707344, and so on.
  2. XOR P1 with the first 32 bits of the key, XOR P2 with the second 32 bits of the key, and so on for all bits of the key (possibly up to P14). Repeatedly cycle through the key bits until the entire P-array has been XORed with key bits. (For every short key, there is at least one equivalent longer key; for example, if A is a 64-bit key, then AA, AAA, and so on, are equivalent keys.)
  3. Encrypt the all-zero string with the Blowfish algorithm, using the subkeys described in steps 1 and 2.
  4. Replace P1 and P2 with the output of step 3.
  5. Encrypt the output of step 3 using the Blowfish algorithm with the modified subkeys.
  6. Replace P3 and P4 with the output of step 5.
  7. Continue the process, replacing all entries of the P-array, and then all four S-boxes in order, with the output of the continuously changing Blowfish algorithm.
In total, 521 iterations are required to generate all required subkeys. Applications can store the subkeys rather than execute this derivation process multiple times.

C code. Listings One and Two present C code for Blowfish that has been improved and corrected over that published in April 1994. Listing Three provides sample test vectors for the code.

Cryptanalysis of Blowfish

When I first presented Blowfish, DDJ sponsored a cryptanalysis contest. I am pleased to present the most interesting submissions here.

John Kelsey developed an attack that could break 3-round Blowfish, but was unable to extend it. This attack exploits the F function and the fact that addition mod 232 and XOR do not commute. Vikramjit Singh Chhabra looked at ways of efficiently implementing a brute-force keysearch machine.

Serge Vaudenay examined a simplified variant of Blowfish, with the S-boxes known and not key dependent. For this variant, a differential attack can recover the P-array with 28r+1 chosen plaintexts (r is the number of rounds). This attack is impossible for 8-round Blowfish and higher, since more plaintext is required than can possibly be generated with a 64-bit block cipher.

For certain weak keys that generate weak S-boxes (the odds of getting them randomly are 1 in 214), the same attack requires only 24r+1 chosen plaintexts to recover the P-array (again, assuming the S-boxes are known). With unknown S-boxes, this attack can detect whether a weak key is being used, but cannot determine what it is (neither the S-boxes, the P-array, nor the key itself). This attack only works against reduced-round variants; it is completely ineffective against 16-round Blowfish.

Even so, the discovery of weak keys in Blowfish is significant. A weak key is one for which two entries for a given S-box are identical. There is no way to check for weak keys before doing the key expansion. If you are worried about it, you have to do the key expansion and check for identical S-box entries after you generate a Blowfish key. I don't think it's necessary, though.

Conclusion

As of yet, no one has developed an attack that breaks Blowfish. Even so, more cryptanalysis is required before pronouncing the algorithm secure. I invite you to continue analyzing the algorithm.

Listing One

 
/*********************blowfish.h********************/ 
/* $Id: blowfish.h,v 1.3 1995/01/23 12:38:02 pr Exp pr $*/ 
 
#define MAXKEYBYTES 56      /* 448 bits */ 
#define bf_N             16 
#define noErr            0 
#define DATAERROR         -1 
#define KEYBYTES         8 
#define subkeyfilename   "Blowfish.dat" 
 
#define UWORD_32bits  unsigned long 
#define UWORD_16bits  unsigned short 
#define UBYTE_08bits  unsigned char 
 
/* choose a byte order for your hardware. ABCD - big endian - motorola */ 
#ifdef ORDER_ABCD 
union aword { 
  UWORD_32bits word; 
  UBYTE_08bits byte [4]; 
  struct { 
    unsigned int byte0:8; 
    unsigned int byte1:8; 
    unsigned int byte2:8; 
    unsigned int byte3:8; 
  } w; 
}; 
#endif  /* ORDER_ABCD */ 
 
/* DCBA - little endian - intel */ 
#ifdef ORDER_DCBA 
union aword { 
  UWORD_32bits word; 
  UBYTE_08bits byte [4]; 
  struct { 
    unsigned int byte3:8; 
    unsigned int byte2:8; 
    unsigned int byte1:8; 
    unsigned int byte0:8; 
  } w; 
}; 
#endif  /* ORDER_DCBA */ 
 
/* BADC - vax */ 
#ifdef ORDER_BADC 
union aword { 
  UWORD_32bits word; 
  UBYTE_08bits byte [4]; 
  struct { 
    unsigned int byte1:8; 
    unsigned int byte0:8; 
    unsigned int byte3:8; 
    unsigned int byte2:8; 
  } w; 
}; 
#endif  /* ORDER_BADC */ 
 
short opensubkeyfile(void); 
unsigned long F(unsigned long x); 
void Blowfish_encipher(unsigned long *xl, unsigned long *xr); 
void Blowfish_decipher(unsigned long *xl, unsigned long *xr); 
short InitializeBlowfish(unsigned char key[], short keybytes); 
 
 

Listing Two

 
/*********************blowfish.c*********************/ 
/* TODO: test with zero length key */ 
/* TODO: test with a through z as key and plain text */ 
/* TODO: make this byte order independent */ 
 
#include <stdio.h>      /* used for debugging */ 
#ifdef MACINTOSH 
   #include <Types.h>       /* FIXME: do we need this? */ 
#endif 
 
#include "blowfish.h" 
#include "bf_tab.h"     /* P-box P-array, S-box  */ 
 
#define S(x,i) (bf_S[i][x.w.byte##i]) 
#define bf_F(x) (((S(x,0) + S(x,1)) ^ S(x,2)) + S(x,3)) 
#define ROUND(a,b,n) (a.word ^= bf_F(b) ^ bf_P[n]) 
 
inline 
void Blowfish_encipher(UWORD_32bits *xl, UWORD_32bits *xr) 
{ 
  union aword  Xl; 
  union aword  Xr; 
 
  Xl.word = *xl; 
  Xr.word = *xr; 
 
  Xl.word ^= bf_P[0]; 
  ROUND (Xr, Xl, 1);  ROUND (Xl, Xr, 2); 
  ROUND (Xr, Xl, 3);  ROUND (Xl, Xr, 4); 
  ROUND (Xr, Xl, 5);  ROUND (Xl, Xr, 6); 
  ROUND (Xr, Xl, 7);  ROUND (Xl, Xr, 8); 
  ROUND (Xr, Xl, 9);  ROUND (Xl, Xr, 10); 
  ROUND (Xr, Xl, 11); ROUND (Xl, Xr, 12); 
  ROUND (Xr, Xl, 13); ROUND (Xl, Xr, 14); 
  ROUND (Xr, Xl, 15); ROUND (Xl, Xr, 16); 
  Xr.word ^= bf_P[17]; 
 
  *xr = Xl.word; 
  *xl = Xr.word; 
} 
void Blowfish_decipher(UWORD_32bits *xl, UWORD_32bits *xr) 
{ 
   union aword  Xl; 
   union aword  Xr; 
 
   Xl = *xl; 
   Xr = *xr; 
 
   Xl.word ^= bf_P[17]; 
   ROUND (Xr, Xl, 16);  ROUND (Xl, Xr, 15); 
   ROUND (Xr, Xl, 14);  ROUND (Xl, Xr, 13); 
   ROUND (Xr, Xl, 12);  ROUND (Xl, Xr, 11); 
   ROUND (Xr, Xl, 10);  ROUND (Xl, Xr, 9); 
   ROUND (Xr, Xl, 8);   ROUND (Xl, Xr, 7); 
   ROUND (Xr, Xl, 6);   ROUND (Xl, Xr, 5); 
   ROUND (Xr, Xl, 4);   ROUND (Xl, Xr, 3); 
   ROUND (Xr, Xl, 2);   ROUND (Xl, Xr, 1); 
   Xr.word ^= bf_P[0]; 
 
   *xl = Xr.word; 
   *xr = Xl.word; 
} 
/* FIXME: Blowfish_Initialize() ??? */ 
short InitializeBlowfish(UBYTE_08bits key[], short keybytes) 
{ 
  short          i;     /* FIXME: unsigned int, char? */ 
  short          j;     /* FIXME: unsigned int, char? */ 
  UWORD_32bits  data; 
  UWORD_32bits  datal; 
  UWORD_32bits  datar; 
  union aword temp; 
/*  fprintf (stderr, "0x%x 0x%x ", bf_P[0], bf_P[1]); /* DEBUG */ 
/*  fprintf (stderr, "%d %d\n", bf_P[0], bf_P[1]); /* DEBUG */ 
  j = 0; 
  for (i = 0; i < bf_N + 2; ++i) { 
    temp.word = 0; 
    temp.w.byte0 = key[j]; 
    temp.w.byte1 = key[(j+1)%keybytes]; 
    temp.w.byte2 = key[(j+2)%keybytes]; 
    temp.w.byte3 = key[(j+3)%keybytes]; 
    data = temp.word; 
    bf_P[i] = bf_P[i] ^ data; 
    j = (j + 4) % keybytes; 
  } 
  datal = 0x00000000; 
  datar = 0x00000000; 
  for (i = 0; i < bf_N + 2; i += 2) { 
    Blowfish_encipher(&datal, &datar); 
 
    bf_P[i] = datal; 
    bf_P[i + 1] = datar; 
  } 
  for (i = 0; i < 4; ++i) { 
    for (j = 0; j < 256; j += 2) { 
 
      Blowfish_encipher(&datal, &datar); 
    
      bf_S[i][j] = datal; 
      bf_S[i][j + 1] = datar; 
    } 
  } 
  return 0; 
} 
=============== bf_tab.h ============== 
/* bf_tab.h: Blowfish P-box and S-box tables */ 
 
static UWORD_32bits bf_P[bf_N + 2] = { 
  0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 
  0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 
  0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 
  0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 
  0x9216d5d9, 0x8979fb1b, 
}; 
static UWORD_32bits bf_S[4][256] = { 
  0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,  
  0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,  
  0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,  
  0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,  
  0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,  
  0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,  
  0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,  
  0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,  
  0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,  
  0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,  
  0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,  
  0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,  
  0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,  
  0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,  
  0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,  
  0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,  
  0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,  
  0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,  
  0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,  
  0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,  
  0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,  
  0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,  
  0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,  
  0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,  
  0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,  
  0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,  
  0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,  
  0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,  
  0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,  
  0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,  
  0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,  
  0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,  
  0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,  
  0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,  
  0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,  
  0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,  
  0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,  
  0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,  
  0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,  
  0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,  
  0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,  
  0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,  
  0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,  
  0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,  
  0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,  
  0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,  
  0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,  
  0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,  
  0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,  
  0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,  
  0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,  
  0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,  
  0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,  
  0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,  
  0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,  
  0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,  
  0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,  
  0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,  
  0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,  
  0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,  
  0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,  
  0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,  
  0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,  
  0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,  
  0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,  
  0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,  
  0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,  
  0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,  
  0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,  
  0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,  
  0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,  
  0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,  
  0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,  
  0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,  
  0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,  
  0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,  
  0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,  
  0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,  
  0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,  
  0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,  
  0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,  
  0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,  
  0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,  
  0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,  
  0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,  
  0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,  
  0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,  
  0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,  
  0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,  
  0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,  
  0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,  
  0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,  
  0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,  
  0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,  
  0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,  
  0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,  
  0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,  
  0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,  
  0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,  
  0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,  
  0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,  
  0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,  
  0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,  
  0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,  
  0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,  
  0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,  
  0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,  
  0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,  
  0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,  
  0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,  
  0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,  
  0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,  
  0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,  
  0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,  
  0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,  
  0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,  
  0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,  
  0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,  
  0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,  
  0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,  
  0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,  
  0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,  
  0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,  
  0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,  
  0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,  
  0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,  
  0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,  
  0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,  
  0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,  
  0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,  
  0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,  
  0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,  
  0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,  
  0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,  
  0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,  
  0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,  
  0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,  
  0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,  
  0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,  
  0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,  
  0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,  
  0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,  
  0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,  
  0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,  
  0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,  
  0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,  
  0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,  
  0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,  
  0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,  
  0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,  
  0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,  
  0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,  
  0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,  
  0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,  
  0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,  
  0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,  
  0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,  
  0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,  
  0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,  
  0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,  
  0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,  
  0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,  
  0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,  
  0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,  
  0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,  
  0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,  
  0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,  
  0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,  
  0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,  
  0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,  
  0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,  
  0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,  
  0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,  
  0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,  
  0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,  
  0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,  
  0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,  
  0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,  
  0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,  
  0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,  
  0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,  
  0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,  
  0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,  
  0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,  
  0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,  
  0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,  
  0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,  
  0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,  
  0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,  
  0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,  
  0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,  
  0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,  
  0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,  
  0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,  
  0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,  
  0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,  
  0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,  
  0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,  
  0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,  
  0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,  
  0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,  
  0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,  
  0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,  
  0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,  
  0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,  
  0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,  
  0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,  
  0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,  
  0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,  
  0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,  
  0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,  
  0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,  
  0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,  
  0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,  
  0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,  
  0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,  
  0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,  
  0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,  
  0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,  
  0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,  
  0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,  
  0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,  
  0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,  
  0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,  
  0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,  
  0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,  
  0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,  
  0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,  
  0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,  
  0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,  
  0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,  
  0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,  
  0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,  
  0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,  
  0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,  
  0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,  
  0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,  
  0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,  
  0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,  
  0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,  
  0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,  
  0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,  
  0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,  
  0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,  
  0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,  
  0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,  
  0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,  
  0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,  
  0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,  
  0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,  
  0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,  
  0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,  
  0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,  
  0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,  
  0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,  
  0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,  
}; 
 

Listing Three

 
************** TEST VECTORS *********************************** 
This is a test vector. 
Plaintext is "BLOWFISH". 
The key is "abcdefghijklmnopqrstuvwxyz". 
 
#define PL 0x424c4f57l 
#define PR 0x46495348l 
#define CL 0x324ed0fel 
#define CR 0xf413a203l 
    static char keey[]="abcdefghijklmnopqrstuvwxyz"; 
 
This is another test vector. 
The key is "Who is John Galt?" 
 
#define PL 0xfedcba98l 
#define PR 0x76543210l 
#define CL 0xcc91732bl 
#define CR 0x8022f684l 
 
 


Copyright © 1995, Dr. Dobb's Journal


Related Reading


More Insights






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.