無填充的經過身份驗證的加密
我想加密數據並保護其完整性和機密性。但是,我不能增加數據的長度。
是否有任何密碼操作模式可以在不增加密文長度的情況下提供機密性和完整性保護?
如果要保護的數據根本沒有內置冗餘(例如,它的每一位都由公平的拋硬幣決定),那麼沒有擴展就無法保護完整性(證明草圖:有效明文,因為存在有效的加密和保護數據的可能性,因此每個可能的加密和保護數據都必須是驗證和解密操作可接受的)。
如果要保護的數據有一些內置的冗餘部分(例如,一個 16 字節的固定標頭),那麼我們可以將其刪除,使用正常的認證加密,並在驗證和解密步驟之後恢復冗餘。變體:如果我們確定某些無損壓縮方案將足夠壓縮數據(例如,明文是 2227 個符號,限制為 246 個可能的值,每個編碼為一個八位字節,允許僅通過從基數 246 轉換將該明文編碼為 2211 個任意八位字節以 256 為基數,為 16 個八位字節騰出空間),我們可以在應用經過身份驗證的加密之前壓縮數據,並在驗證和解密步驟之後進行擴展。
如果要保護的數據有一些內置冗餘,我們無法將其轉化為可壓縮性,但仍然可以表徵(例如,明文是對大約一頁有意義的英文文本應用Bzip2壓縮的結果),我們可以選擇使用格式保留加密(即,在上下文中,塊大小等於數據大小的塊密碼,它實現整個數據的密鑰相關、類隨機、可逆轉換)。密文的任何更改(除了用已知有效的密文替換)都會使整個隨機破譯明文,我們可以可靠地檢測到(使用針對惡意輸入的 Bzip2 解壓縮算法進行了強化,然後進行最基本的驗證,即輸出包含足夠大比例的英語單詞)。但是請注意,我們在保密性方面有所鬆懈:與之前的解決方案相反,相同的明文將始終被加密為相同的密文,這有時是不可接受的,並且與密碼的現代目標不匹配。
@fgrieu 給出了一個很好的答案。
另一種選擇。假設您知道明文有冗餘(由於某些消息格式或其他原因),並且您知道如何驗證其冗餘是否正確(例如,檢查格式),但您不知道如何壓縮它或如何刪除冗餘。
那麼合理的解決方案如下:
- 使用保留長度的加密方案加密消息,例如使用全零 IV 和密文竊取的 CBC 加密(我不建議使用計數器模式或流密碼)。
- 然後,應用公共隨機排列或保持長度的全有或全無變換。
- 最後,使用相同的保長加密方案對結果進行加密,但使用不同的獨立密鑰。
在接收方,您可以撤消此操作(解密、撤消排列或全有或全無轉換、解密),然後檢查格式/冗餘。如果格式化/冗餘有效,則接受該消息為有效且未被篡改。
(您甚至可以跳過第一步,只需應用公共隨機排列,然後使用 CBC 模式進行加密。但上述可能更健壯。)
如果你能找到的話,更好的辦法是使用一個可變長度的保持長度的分組密碼(偽隨機排列)。(例如,一些保留格式的加密方案可能是合適的。)但是如果您無法為您的消息找到合適長度的可變長度分組密碼,那麼以上是一個實用的工程解決方案應該足夠好。
鑑於我概述的假設,我希望這種方法能夠提供盡可能多的完整性。(我的意思只是在工程/啟發式意義上;這不是我在數學上證明的。)編碼和應用也很容易。因此,這在實踐中可能是一種有吸引力的方法。