Class: PqcRails::Session::Encryptor
- Inherits:
-
Object
- Object
- PqcRails::Session::Encryptor
- Defined in:
- lib/pqc_rails/session/encryptor.rb
Overview
HybridKem(KEM) + EnvelopeCipher(DEM)によるKEM-DEM構成のハイブリッド公開鍵暗号。
セッションストアは同一サーバがencrypt(Cookie書き込み時)とdecrypt(Cookie読み込み時)の 両方を行うため、二者間のインタラクティブな鍵交換ではなく、毎回encapsulateし直す ランダム化された公開鍵暗号として使う。これにより、長期鍵(secret_key)はサーバにしか無くても、 Cookieごとに異なるciphertextが作られる(per-cookieのforward secrecy的な性質を持つ)。
Constant Summary collapse
- DEFAULT_PQ_ALG_NAME =
:ml_kem_768
Instance Method Summary collapse
- #decrypt(blob) ⇒ Object
- #encrypt(data) ⇒ Object
-
#initialize(keypair, pq_alg_name: DEFAULT_PQ_ALG_NAME) ⇒ Encryptor
constructor
A new instance of Encryptor.
Constructor Details
#initialize(keypair, pq_alg_name: DEFAULT_PQ_ALG_NAME) ⇒ Encryptor
Returns a new instance of Encryptor.
19 20 21 22 |
# File 'lib/pqc_rails/session/encryptor.rb', line 19 def initialize(keypair, pq_alg_name: DEFAULT_PQ_ALG_NAME) @keypair = keypair @pq_alg_name = pq_alg_name end |
Instance Method Details
#decrypt(blob) ⇒ Object
35 36 37 38 39 40 41 42 |
# File 'lib/pqc_rails/session/encryptor.rb', line 35 def decrypt(blob) ciphertext, encrypted = BlobPacking.unpack(Base64.strict_decode64(blob)) HybridKem.open(@pq_alg_name) do |hybrid| shared_secret = hybrid.decapsulate(ciphertext, @keypair.secret_key) Marshal.load(EnvelopeCipher.new(shared_secret).decrypt(encrypted)) end end |
#encrypt(data) ⇒ Object
24 25 26 27 28 29 30 31 32 33 |
# File 'lib/pqc_rails/session/encryptor.rb', line 24 def encrypt(data) serialized = Marshal.dump(data) HybridKem.open(@pq_alg_name) do |hybrid| encap = hybrid.encapsulate(@keypair.public_key) encrypted = EnvelopeCipher.new(encap.shared_secret).encrypt(serialized) Base64.strict_encode64(BlobPacking.pack(encap.ciphertext, encrypted)) end end |