Class: Crypt::Blowfish

Inherits:
Object
  • Object
show all
Includes:
BlockMethods, BlowfishTables, CBC
Defined in:
lib/crypt/blowfish.rb

Constant Summary collapse

ULONG =
0x100000000

Constants included from BlowfishTables

Crypt::BlowfishTables::INITIALPARRAY, Crypt::BlowfishTables::INITIALSBOXES

Instance Method Summary collapse

Methods included from BlockMethods

#decrypt_block, #encrypt_block

Methods included from CBC

#carefully_open_file, #decrypt_file, #decrypt_stream, #decrypt_string, #encrypt_file, #encrypt_stream, #encrypt_string, #generate_initialization_vector

Constructor Details

#initialize(key) ⇒ Blowfish

Returns a new instance of Blowfish.



25
26
27
28
29
30
31
# File 'lib/crypt/blowfish.rb', line 25

def initialize(key)
  @key = key
  raise "Bad key length: the key must be 1-56 bytes." unless (key.length.between?(1,56))
  @p_array = []
  @s_boxes = []
  setup_blowfish()
end

Instance Method Details

#block_sizeObject



20
21
22
# File 'lib/crypt/blowfish.rb', line 20

def block_size
  return(8)
end

#decrypt_pair(xl, xr) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
# File 'lib/crypt/blowfish.rb', line 84

def decrypt_pair(xl, xr)
  17.downto(2) { |i|
      xl = (xl ^ @p_array[i]) % ULONG
      xr = (xr ^ f(xl)) % ULONG
      xl, xr = xr, xl
  }
  xl, xr = xr, xl
  xr = (xr ^ @p_array[1]) % ULONG
  xl = (xl ^ @p_array[0]) % ULONG
  return([xl, xr])
end

#encrypt_pair(xl, xr) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
# File 'lib/crypt/blowfish.rb', line 71

def encrypt_pair(xl, xr)
  0.upto(15) { |i|
      xl = (xl ^ @p_array[i]) % ULONG
      xr = (xr ^ f(xl)) % ULONG
      xl, xr = xr, xl
  }
  xl, xr = xr, xl
  xr = (xr ^ @p_array[16]) % ULONG
  xl = (xl ^ @p_array[17]) % ULONG
  return([xl, xr])
end

#f(x) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/crypt/blowfish.rb', line 34

def f(x)
  a, b, c, d = [x].pack('N').unpack('CCCC')
  y = (@s_boxes[0][a] + @s_boxes[1][b]) % ULONG
  y = (y ^ @s_boxes[2][c]) % ULONG
  y = (y + @s_boxes[3][d]) % ULONG
  return(y)
end

#setup_blowfishObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/crypt/blowfish.rb', line 43

def setup_blowfish()
  @s_boxes = Array.new(4) { |i| INITIALSBOXES[i].clone }
  @p_array = INITIALPARRAY.clone
  keypos = 0
  0.upto(17) { |i|
    data = 0
    4.times {
      data = ((data << 8) | @key.getbyte(keypos)) % ULONG
      keypos = (keypos.next) % @key.length
    }
    @p_array[i] = (@p_array[i] ^ data) % ULONG
  }
  l = 0
  r = 0
  0.step(17, 2) { |i|
    l, r = encrypt_pair(l, r)
    @p_array[i]   = l
    @p_array[i+1] = r
  }
  0.upto(3) { |i|
    0.step(255, 2) { |j|
      l, r = encrypt_pair(l, r)
      @s_boxes[i][j]   = l
      @s_boxes[i][j+1] = r
    }
  }
end