Skip to content

Instantly share code, notes, and snippets.

@zenchild
Created June 23, 2010 20:30
Show Gist options
  • Save zenchild/450500 to your computer and use it in GitHub Desktop.
Save zenchild/450500 to your computer and use it in GitHub Desktop.
require 'openssl'
require 'yaml'
class Encryptor
def initialize(key_pass, key_size = 2048, key_name = 'rsakey.sec', cipher = OpenSSL::Cipher.new('aes-256-cbc'))
@key_size = key_size
@cipher = cipher
@key_name = key_name
if( File.exists?(@key_name) )
@rsakey = OpenSSL::PKey::RSA.new(File.read(@key_name), key_pass)
else
@rsakey = OpenSSL::PKey::RSA.generate(@key_size)
File.open(@key_name,'w+') do |priv|
priv.write(@rsakey.to_pem(@cipher, key_pass))
end
end
end
def rsa_encrypt(txt, pub_key=nil)
begin
pub_key.nil? ? @rsakey.public_encrypt(txt) : OpenSSL::PKey::RSA.new(pub_key).public_encrypt(txt)
rescue OpenSSL::PKey::RSAError => e
if e.message == 'data too large for key size'
STDERR.puts 'Your string is too large to encrypt'
else
raise
end
end
end
def rsa_decrypt(etxt)
@rsakey.private_decrypt(etxt)
end
def aes_encrypt(txt, aes_file)
key = get_aes_key(aes_file)
cif = OpenSSL::Cipher.new('AES-256-CBC')
cif.encrypt
cif.key = key[:key]
cif.iv = key[:iv] = cif.random_iv
save_aes_key(aes_file, key)
etxt = ''
etxt << cif.update(txt)
etxt << cif.final
etxt
end
def aes_decrypt(etxt, aes_file)
key = get_aes_key(aes_file)
cif = OpenSSL::Cipher.new('AES-256-CBC')
cif.decrypt
cif.key = key[:key]
cif.iv = key[:iv]
txt = ''
txt << cif.update(etxt)
txt << cif.final
txt
end
def gen_aes_key(file)
cif = OpenSSL::Cipher.new('AES-256-CBC')
key = {key: cif.random_key}
save_aes_key(file, key)
key
end
def save_aes_key(file,key_iv)
File.open(file,'w+') do |f|
f.write(rsa_encrypt(YAML.dump(key_iv)))
end
end
def get_aes_key(file)
YAML.load(rsa_decrypt(File.read(file)))
end
def give_aes_key(aes_file, rsa_pub)
aes = get_aes_key(aes_file)
rsa_encrypt(YAML.dump(aes), rsa_pub)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment