class OsslCryptor::Cryptor
Crypt class
Public Class Methods
constructor. @param [String] mode cipher mode. @param [Hash] key_iv
key and iv. key_iv = key, key_iv = iv @param [String] pass password @param [String] salt salt data. if salt is nil, use random salt. @param [String] key_iv_hash use hash algorithm when key and iv generate.
# File lib/ossl_cryptor/cryptor.rb, line 17 def initialize(mode, key_iv=nil, pass=nil, salt=nil, key_iv_hash=nil) # if invalid mode, raise error. if (AES_128 != mode) && (AES_256 != mode) && (DES != mode) raise OpenSSL::Cipher::CipherError.new("invalid mode : #{mode}") end # generate cipher instance. @cipher = OsslCryptor::Generator.generate_cipher(mode) # set initialize parameter and generate key, iv @mode = mode @pass = pass.nil? ? OsslCryptor::Generator::DEFAULT_PASS : pass @salt = salt @key_iv_hash = key_iv_hash.nil? ? OsslCryptor::Generator::DEFAULT_KEY_IV_HASH : key_iv_hash @key_iv = key_iv.nil? ? generate_key_iv(@mode, @pass, @salt, @key_iv_hash) : key_iv end
Public Instance Methods
decrypt value. @param [String] value decrypt value. @param [boolean] decode_base64
decode base64 flag. @return [String] decrypt result value.
# File lib/ossl_cryptor/cryptor.rb, line 67 def decrypt(value, decode_base64=true) # prepare decrypt. @cipher.decrypt set_key_iv # decode base64. if decode_base64 value = decode_base64(value) end # decrypt. decrypt_value = "" decrypt_value << @cipher.update(value) decrypt_value << @cipher.final decrypt_value end
decrypt value from file. @param [String] file_path save file path. @param [boolean] decode_base64
decode base64 flag. @return [String] decrypt result value.
# File lib/ossl_cryptor/cryptor.rb, line 104 def decrypt_from_file(file_path, decode_base64=true) # read from file. enc_value = File.read(file_path) dec_value = decrypt(enc_value, decode_base64) dec_value end
encrypt value. @param [String] value encrypt value. @param [boolean] encode_base64
encode base64 flag. @return [String] encrypt result value.
# File lib/ossl_cryptor/cryptor.rb, line 44 def encrypt(value, encode_base64=true) # prepare encrypt. @cipher.encrypt set_key_iv # encrypt. encrypt_value = "" encrypt_value << @cipher.update(value) encrypt_value << @cipher.final # encode base64. if encode_base64 encrypt_value = encode_base64(encrypt_value) end encrypt_value end
encrypt value and save to file. @param [String] file_path save file path. @param [String] value encrypt value. @param [boolean] encode_base64
encode base64 flag. @return [String] encrypt result value.
# File lib/ossl_cryptor/cryptor.rb, line 90 def encrypt_to_file(file_path, value, encode_base64=true) # encrypt value. enc_value = encrypt(value, encode_base64) # save file. File.write(file_path, enc_value) enc_value end
get crypt mode. @return [String] mode
# File lib/ossl_cryptor/cryptor.rb, line 121 def mode @mode end
reset cipher instance.
# File lib/ossl_cryptor/cryptor.rb, line 35 def reset @cipher = OsslCryptor::Generator.generate_cipher(@mode) @key_iv = generate_key_iv(@mode, @pass, @salt, @key_iv_hash) if @key_iv.nil? end
set base64 rfc. @param [integer] rfc rfc
# File lib/ossl_cryptor/cryptor.rb, line 115 def set_rfc(rfc) @rfc = rfc end
Private Instance Methods
decode base64. @param [String] value target value. @return [String] base64 decode value.
# File lib/ossl_cryptor/cryptor.rb, line 189 def decode_base64(value) if @rfc == RFC2045 Base64.decode64(value) elsif @rfc == RFC4648 Base64.strict_decode64(value) else Base64.decode64(value) end end
encode base64. @param [String] value target value. @return [String] base64 encode value.
# File lib/ossl_cryptor/cryptor.rb, line 175 def encode_base64(value) if @rfc == RFC2045 Base64.encode64(value) elsif @rfc == RFC4648 Base64.strict_encode64(value) else Base64.encode64(value) end end
generate cipher key and iv. @param [String] mode crypt mode. @param [String] pass password, if pass = nil, use OsslCryptor::Generator::DEFAULT_PASS @param [String] salt salt data. if salt = nil, use random salt. @param [String] hash use hash algorithm when key and iv generate. if key_iv_hash = nil, use OsslCryptor::Generator::DEFAULT_KEY_IV_HASH @return [Hash] key and iv hash.
# File lib/ossl_cryptor/cryptor.rb, line 139 def generate_key_iv(mode, pass=nil, salt=nil, hash=nil) salt = salt.nil? ? get_default_salt(mode) : salt key_iv_str = OpenSSL::PKCS5.pbkdf2_hmac(pass, salt, 2000, (@cipher.key_len + @cipher.iv_len), hash) key = key_iv_str[0, @cipher.key_len] iv = key_iv_str[@cipher.key_len, @cipher.iv_len] cipher_key_iv = { key: key, iv: iv } cipher_key_iv end
get default salt depend on mode. @param [String] mode cipher mode. @return [String] default salt.
# File lib/ossl_cryptor/cryptor.rb, line 153 def get_default_salt(mode) default_salt = nil if (mode == AES_128) || (mode == AES_256) default_salt = OpenSSL::Random.random_bytes(8) elsif mode == DES default_salt = OpenSSL::Random.random_bytes(2) end default_salt end
set key and iv to cipher instance.
# File lib/ossl_cryptor/cryptor.rb, line 167 def set_key_iv @cipher.key = @key_iv[:key] @cipher.iv = @key_iv[:iv] end