使用 AES/RSA 實施可拒絕加密
我正在使用 OpenSSL 的加密應用程序(我更像是一個實施者/密碼學家而不是密碼學家),目前主要是作為一種愛好。
我的應用程序將能夠使用對稱或非對稱或同時加密(sym 然後 asym)加密文件(不是容器),並且我想實施“可否認加密”(我在法國,你應該聽說過法律剛剛投票:我們的國家安全域現在擁有網際網路上的所有權利)。
我的第一個問題是 RSA:例如,當使用錯誤的密鑰解密時,它無法留下正確的填充。因此,文件不會被解密為隨機的、看起來很糟糕的破譯文本。我希望對稱算法能讓我做到這一點,但首先我使用的是 RSA。你們中是否有人知道如何“強制” RSA 將文件解密為有效消息(但不是明文),允許使用者聲稱它是正確的密鑰?我假設該協議將是已知的。
如果可能的話,我也會對具有這種“行為”的其他方法的建議或對此的實現感興趣。
編輯:精度:密碼系統*將能夠使用公鑰(這意味著對稱加密)或對稱加密或(小機率)一個接一個地加密明文(例如:假設你有一個已經對稱的加密文件您需要中繼,您可以應用公鑰加密,這將使文件加密兩次,可能使用 2 個不同的算法和 2 個不同的密鑰)。
PS:重定向到聊天,評論太多。
我們需要明確的目標。該問題要求“似是而非的可否認性”或“可否認的加密”,並且這些術語需要在公鑰上下文中進行精確定義(由RSA暗示)。我假設除了密碼的IND-CPA和 IND-CCA1 屬性,包括混合(如AES所暗示的那樣),還希望:
- 沒有私鑰的人無法將密文與相同長度的隨機數據區分開來(考慮到密鑰大小,數據太小而不能成為正確的密文除外)。
- 試圖用錯誤的私鑰解密密文的人會得到類似隨機的輸出並且沒有錯誤消息(考慮到密鑰大小,密文太小而不能成為正確的密文除外)。
- 即便是擁有私鑰的人也無法將用對應的未知隨機數據的公鑰加密得到的密文隨機區分開來。
我認為這些目標是正交的。(1) 最自然的;(2) 有助於讓攔截者毫無頭緒;(3) 在分層加密的上下文中很有用。在擁有隨機文件和為可否認性而設計的加密程序並不令人反感的社會中,整體給出了一定程度的可否認性。
我提出了一個我聲稱滿足上述目標的簡單方案。它接近最簡單的混合 RSA/AES 加密形式:使用隨機密鑰對大量數據進行 AES 加密,並使用 RSA 加密該密鑰。唯一的困難是確保我們不會在這里或那裡留下偏見。特別是,通常的 RSA 原語的密文有一些位有偏差,有時是恆定的,失敗 (1);並且使用正確的私鑰,它們通常會顯示更多的結構,失敗(3)。
密鑰設置是 RSA 的設置。使用者擁有私鑰 $ (N,d) $ ,以及所有對應的公鑰 $ (N,e) $ 被公開。 $ n $ 是位大小 $ N $ , 以便 $ 2^{n-1}\le N<2^n $ . 我限制為純文字、密文,以及更普遍的數據或文件,它們是八位字節的連續集合。密文總是準確的 $ \lceil(n-1)/8\rceil $ 比明文長的八位字節。Big-endian二進制用於八位字節和整數之間的所有轉換。
對稱加密是使用 AES-128 完成的 $ 128<n\le2049 $ , AES-192 為 $ 2049<n\le4097 $ , AES-256 為 $ n>4097 $ .
加密過程接受公鑰 $ (N,e) $ 和明文:
重複以下步驟。。
- 產生 $ M $ 均勻隨機 $ {0\dots N-1} $ ;
- 計算 $ C=M^e\mod N $ ,這是教科書 RSA 加密;
..直到 $ C<2^{n-1} $ $$ notes: here $C$ is uniformly random in ${0\dots2^{n-1}}$; in the context, the end condition means that $C$ fits in $n-1$ bits; it will take on average less than two iterations to get there $$;
產生 $ a $ 均勻隨機 $ {0\dots2^{7-((n-2)\bmod8)}-1} $ [注意:換句話說,生成 $ a $
7-((n-2)%8)
隨機位] ;讓 $ A=a\cdot 2^{n-1}+C $ $$ note: that concatenates $a$ and $C$ for a total of $8\cdot\lceil(n-1)/8\rceil$ bits, when considering $a$ and $C$ as bitstrings of fixed sizes $7-((n-2)\bmod8)$ and $n-1$ bits $$;
輸出 $ A $ 作為 $ \lceil(n-1)/8\rceil $ 八位字節;
讓低位位 $ M $ 是大小由下式確定的 AES 密鑰 $ n $ ;
在 AES- CTR模式下用隱式零 IV加密明文(如果有的話) ,並輸出它。
解密過程接受私鑰 $ (N,d) $ (可能以另一種形式)和假定密文的數據:
- 讀第一 $ \lceil(n-1)/8\rceil $ 八位字節的數據,形成一個整數 $ A $ 的(最多) $ 8\cdot\lceil(n-1)/8\rceil $ 位;如果沒有足夠的數據,則以錯誤終止或掛起;
- 計算 $ C=A\bmod(2^{n-1}) $ $$ note: that forms $C$ by ignoring the high-order $7-((n-2)\bmod8)$ bits of $A$, considered as a bitsring of $8\cdot\lceil(n-1)/8\rceil$ bits $$;
- 計算 $ M=C^d\mod N $ ,這是教科書的RSA解密;
- 讓低位位 $ M $ 是大小由下式確定的 AES 密鑰 $ n $ ;
- 使用隱式零 IV 的 AES-CTR 模式解密其餘數據(如果有),然後輸出。
我不支持對多個使用者進行加密(混合加密的一個共同特徵),或者檢查明文或密文是否不變,這與目標的組合是對立的。
我沒有嘗試隱藏原始數據的長度(添加一些級別很簡單:例如,在加密之前,附加 0 到 255 個隨機八位字節,最後一個八位字節編碼添加的隨機八位字節的隨機數,這將允許在解密時刪除適當數量的八位字節;目標需要進行細微的改進)。
更新:我已經制定了 IND-CPA 和 IND-CCA1 明確的目標。未滿足 IND-CCA2。最糟糕的問題是密碼具有極強的延展性,包括不知道使用了哪個公鑰的人,這是一個弱點:對手猜測明文(例如從上下文和密文長度)可以將其替換為另一個密文,該密文將破譯任何她選擇的明文不長於原始文本,不知道使用哪個密鑰(當然,如果知道公鑰,任何東西都可以加密)。另一個弱點是大小成本取決於密鑰大小,並且高於嚴格必要的。似乎所有這些都可以修復,但需要兩次解密並增加複雜性。