Encryption

可加密連結的隨機令牌

  • September 23, 2015

是否有任何算法/協議可以讓您生成特定長度的隨機令牌/位,以便您可以加密確定使用相同種子/密鑰生成的 2 個或更多令牌/位串。有可能嗎?

例如,如果我生成這些隨機位:12432, 15693, 使用密鑰 A 和57322,57483使用密鑰 B。我希望第三方獲得1243215693能夠確定它們都是在同一個密鑰下生成的。

我認為數字簽名是顯而易見的解決方案。但是,數字簽名對我的要求來說太長了。我希望令牌的長度在 10-20 位之間,任何指針都將不勝感激。

要求:

  1. 第三方應該能夠驗證令牌是否有效。
  2. 理想情況下,第三方應該無法偽造代幣。
  3. 令牌對於單個密鑰必須是唯一的。

一個完整的解決方案是不可能的。如果第三方能夠驗證令牌的有效性,他們可以通過 10-20 位令牌空間暴力破解並生成所有有效令牌。所以第三方不能既能驗證又不能偽造。以下解決方案實現了兩者之一。

綁定每個密鑰 $ k_i $ 到一個標識符 $ i $ . 生成表單的令牌 $ i||H(k_i, x) $ 在哪裡 $ x $ 是一個很小的值。 $ H $ 例如,可以將 HMAC-SHA256 截斷為 ~16 位。為了唯一性,生成器應該丟棄任何與它之前的值衝突的值( $ x < x’ $ )。由於域很小,這仍然非常快。

任何不知道密鑰的人都無法驗證令牌是否有效,但可以查看第一個位以查看它是否有效。擁有密鑰的人可以迭代 $ x $ 直到他們找到一個匹配的或者他們退出(在某個定義的上限,比如 $ 2^{8} $ )。上限和令牌長度決定了使用隨機位串生成偽造的機率——8 位和 16 位的機率約為 $ 2^{-8} $ .

如果第三方是可信的*,並且*允許不同key下生成的token發生衝突,那麼標識符 $ i $ 可以省略。但是,您無法唯一確定誰生成了特定值。


使用小塊密碼可以避免上述衝突。然而,在我看來,安全地實現這樣的分組密碼比僅僅檢查衝突更複雜。對於大量令牌,情況可能並非如此。

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