Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. require "openssl"
  2.  
  3. module InstaplusEncryptor
  4. module Encryptor
  5. class OpenSSL
  6. class << self
  7. def default_cipher
  8. "aes-256-cbc"
  9. end
  10. end
  11.  
  12. def initialize(secret, **options)
  13. @secret = secret
  14. @cipher = options[:cipher] || self.class.default_cipher
  15. end
  16.  
  17. def encrypt_and_sign(value)
  18. _encrypt(value)
  19. end
  20.  
  21. def decrypt_and_verify(data)
  22. _decrypt(data)
  23. end
  24.  
  25. private
  26.  
  27. def _encrypt(value)
  28. cipher = new_cipher
  29. cipher.encrypt
  30. cipher.key = @secret
  31.  
  32. # Rely on OpenSSL for the initialization vector
  33. iv = cipher.random_iv
  34.  
  35. encrypted_data = cipher.update(value)
  36. encrypted_data << cipher.final
  37.  
  38. blob = "#{::Base64.strict_encode64(encrypted_data)}--#{::Base64.strict_encode64(iv)}"
  39. Base64.strict_encode64(blob)
  40. end
  41.  
  42. def _decrypt(encrypted_message)
  43. cipher = new_cipher
  44. blob = Base64.strict_decode64(encrypted_message)
  45. encrypted_data, iv = blob.split("--".freeze).map { |v| ::Base64.strict_decode64(v) }
  46.  
  47. cipher.decrypt
  48. cipher.key = @secret
  49. cipher.iv = iv
  50.  
  51. decrypted_data = cipher.update(encrypted_data)
  52. decrypted_data << cipher.final
  53. decrypted_data
  54. end
  55.  
  56. def new_cipher
  57. ::OpenSSL::Cipher.new(@cipher)
  58. end
  59. end
  60. end
  61. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement