| 1 | #! /usr/local/bin/ruby1.9 -w |
|---|
| 2 | # encoding: utf-8 |
|---|
| 3 | # |
|---|
| 4 | # Code based on: |
|---|
| 5 | # http://stuff-things.net/2008/02/05/encrypting-lots-of-sensitive-data-with-ruby-on-rails/ |
|---|
| 6 | # |
|---|
| 7 | require 'openssl' |
|---|
| 8 | |
|---|
| 9 | TEST_MESSAGE = "The quick brown fox jumped over the lazy fox." |
|---|
| 10 | |
|---|
| 11 | module EncryptDecrypt |
|---|
| 12 | |
|---|
| 13 | def self.encryptData(data, publicKey) |
|---|
| 14 | # Create Cipher to encrypt using 256 bit AES with CBC |
|---|
| 15 | cipher = OpenSSL::Cipher.new('aes-256-cbc') |
|---|
| 16 | cipher.encrypt |
|---|
| 17 | |
|---|
| 18 | # Generate random keys and IVs |
|---|
| 19 | cipher.key = random_key = cipher.random_key |
|---|
| 20 | cipher.iv = random_iv = cipher.random_iv |
|---|
| 21 | |
|---|
| 22 | # Encrypt the data |
|---|
| 23 | encrypted_data = cipher.update(data) |
|---|
| 24 | encrypted_data << cipher.final |
|---|
| 25 | |
|---|
| 26 | # Encrypt the key |
|---|
| 27 | encrypted_key = publicKey.public_encrypt(random_key) |
|---|
| 28 | encrypted_iv = publicKey.public_encrypt(random_iv) |
|---|
| 29 | |
|---|
| 30 | return encrypted_data, encrypted_key, encrypted_iv |
|---|
| 31 | end |
|---|
| 32 | |
|---|
| 33 | def self.decryptData(data, key, iv, privateKey) |
|---|
| 34 | |
|---|
| 35 | # Create Cipher to decrypt using 256 bit AES with CBC |
|---|
| 36 | cipher = OpenSSL::Cipher.new('aes-256-cbc') |
|---|
| 37 | cipher.decrypt |
|---|
| 38 | |
|---|
| 39 | # Decrypt the key and iv |
|---|
| 40 | cipher.key = privateKey.private_decrypt(key) |
|---|
| 41 | cipher.iv = privateKey.private_decrypt(iv) |
|---|
| 42 | |
|---|
| 43 | # Decrypt the message |
|---|
| 44 | decrypted_data = cipher.update(data) |
|---|
| 45 | decrypted_data << cipher.final |
|---|
| 46 | |
|---|
| 47 | return decrypted_data |
|---|
| 48 | end |
|---|
| 49 | end |
|---|
| 50 | |
|---|
| 51 | publicKeyPEM = <<PUBLIC |
|---|
| 52 | -----BEGIN PUBLIC KEY----- |
|---|
| 53 | MIHfMA0GCSqGSIb3DQEBAQUAA4HNADCByQKBwQDa+BX2/hhNkn1NUkeE3D7kZyOX |
|---|
| 54 | TtHmFZFtxQXuJ+cN4lzPaBf4SWekpUvD4yrn3Qyv25Ro08REaMh0uyMfQtPD4J1V |
|---|
| 55 | KyF/4KDv0wC2F1pOBJOyTUqU6hGPL2eqJgP25X2S43dY8HBaL+BuEvZ6yUcZfqWO |
|---|
| 56 | MOACd7V+X/GqPkHxvDwi6kVZoAPVwJsOPvz4K2VRNEWCrwRZFj2JDmiWA/94W0W9 |
|---|
| 57 | d3wYTS0rBBTBKGPdZ6+DmdEyd1fFkOpNJCNL4tsCAwEAAQ== |
|---|
| 58 | -----END PUBLIC KEY----- |
|---|
| 59 | PUBLIC |
|---|
| 60 | |
|---|
| 61 | privateKeyPEM = <<PRIVATE |
|---|
| 62 | -----BEGIN RSA PRIVATE KEY----- |
|---|
| 63 | Proc-Type: 4,ENCRYPTED |
|---|
| 64 | DEK-Info: DES-EDE3-CBC,1684A1CF92F241FB |
|---|
| 65 | |
|---|
| 66 | 74FWxQ0b25BEQfcB1V/u7HazRdRSt/tu4SuWhX1xfmoAH/HB4UEvP3X8iJQ3ggUP |
|---|
| 67 | j58Jnc5yWzWvG6aPI5TqxA5mda2dyE0ATpZjOECkEjspAht8GGzjbjA08sCUhhRN |
|---|
| 68 | yMWEigtPciJeT0Kn31SxbgMypucSHXW/R5Ki0MMsnbOoGUlECfSef+y6m4s8queT |
|---|
| 69 | EYcMxpZV9k2D3sMVAJcKE2Ki6uirLEDxruv6kvREsXXmva4d5+Cv+WsPlBFIKNGS |
|---|
| 70 | Wb2LXST1aLTXjIE3V/qX+zf5J+X2WofXUn/mHrfNmPzC4XbhFsoeqoTrQuaqklWU |
|---|
| 71 | lW7l5JuogzCjDDdEORUCOd1MY1r/U6atQx/dm6eQFat+eU1RpV3nSEzpPsTGCua0 |
|---|
| 72 | 8/xeJ4Qxun7uqLw2CLb31ifDFAR3KsmyC+hAJThSuwABDy+JqdX4hgXH7YLkIEPY |
|---|
| 73 | YJYEAewRu2roNMBaMSn0MeQi7LRavctGyDjJU/JfFYg1T02qV39x7Wx2rLbi7Kyi |
|---|
| 74 | 8QQI1A+QoS6cLYscsb76Rq9+wtw6irUVYmzk7Hn0/73sblM6GKhp9hNgalUEzUv8 |
|---|
| 75 | 0c0SBVl9A8Vat/KKaUylKmRNN9kKxSNQr2Ra+ezw/SgX3wZPXtbhjMh8if20ylMR |
|---|
| 76 | C8C/wocDyw7/hKRJS8LcaOOD4kKXQvAErrsZm82j/vIrm0rTLJBxqKRn3yyuiA+n |
|---|
| 77 | CkzzD1+okCbKEKHxaws9JXs1Y2HmnlByvwgHxFj4jnWMEviZSqNjniCvKBDk0UQD |
|---|
| 78 | Do52uY/ki5BJZ0BvL+nqwjnijQW8eD4vi3xh48wKHMaZdew+CImoHhh+PSIFPV6G |
|---|
| 79 | dvPF2FK15tz7kAbzhX0U7OryUqLg+2wtVPKGdxo3JeNhg/brlPxwkZ3bhZKvjGXO |
|---|
| 80 | J8FSd8KwJqnmJb4LMRCE/YE8Ur9GdBaK7D+cPUMmmHkfGqcBnMeGNxk7T9S3n7Dp |
|---|
| 81 | oXSQOQoEwRtviFmdnWSAsLgcdyUMtYSCpWThrAN3bSN/Nbdr78+Db+SLtmUqfZ29 |
|---|
| 82 | UTP9Cgthp/f6Ny/n6typOvaJWgeW3t9cNn3uPpFWyVR1MryPcZkOsxATpxbxibvB |
|---|
| 83 | gw84EqeOnOndOkpCOtlX4DtTLUyLNymDlPk2Eu+2cSXOY4zUNwSsrnpVaYXIcQPm |
|---|
| 84 | UI9eGw80ijY8gg9OMLBGsYamQJkRuh4GLu8jJzLZn+IfFD8ENXdvQQ== |
|---|
| 85 | -----END RSA PRIVATE KEY----- |
|---|
| 86 | PRIVATE |
|---|
| 87 | |
|---|
| 88 | publicKey = OpenSSL::PKey::RSA.new(publicKeyPEM) |
|---|
| 89 | privateKey = OpenSSL::PKey::RSA.new(privateKeyPEM,'macruby') |
|---|
| 90 | |
|---|
| 91 | data, key, iv = EncryptDecrypt.encryptData(TEST_MESSAGE, publicKey) |
|---|
| 92 | puts EncryptDecrypt.decryptData(data, key, iv, privateKey) |
|---|
| 93 | |
|---|