Module: Blowfish::Key

Defined in:
lib/blowfish/keys/init.rb,
lib/blowfish/keys/generate.rb

Defined Under Namespace

Modules: Init

Class Method Summary collapse

Class Method Details

.generate(pass) ⇒ Object

Generation of the key by password.



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/blowfish/keys/generate.rb', line 4

def self.generate(pass)
  key = OpenStruct.new(
    S1: Blowfish::Key::Init::S1.dup,
    S2: Blowfish::Key::Init::S2.dup,
    S3: Blowfish::Key::Init::S3.dup,
    S4: Blowfish::Key::Init::S4.dup,
    P:  Blowfish::Key::Init::P.dup
  )

  pass = pass.ljust(key.P.size * 4, pass)

  (0...(key.P.size)).step(4) do |i|
    key.P[i] ^= pass.byteslice(i, 4).unpack('I>').first
  end

  b = 0.chr * 8
  (0...(key.P.size)).step(2) do |i|
    b = Blowfish::Block.encrypt(b, key)
    key.P[i], key.P[i + 1] = b.unpack('I>I>')
  end

  (0...(key.S1.size)).step(2) do |i|
    b = Blowfish::Block.encrypt(b, key)
    key.S1[i], key.S1[i + 1] = b.unpack('I>I>')
  end

  (0...(key.S2.size)).step(2) do |i|
    b = Blowfish::Block.encrypt(b, key)
    key.S2[i], key.S2[i + 1] = b.unpack('I>I>')
  end

  (0...(key.S3.size)).step(2) do |i|
    b = Blowfish::Block.encrypt(b, key)
    key.S3[i], key.S3[i + 1] = b.unpack('I>I>')
  end

  (0...(key.S4.size)).step(2) do |i|
    b = Blowfish::Block.encrypt(b, key)
    key.S4[i], key.S4[i + 1] = b.unpack('I>I>')
  end

  key
end