Last active
December 31, 2022 15:16
-
-
Save serradura/62b3640bfa319408aecd1fc3f734ee5f to your computer and use it in GitHub Desktop.
AES256
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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