Algorithm-Design
如何對稱加密 64 位值?
我很好奇一種適用於以下場景的算法:
- 32 位“明文”輸入,取自計數器
- 32 或 64 位“密文”輸出
- 應該可以使用密鑰(可能還有一些其他隱藏參數,如偏移量和目前計數器)解密輸出,並返回原始的 32 位計數器值
- 使用者從不觀察輸入,但可能會收到任意數量的輸出,可能是連續的。即便如此,他們也不應該知道他們擁有哪些指數。
- 應該很難猜測對應於有效計數器值的其他輸出。
我未經訓練的直覺是,由於鍵和輸出大於輸入空間,因此至少對於前幾個輸出來說,應該很容易獲得“好”的結果。但是,如果有足夠的樣本,可以輕鬆計算鍵和索引似乎也是合乎邏輯的,但我希望大多數實例使用少於 100 個值。
我的問題是:
- 是否有適用於這種情況的現有算法?
- 破解有多難?即,計算解密為有效索引的值。
- 擁有更多樣本對破解效率的影響有多大?
- 天真的方法有什麼問題,例如:
u64 output = input repeat 64x output = ((output ^ key) + key) rotate-left 37
假設加法環繞 64 位整數邊界。似乎它將隨機密鑰與單個輸入徹底混合,但擁有多個輸出可以迅速增加攻擊者擁有的資訊,儘管我不知道如何。顯然它會被打破,我只是在努力學習。 5. 使用與鍵相關的值進行左旋轉會
(((key & 0xFFFE)+1) * 37)
更好嗎?它有多大幫助,為什麼? 6. 您將使用哪些方法、資源等來分析算法並設計更好的算法?
- 是否有適用於這種情況的現有算法?
是的,實際上,有許多 64 位分組密碼。標準的智慧是不鼓勵將它們用於一般用途,因為當您接近生日界限(在這種情況下,大約 30 GB)時,標準分組密碼模式往往會開始洩漏資訊;但是對於您的案例,這不是問題。
以下是一些選項:
- 3DES(又名 TDES);這是 DES 使用三個不同的密鑰應用了三次;這具有很好研究的優點。
- Speck具有 64 位分組密碼的參數集。這具有作為最快替代方案的優勢,並且是由知道他們正在做的人設計的,並且已經通過大量的密碼分析完成了。
- 一個 FPE 密碼(例如 FF1,它可以處理任意大小的塊(包括 64 位)。這樣做的好處是它們允許調整選項(這是放置“其他隱藏參數”的方便位置,應該您認為這是一個優勢)。它比替代方案慢;對於 FF1,安全性來自 AES 的底層安全性,以及 Feistel 結構的可證明安全性。
現在,這些密鑰的長度超過 64 位;普遍的看法是 64 位密鑰不夠長。
- 破解有多難?即,計算解密為有效索引的值。
對於上述任何一種情況,對手唯一可行的選擇是隨機猜測密文,並希望偶然發現一個解密為有效索引的密文。
- 擁有更多樣本對破解效率的影響有多大?
對於上述任何一種情況,擁有大量樣本仍然會使攻擊不可行。
- 天真的方法有什麼問題,比如……
ARX 密碼(實際上,任何密碼,尤其是 ARX)都很難正確處理。尤其是 ARX 密碼往往不擅長破壞差分和線性特性(這意味著任何此類設計都需要進行充分研究以確保它確實如此)。
- 您將使用哪些方法、資源等來分析算法並設計更好的算法?
我建議您使用已經分析過的設計;我在上面列出了三個。