Cryptography Tutorials - Herong's Tutorial Notes
Dr. Herong Yang, Version 4.00

Cipher - Blowfish Algorithm

Part:   1  2  3  4 

(Continued from previous part...)

Encryption algorithm with temporary variables:

Input: 
   T: 64 bits of clear text
   P1, P2, ..., P18: 18 sub-keys
   F(): Round function
   
Output: 
   C: 64 bits of cipher text

Algorithm:
   (L0, R0) = T, dividing T into two 32-bit parts
   L1 = L0 XOR P1
   R2 = R0 XOR F(L1) XOR P2
   L3 = L1 XOR F(R2) XOR P3
   R4 = R2 XOR F(L3) XOR P4
   L5 = L3 XOR F(R4) XOR P5
   R6 = R4 XOR F(L5) XOR P6
   L7 = L5 XOR F(R6) XOR P7
   R8 = R6 XOR F(L7) XOR P8
   L9 = L7 XOR F(R8) XOR P9
   R10 = R8 XOR F(L9) XOR P10
   L11 = L9 XOR F(R10) XOR P11
   R12 = R10 XOR F(L11) XOR P12
   L13 = L11 XOR F(R12) XOR P13
   R14 = R12 XOR F(L13) XOR P14
   L15 = L13 XOR F(R14) XOR P15
   R16 = R14 XOR F(L15) XOR P16
   L17 = L15 XOR F(R16) XOR P17
   R18 = R16 XOR P18
   C = (R18, L17)

Decryption algorithm with temporary variables:

Input: 
   CC: 64 bits of cipher text
   P1, P2, ..., P18: 18 sub-keys
   F(): Round function
   
Output: 
   TT: 64 bits of clear text

Algorithm:
   (LL0, RR0) = CC, dividing CC into two 32-bit parts
   LL1 = LL0 XOR P18
   RR2 = RR0 XOR F(LL1) XOR P17
   LL3 = LL1 XOR F(RR2) XOR P16
   RR4 = RR2 XOR F(LL3) XOR P15
   LL5 = LL3 XOR F(RR4) XOR P14
   RR6 = RR4 XOR F(LL5) XOR P13
   LL7 = LL5 XOR F(RR6) XOR P12
   RR8 = RR6 XOR F(LL7) XOR P11
   LL9 = LL7 XOR F(RR8) XOR P10
   RR10 = RR8 XOR F(LL9) XOR P9
   LL11 = LL9 XOR F(RR10) XOR P8
   RR12 = RR10 XOR F(LL11) XOR P7
   LL13 = LL11 XOR F(RR12) XOR P6
   RR14 = RR12 XOR F(LL13) XOR P5
   LL15 = LL13 XOR F(RR14) XOR P4
   RR16 = RR14 XOR F(LL15) XOR P3
   LL17 = LL15 XOR F(RR16) XOR P2
   RR18 = R16 XOR P1
   TT = (RR18, LL17)

Here is how to approve the decryption algorithm:

Let: 
   T: 64 bits of clear text
   C: 64 bits of cipher text encrypted from T
   CC: 64 bits of cipher text
   TT: 64 bits of clear text decrypted from CC

If: 
   CC = C
   
Then: 
   TT = T

Prove:
   (LL0, RR0) = CC            Initializing step in decryption
      = C                     Assumption of CC = C
      = (R18, L17)            Finalizing step in encryption

   LL1 = LL0 XOR P18          Applying P18 in decryption
      = R18 XOR P18           Previous result
      = R16 XOR P18 XOR P18   Applying P18 in encryption
      = R16

   RR2 = RR0 XOR F(LL1) XOR P17
                              Applying P17 in decryption
      = L17 XOR F(R16) XOR P17
                              Previous result
      = L15 XOR F(R16) XOR P17 XOR F(R16) XOR P17
                              Applying P17 in encryption
      = L15

   ......
   
   LL17 = LL15 XOR F(RR16) XOR P2
                              Applying P2 in decryption
      = R2 XOR F(L1) XOR P2
                              Previous result
      = R0 XOR F(L1) XOR P2 XOR F(L1) XOR P2
                              Applying P2 in encryption
      = R0

   RR18 = RR16 XOR P1         Applying P1 in decryption
      = L1 XOR P1             Previous result
      = L0 XOR P1 XOR P1      Applying P1 in encryption
      = L0

   TT = (RR18, LL17)          Finalizing step in decryption
      = (L0, R0)              Initializing step in encryption
      = T 

(Continued on next part...)

Part:   1  2  3  4 

Dr. Herong Yang, updated in 2007
Cryptography Tutorials - Herong's Tutorial Notes - Cipher - Blowfish Algorithm