Elliptic-Curves

如何安全地將消息映射到橢圓曲線上的點

  • March 14, 2019

我正在 Python 中實現一個展示混合密碼系統(FinCrypt,我知道這個名字不好),並且我正在從基於的 Weierstrass 曲線實現遷移到基於 Edward 曲線的來自here的實現。

但是,在將消息映射到橢圓曲線的元素上時,我不知所措,而且我注意到我目前使用的實現不需要映射消息,至少據我所知。

我想知道三件事:

  1. 我是否必須映射一條消息,或者是否可以做一些我已經開始使用 Edward 的曲線的事情
  2. 我目前對 ElGamal 部分的實現是否不安全,因為它不映射消息而是採用整數?
  3. 如果我必須實現安全映射,您建議如何將消息值映射到點,以及如何根據曲線計算出最大消息大小?

如果我必須實現安全映射,您建議如何將消息值映射到點,以及如何根據曲線計算出最大消息大小?

將整數消息編碼為曲線點的預設策略是定義一個值 $ k $ 小於 $ \log_2 p $ (和 $ p $ 是欄位素數),這樣對於每個有效的消息長度 $ m $ , $ m+k< \log_2 p $ 持有。然後,您將消息編碼為 $ m $ x 座標的高位開始計數 $ k $ 低位,直到你達到 $ x $ 有一個 $ y $ 在曲線上(您可以使用曲線方程找到)。這通常有機率 $ 2^{-k} $ 未能對消息進行編碼。對於解碼,您只需扔掉 $ k $ 低位並將其餘部分作為您的資訊。

我目前對 ElGamal 部分的實現是否不安全,因為它不映射消息而是採用整數?

是的,給定的方案是不安全的,因為您可以輕鬆區分 $ 1 $ 從加密 $ 2^{1024} $ 因為前者大約與曲線的素數一樣長,而後者將超過 1024 位長,這正式打破了該方案的 IND-CPA 安全性。

請注意,為了使用正確的ElGamal,您需要將消息編碼為曲線點 $ M $ 然後計算 $ c_1=[k]\beta+M, c_2=[k]G $ 都作為曲線上的操作。另請注意,我相當有信心用整數加法簡單地替換無界整數加法 $ \bmod p $ 也不會產生安全性,因為曲線點座標不是統一選擇的整數(對於初學者來說,因為一些 $ x $ 值根本不會出現)。

我是否必須映射一條消息,或者是否可以做一些我已經開始使用 Edward 的曲線的事情

我認為沒有理由對您的程式碼進行任何更改,因為目前它實際上並沒有使用 ElGamal(見上文)。如果您要使用正確的 ElGamal,則適用於 Weierstrass 的相同策略也適用於 Edwards(參見第一部分)。

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