Skip to content

Instantly share code, notes, and snippets.

@Epictetus
Forked from nov/gist:5311749
Created April 4, 2013 18:37
Show Gist options
  • Save Epictetus/5312958 to your computer and use it in GitHub Desktop.
Save Epictetus/5312958 to your computer and use it in GitHub Desktop.
require 'openssl'
require 'url_safe_base64'
original = "Hello World"
pem = <<-PEM
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,A6B5D10FFA23D7BC66CE4FB46B754E8C
gvYFJmzetWSwpf1Ut6USm4IReFLA6bpp5nVUfU2Xa9dJmrCu0cTupTkdzNmGp14/
mzeT/a5WplK1hWV41Y7bLm57hOpaoxbEx2h3IW9cxuqgAp422AbafRu6hEvjUONO
qUEm63I4d7/FKo0he4IVVx0UHaX5eEq8pdY1AZR9+fqlxWvjpgZlB0anT3AMpfVL
CY4sGc/Es14M9A4zUpOkp+09PbV3WNG8A4G4IJA3wx6tYBxrd2866Te2ccP6/BL8
HA2uoqeD+70ziybvd//CtGAD1xoTDvOCwzXXT5A4fCuec3apFp8O6WyJ63ao99R4
E0r6AvD4iOkLMC8K2YUSc1zFLJAkhlfhBb8qFbXOwOomazWf2Z8rDtkP1VCfB9gC
W6oYRBOyVUkbaBSBOOPBJtxjuTL/cJBvFhn6r0zdC67g0CD4cabMPd1VY92lUVbl
JvE9CouDB5O39jwfpgfxo3kGev2UzwRze9U2uw6EdYIUB/ixyC8/5BoN8lKZXdTn
7vQBmcBsC3boMqQiq2c/dVGW7yrt/Y4q8wq9aGFwdBAY1pYhRlOZ0MwFmlAJKOzo
Y3i2OILtPM0sdfqIeAvrwicQULGAzLGEhecDOQ1r0GwZRy5/Sl3ILxKMW8ngdaK4
iNDM56u6F9dwqqArrZDZgkfwnKakXU2ZbltSOWTCleCfYrc1D75Yw3FHKcWozB/l
uyMTIqzBXzO6OiNDUv7zAE1xzVaV+VeBH/5KGx18dAuRP3TnpYltGSUVDyGk9FX7
m7nhvkqOcFJMHOGdTjt2Ff9Ibn3rgCEFI0CjCwcJPo2ym1Zox8GfP0/nXk3p/oWV
ebBTvS+yc9HaSm2Al77GDXEwY7NDcTef+3kEtQHpesS+xmC8mFtMEKV8vifXEhpt
iNp6gtsfDMtFmrFXCADTaUD1WBmhJQtYUsGsoQ75c5zzUHU93BOswBe2KODCA3Ie
X3XKvHTjGw3wjWJvLcnL3EgcHDL1x7ehIA5UgvHFixmkx5D91uIdq4YDMt6xERle
JgeLKF9g1qCl9wmxqT4T1J9h9LGMQQEUhth0uTFr6bEpzgg6hFTrPDaI8dOMlcgu
ctOH2wFZgRMfrykGIs53rwF4pL+8iy+pakaRRAVTaZIX2CL2dThy0283jTVu9dNn
f/Zfu5mNlvsRcXlZMgTy0UMBpXeLMjaWyd+JeAnAeZxO3/ID/Ppg6vcc0Wn8XyB5
YUOIQe+Rc0jJnB1zqjww2cB6H5Ke3GjktQqrulHFfEYbn7lj8WLVgDLmellFNOxX
k9H2sta5SN/t3fN3oBO0A6JyotQOiBE54yHVpgoc+PBlcrpoOxSZx67lprD+WnlV
Ynnf6qIrR9NxgYN00Elzj9KP9OT1ufFrMQ0BnW4EWdFLCScGLsZVlmBKPrtHwK3N
FSy3JFMJcpymgNas5+bqIyZGqAZREHH3AWhc2TVl1Kt11g6PZWm3dSafT6SlqgyP
Z7OcBEnWr+ZhDeJfnAXrn5siah9eXuT0KtQWlqpSn76dExlfz16Da/3xBtO4ceyz
Lk4gzZ1QjP1ZvjarWOIEtkT7eiWaCQHYNVbvFRu5wo98o/KwO3xaPTDN9LCZKGhR
-----END RSA PRIVATE KEY-----
PEM
private_key = OpenSSL::PKey::RSA.new pem, 'pass-phrase'
jwe = 'eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4R0NNIn0.BoGTWa1uAZFZBnFycal1dGzckZ1ADXP4fAhNJflY8C4GkJDcju9XrjFnZYBaT5d_ETqqUJb2B_jQuyVRuKQ9w-6INIvp_pzNwRVSsZHcm-KcOPJPkmTG1KfAVchNj3iLSHBb5v9jlXNo8XHBwtBd7KUt6TNs6UK29sdRXVoshhCek9TLzjE3V79Pdzcyup1moixRr_zk8U8rxvijHPMBziiP6oiwpxWpapGYHzirXPsPayg6gJ8ODXzMGlZ4w6S7Pcg-uIW7vSXNjp_Bh3mwuWnp-fZ-ueqIjuPD6m2x6Ar7TbaqUV1RVxrnIzs7woiW4oNsRMkgeFbAmn9ny1cvHg.UTEZoZT26O-ZP8HL.1RpYVQ7mMVbSSKA.SsLMclnhsALLXS1_qXcO_A'
header, encrypted_master_key, iv, cipher_text, integrity_value = jwe.split('.').collect do |segment|
UrlSafeBase64.decode64 segment
end
master_key = private_key.private_decrypt encrypted_master_key
cipher = OpenSSL::Cipher::Cipher.new('aes-128-gcm') # OpenSSL::Cipher::AES.new(128, :GDM) doesn't work..
cipher.decrypt
cipher.key = master_key
cipher.iv = iv # if you set iv before key, you get an error..
cipher.auth_tag = integrity_value
cipher.auth_data = jwe.split('.')[0, 3].join('.')
plain = cipher.update(cipher_text) + cipher.final
puts plain == original #=> true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment