Skip to content

Instantly share code, notes, and snippets.

@serradura
Last active December 31, 2022 15:16
Show Gist options
  • Save serradura/62b3640bfa319408aecd1fc3f734ee5f to your computer and use it in GitHub Desktop.
Save serradura/62b3640bfa319408aecd1fc3f734ee5f to your computer and use it in GitHub Desktop.
AES256
require 'base64'
require 'openssl'
require 'singleton'
require 'forwardable'
class AES256
class Config
class << self
attr_accessor :key
end
end
module KeyLength
SIZE = 32
class Error < StandardError
def initialize(str)
super("key length too short (given: #{str.size}, expected: #{SIZE})")
end
end
def self.validate(str)
return str if Kind::String[str].size >= SIZE
raise Error.new(str)
end
end
module Cipher
def self.new
OpenSSL::Cipher::AES256.new(:CBC)
end
def self.random_key
new.random_key
end
end
def self.from_password(arg)
new(OpenSSL::Digest::SHA256.new.digest(arg))
end
attr_reader :cipher
def initialize(arg = nil)
@key = KeyLength.validate(arg || Config.key)
@cipher = Cipher.new
end
def encrypt(str)
call(@cipher.encrypt, str)
end
def encrypt_base64(str)
Base64.encode64(encrypt(str))
end
def decrypt(str)
call(@cipher.decrypt, str)
end
def decrypt_base64(str)
decrypt(Base64.decode64(str))
end
def inspect
"#<AES256 @key=\"#{@key[0..2]}#{'.' * 24}#{@key[-3..-1]}\">"
end
private
def call(cipher, str)
cipher.key = @key
cipher.update(str) + cipher.final
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment