class AES256

Public Class Methods

decrypt(crypted, passphrase) click to toggle source
# File lib/aes-everywhere.rb, line 43
def self.decrypt(crypted, passphrase)
  data = Base64.strict_decode64(crypted)
  salted = data[0..7]
  if salted != "Salted__"
    raise "Invalid data"
  end
  salt = data[8..15]
  crypted = data[16..-1]
  cipher = OpenSSL::Cipher::AES256.new(:CBC)
  cipher.decrypt
  cipher.key, cipher.iv = self.derive_key_and_iv(passphrase, salt)
  derypted = cipher.update(crypted) + cipher.final
  derypted.force_encoding("utf-8")
end
encrypt(input, passphrase) click to toggle source
# File lib/aes-everywhere.rb, line 34
def self.encrypt(input, passphrase)
  salt = OpenSSL::Random.random_bytes(8)
  cipher = OpenSSL::Cipher::AES256.new(:CBC)
  cipher.encrypt
  cipher.key, cipher.iv = self.derive_key_and_iv(passphrase, salt)
  crypted = cipher.update(input) + cipher.final
  Base64.strict_encode64("Salted__" + salt + crypted)
end

Private Class Methods

derive_key_and_iv(passphrase, salt) click to toggle source
# File lib/aes-everywhere.rb, line 60
def self.derive_key_and_iv(passphrase, salt)
  dx = di = ""
  enc_pass = passphrase.bytes.pack('c*')

  for _ in 1...4
    di = Digest::MD5.digest(di + enc_pass + salt)
    dx += di
  end

  return dx[0..31], dx[32..47]
end