Decryption

如何在瀏覽器中強制慢速解密?

  • April 9, 2021

我有一個字元串,我將在伺服器上加密。然後,我想發送加密字元串以及解密方法,以便在瀏覽器中對其進行解密。

我希望最終使用者的解密需要一些時間。假設約 10 分鐘。

讓我說清楚:

  1. 希望解密發生。
  2. 必鬚髮生在瀏覽器上(我知道有些人可能會作弊,但假設我不太關心這些情況,即使它們發生了)。
  3. 必須花費一些時間(約 10 分鐘)。

我知道解密時間取決於許多參數。您可以假設至少要加密的數據字元串可以*與我們需要的一樣小或大,*以實現上述 3 件事。我們可以假設普通電腦/瀏覽器的處理能力。

這可能嗎?如何?

我是一名 JavaScript 開發人員,所以最好使用 JS 解決方案。一些虛擬碼/步驟也會有所幫助。

我對密碼學一無所知,所以如果您能避免使用太多我可能聽不懂的行話,我將不勝感激。

正如我在評論中指出的那樣,我相信非加密解決方案可能是這項任務的最佳選擇,而不是嘗試通過執行某些計算任務所需的平均時間來衡量“10 分鐘”,您只需測量它按掛鐘時間。請注意,此解決方案仍使用一些密碼學,但不作為測量 10 分鐘的代理。

具體來說,當使用者想要文件時,您可以生成一個密鑰(比如 AES 私鑰) $ k $ , 創建一個有效載荷 = $ k || D $ 在哪裡 $ D $ 是以某種標準方式格式化的目前日期/時間,讓 $ h= H(k || D) $ 是有效載荷的雜湊,然後儲存 $ [h, k, D] $ 在某個表中,然後發送 $ h $ 給您的使用者,連同文件(在密鑰下加密 $ k $ ).

然後,使用者可以稍後使用一些雜湊查詢您 $ h’ $ . 收到這樣的查詢後,檢查是否 $ h $ 作為某些條目的一部分在您的儲存表中 $ [h, k, D] $ . 如果是這樣,並且自日期/時間起至少 10 分鐘過去了 $ D $ ,返回密鑰 $ k $ 給現在可以解密的使用者。您還可以驅逐表條目 $ [h, k, D] $ 在此刻。

這與“故意緩慢解密”解決方案的優缺點是:

  1. 使用者方面浪費的計算工作更少
  2. 無論使用者的特定架構(以及他們“作弊”的願望)如何,都會強制執行 10 分鐘的限制
  3. 伺服器端的操作可能比其他基於 RSA 的解決方案更有效(例如,您必須為每個使用者使用約 128 位的隨機性,而不是 > 2k 以確保 RSA 的安全)。

缺點是:

  1. 使用者必須第二次查詢您的伺服器
  2. 您必須為每個使用者儲存一些中間狀態( $ [h, k, D] $ )。每個使用者這應該相當小(幾百位),但大於零。

我認為值得一提的是,我預計即使在誠實的使用者中,使用時間鎖謎題也很難在瀏覽器中獲得統一的“10 分鐘解密時間”。我沒有詳細考慮過這一點,但我想硬體架構的差異(尤其是在某些 SIMD 指令的存在方面,即英特爾 SSE / AVX 類型指令)可能能夠在您的使用者架構上獲得恆定的加速在 RSA 的底層 BigInt 乘法中,這將導致使用者具有依賴於架構的解密時間。

如果您正確實施(並確保不會發生自動矢量化),則可以避免此問題。但是,即使時鐘速度的差異(比如 2GHz 與 3.5GHz,或者對於幾年前的手機與發燒友的台式機來說是合理的任何數字)也可能會產生足夠大的差異,以至於很難強制執行 10 分鐘的解密時間。所有使用者(您可能會確保所有使用者的解密至少需要 10 分鐘,但對於某些使用者可能需要 20 分鐘或其他時間)。

引用自:https://crypto.stackexchange.com/questions/89222