Class: PqcRails::Session::Encryptor

Inherits:
Object
  • Object
show all
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

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