class Origami::Encryption::AES
Class wrapper for AES
mode CBC.
Constants
- BLOCKSIZE
Attributes
iv[W]
Public Class Methods
decrypt(key, data)
click to toggle source
# File lib/origami/encryption.rb, line 577 def AES.decrypt(key, data) AES.new(key, nil).decrypt(data) end
encrypt(key, iv, data)
click to toggle source
# File lib/origami/encryption.rb, line 573 def AES.encrypt(key, iv, data) AES.new(key, iv).encrypt(data) end
new(key, iv, use_padding = true)
click to toggle source
# File lib/origami/encryption.rb, line 581 def initialize(key, iv, use_padding = true) unless [16, 24, 32].include?(key.size) raise EncryptionError, "Key must have a length of 128, 192 or 256 bits." end if not iv.nil? and iv.size != BLOCKSIZE raise EncryptionError, "Initialization vector must have a length of #{BLOCKSIZE} bytes." end @key = key @iv = iv @use_padding = use_padding end
Public Instance Methods
decrypt(data)
click to toggle source
# File lib/origami/encryption.rb, line 613 def decrypt(data) unless data.size % BLOCKSIZE == 0 raise EncryptionError, "Data must be 16-bytes padded (data size = #{data.size} bytes)" end @iv = data.slice!(0, BLOCKSIZE) aes = OpenSSL::Cipher.new("aes-#{@key.length << 3}-cbc").decrypt aes.iv = @iv aes.key = @key aes.padding = 0 plain = (aes.update(data) + aes.final).unpack("C*") if @use_padding padlen = plain[-1] unless (1..16) === padlen raise EncryptionError, "Incorrect padding length : #{padlen}" end padlen.times do pad = plain.pop raise EncryptionError, "Incorrect padding byte : 0x#{pad.to_s 16}" if pad != padlen end end plain.pack("C*") end
encrypt(data)
click to toggle source
# File lib/origami/encryption.rb, line 595 def encrypt(data) if @iv.nil? raise EncryptionError, "No initialization vector has been set." end if @use_padding padlen = BLOCKSIZE - (data.size % BLOCKSIZE) data << (padlen.chr * padlen) end aes = OpenSSL::Cipher.new("aes-#{@key.length << 3}-cbc").encrypt aes.iv = @iv aes.key = @key aes.padding = 0 @iv + aes.update(data) + aes.final end