Class: ReversibleCryptography::Message

Inherits:
Object
  • Object
show all
Defined in:
lib/reversible_cryptography/message.rb

Constant Summary collapse

MODE =
"CFB"
PREFIX =
"aes-256-cfb"

Class Method Summary collapse

Class Method Details

.decrypt(str, password) ⇒ Object

Raises:



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/reversible_cryptography/message.rb', line 28

def decrypt(str, password)
  raise EmptyInputString if blank?(str)
  raise EmptyPassword if blank?(password)

  key = str.sub(/^md5:(.+):salt:(.+):#{PREFIX}:/, '')
  md5 = $1
  salt_string = $2

  if [key, md5, salt_string].any? { |s| blank?(s) }
    raise InvalidFormat
  end

  salt = convert_salt(salt_string)

  dec = OpenSSL::Cipher::AES256.new(MODE)
  dec.decrypt
  set_key_and_iv(dec, password, salt)

  result = dec.update(Base64.decode64(key)) + dec.final
  if OpenSSL::Digest.hexdigest("MD5", result) == md5
    result
  else
    raise InvalidPassword
  end
end

.encrypt(str, password) ⇒ Object

Raises:



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/reversible_cryptography/message.rb', line 10

def encrypt(str, password)
  raise EmptyInputString if blank?(str)
  raise EmptyPassword if blank?(password)

  enc = OpenSSL::Cipher::AES256.new(MODE)
  enc.encrypt

  salt = OpenSSL::Random.random_bytes(8)
  salt_string = generate_salt_string(salt)

  set_key_and_iv(enc, password, salt)

  result = enc.update(str) + enc.final

  md5 = OpenSSL::Digest.hexdigest("MD5", str)
  ["md5", md5, "salt", salt_string, PREFIX, Base64.encode64(result).chomp].join(":")
end