require 'encrypted_strings/no_key_error' module PluginAWeek #:nodoc: module EncryptedStrings # Symmetric encryption uses a key and a specific algorithm to encrypt the # string. As long as the key and algorithm are known, the string can be # decrypted. # # Source: http://support.microsoft.com/kb/246071 # # == Encrypting # # To encrypt a string using a symmetric algorithm, the type of algorithm and # key must be specified. You can define the defaults for these values like # so: # # PluginAWeek::EncryptedStrings::SymmetricEncryptor.default_algorithm = "des-ecb" # PluginAWeek::EncryptedStrings::SymmetricEncryptor.default_key = "secret" # # If these configuration options are not passed in to #encrypt, then the # default values will be used. You can override the default values like so: # # password = "shhhh" # password.encrypt(:symmetic, :algorithm => "des-ecb", :key => "secret") # => "sUG6tYSn0mI=\n" # # An exception will be raised if no key is specified. # # == Decrypting # # To decrypt a string using an symmetric algorithm, the type of algorithm # and key must also be specified. Defaults for these values can be defined # as show above. # # If these configuration options are not passed in to #decrypt, then the # default values will be used. You can override the default values like so: # # password = "sUG6tYSn0mI=\n" # password.decrypt(:symmetic, :algorithm => "des-ecb", :key => "secret") # => "shhhh" # # An exception will be raised if no key is specified. class SymmetricEncryptor < Encryptor # The default algorithm to use for encryption. Default is DES @@default_algorithm = 'DES-EDE3-CBC' cattr_accessor :default_algorithm # The default key to use. Default is nil @@default_key = nil cattr_accessor :default_key attr_accessor :algorithm attr_accessor :key # Configuration options: # * key - Private key # * algorithm - Algorithm to use def initialize(options = {}) options = options.symbolize_keys options.assert_valid_keys( :key, :algorithm ) options.reverse_merge!(:key => @@default_key) options[:algorithm] ||= @@default_algorithm @key = options[:key] raise NoKeyError if @key.nil? @algorithm = options[:algorithm] super() end # Decrypts the current string using the current key and algorithm specified def decrypt(data) cipher.decrypt(@key) decrypted_data = cipher.update(Base64.decode64(data)) decrypted_data << cipher.final end # Encrypts the current string using the current key and algorithm specified def encrypt(data) cipher.encrypt(@key) encrypted_data = cipher.update(data) encrypted_data << cipher.final Base64.encode64(encrypted_data) end private def cipher #:nodoc: @cipher ||= OpenSSL::Cipher::Cipher.new(@algorithm) end end end end