用於同樣短明文的非常短的分組密碼
我正在嘗試開發一種加密技術來加密文本中的片語(例如可逆匿名名稱)。密鑰生成和密文表示細節是可替代的,但我設想的大多數技術最好通過具有以下屬性的函式來促進:
我想用一個公共密鑰(預計至少為 256 個字節)加密多個明文,使加密的字元串不大於源文本(可以使用短字元串壓縮算法壓縮,如smaz,既保持數據小又增加輸入熵)。
我查看了常見的對稱加密密碼,如 AES 和 Salsa20,但是這兩種密碼的塊大小導致輸出明顯長於我們的輸入(可能短至單個字節)。
由於我的密鑰材料預計幾乎總是比輸入長,我還考慮使用一次性填充方法,例如簡單地將輸入與密鑰的字節進行異或,但這會受到微不足道的已知明文攻擊:如果攻擊者可以猜出一個加密字元串的輸入表示,他們可以獲得一個部分密鑰,該密鑰可以通過與該明文進行異或運算來解密該長度或更短的任何其他字元串。
我還考慮了一種使用每個字節作為塊的類似流密碼的方法,但是在加密時存在具有相同前綴的輸入具有相同前綴的問題(即,如果我知道“John Smith”加密為“ABCDEFGHIJ”,然後我知道“ABCDEKLMNOPQ”是另一個以“John”開頭的字元串)。
是否可以以這樣的方式對稱加密多個短於密鑰的字節序列(沒有隨機數)
- 輸出與輸入的長度相同,
- 具有相似子序列(例如相同前綴)的輸入沒有匹配(部分)密文,
- 和其他明文不能從已知的明文(或至少,不是微不足道的)派生?
感覺就像我要的是一種分組密碼,可以對任何寬度的塊進行操作 $ 8 $ 至 $ n $ (在哪裡 $ n $ 是消息的長度,或者至少是密鑰的長度)。這樣的算法存在嗎?
為什麼不使用像 RC4 這樣的流晶片?(好的,已知 RC4 已損壞,但還有很多其他問題)。我從你的問題中遺漏了什麼嗎?
Hasty Pudding 密碼具有可在任何大小的塊上執行的模式,儘管密文似乎總是在 64 位的塊中。
Speck和Simon密碼具有在 32 位塊上執行的模式,儘管這些模式僅使用 64 位密鑰(這意味著您必須截斷其餘的密鑰材料)。
對於較小的塊大小,Stack Exchange 上有幾個關於 8 位塊密碼的問題:
但是,需要注意的是,您的塊大小不必決定密文的大小:您可以使用**密文竊取**與密碼塊連結和合適的初始化向量,將密文縮短到與明文相同的大小。(最初的問題確實指定了“沒有隨機數”,但根據您的算法,空 IV 可能就足夠了 - 在 16 個字節內,我相信 AES 在這種情況下仍將滿足不可區分標準,但除此之外,您需要擔心相同的塊。)