Algorithm-Design

Diffie-Hellman:素數模數的大小是否取決於秘密的潛在大小?

  • December 10, 2013

我正在編寫自己的密碼系統,使用 One Time Pad 和 Diffie-Hellman 為 OTP 生成密鑰。我在伺服器端使用 Rails,在客戶端使用 Javascript。

請不要告訴我這是不安全的,我不應該這樣做。我這樣做純粹是為了教育目的,絕不會在非實驗意義上進行部署。

由於這是 OTP,我需要一個至少與被加密的消息一樣長的密鑰流。根據我的閱讀,DH 似乎需要一個大得離譜的安全素數模數。或者是嗎?

每個字元都需要一個不同的隨機密鑰,因此對於 10 個字元長的字元串,DH 密鑰交換需要發生 10 次才能為該字元串創建一個公共密鑰數組。

但是,我似乎得到的整數可能比必要的大得多。

假設使用者製作了一個私鑰數組:

var userPrivateKeys = [9,12,0,23,7,8,4,7,15,24]

還有一個 2048 位安全素數模數,以 2 作為生成器:

var prime = 32317006071311007300338913926423828248817941241140239112842009751400741706634354222619689417363569347117901737909704191754605873209195028853758986185622153212175412514901774520270235796078236248884246189477587641105928646099411723245426622522193230540919037680524235519125679715870117001058055877651038861847280257976054903569732561526167081339361799541336476559160368317896729073178384589680639671900977202194168647225871031411336429319536193471636533209717077448227988588565369208645296636077250268955505928362751121174096972998068410554359584866583291642136218231078990999448652468262416972035911852507045361090559

var generator = 2

使用者的共享密鑰數組最終看起來像這樣:

var userPublicKeys = [512,4096,1,8388608,128,256,16,128,32768,16777216]

在使用者和伺服器交換他們的公鑰後,我們得到這個作為公共密鑰:

var commonKeys = [134217728,2.2300745198530623e+43,1,1.725436586697641e+69,72057594037927940,16777216,17592186044416,1.78405961588245e+44,6.216540455122333e+85,1]

聖….

這些整數遠大於字母表的模數,甚至是 ASCII 的模數。

$$ think I $$了解在創建要在 AES 等密碼中使用的密鑰的上下文中,素數模數必須很大,但是在 OTP 中的每個字元都有不同的隨機密鑰的上下文中呢? 例如,假設我的消息僅包含字母 a 到 z,並且我的模數較小:

p = 27
g = 3

userPrivateKeys = [9,12,0,23,7,8,4,7,15,24]

我們的算法是:

2^a mod 27

或在 Javascript 中…

Math.pow(2, a) % 27

我們將生成一個公鑰列表:

userPublicKeys = [26,19,1,5,20,13,16,20,17,10]

這樣更易於管理。

那麼在這種情況下,素數模數這麼小有問題嗎?

據我所知,打破這一點的唯一方法是通過詳盡的搜尋。由於 OTP cryptext 不包含有關原始消息的資訊,因此無法進行詳盡的搜尋。我已經閱讀了其他可能的方法來打破這個和一般的 DH,但通常我不理解它們,或者它們依賴於已知的秘密之一。

那麼我有什麼遺漏嗎?

好吧,一方面,您沒有使用“One Time Pad”。根據定義,“One Time Pad”意味著某人使用真正的隨機性(而不是算法)生成一個數字墊,並且沒有潛在的對手知道該墊可能包含的任何資訊。然後,將那個 pad 給發送者和接收者,然後發送者用它來偽裝明文,這樣接收者(有 pad)可以恢復明文,但是對手沒有pad 沒有得到關於明文的資訊(因為有了密文和任何潛在的明文,就有一個可能的 pad 使這成為可能,而對手無法確定哪個潛在的 pad 更有可能。

相反,您正在執行一系列 Diffie-Hellman 操作來生成共享機密,然後使用這些共享機密執行流加密。

這就是為什麼區分很重要的原因;你說:

打破這種情況的唯一方法是通過詳盡的搜尋;因為 OTP cryptext 不包含有關原始消息的資訊

如果您使用的是 OTP,這確實是真的;除了密文,攻擊者實際上沒有任何資訊,而密文確實不會透露任何關於明文的資訊。但是,密文並不是發送方和接收方唯一交換的內容,您之前提到過:

使用者和伺服器交換他們的公鑰

也就是說,攻擊者除了可以使用的密文之外,還有可用的資訊。也就是說,除了資訊安全(OTP 是),你還希望攻擊者不能使用公鑰來恢復共享密鑰(pads),也就是說,你希望恢復共享密鑰的問題也一樣攻擊者很難。換句話說,你希望你在計算上是安全的。

在這裡,在這種情況下,當你問:

素數模數這麼小有問題嗎?

您要問的問題是“即使模數很小,Diffie-Hellman 在計算上是否安全”。答案是“不,不是”。對於 MODP 組(您正在使用的組),似乎 DH 可以被破壞,除非模數至少為 800 位(實際上,針對該大小的模數的攻擊實際上並沒有被證明,但是已經有針對相關的攻擊原語,我們相信這些攻擊可以轉化為針對 Diffie-Hellman 的攻擊)。

還有其他組可以做得更小,但仍然被認為是安全的(例如,即使曲線只有 200 位左右,橢圓曲線組也可能非常安全);但是,您不會接近“ASCII 值”。

當我們像這樣使用 Diffie-Hellman 時,我們通常做的是執行單個 Diffie-Hellman 操作以生成單個(大)共享密鑰,然後將該共享密鑰提供給Key Derivation Function;然後可以將該 KDF 的輸出呈現給Stream Cipher,然後將其輸出用於實際加密數據

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