加密系統設計:如何設計零寬度字元的加密
零寬度字元可用於隱藏顯而易見的文本。我正在建構一個系統,使用者可以在該系統中提供他們的秘密消息、封面消息和密碼(密鑰),我將對其進行加密並僅返回帶有封面消息的輸出加密的秘密消息嵌入為不可見的零寬度字元。當接收者提供消息的密鑰時,系統將解密並將 zwc 轉換回原始秘密消息。
zwc 的代價是每兩位可以包含一個 zwc,因為在 unicode 中只有 4zwc 可用。所以要表示一個字元 ‘b’,它需要 4zwc’s (ZWJ,ZW-NJ,ZWS,ZW-No break space)。
我一直在使用帶有 ebc 模式的 AES,並使用使用者提供的密鑰對秘密消息進行加密,但是由於填充,即使使用者的秘密消息是“hi”,由於 aes 塊大小而在加密時填充為 16 字節。這意味著為了傳達“嗨”,我需要 16 字節,並且由於 zwc 包含它的 16 * 4 = 64 字元。所以我進行了更多研究以找到密文竊取,其中 len(p)=len(cipher text) 消除了填充,這正是我需要的。但是在這個過程中,我開始知道 EBC 模式是不安全的,應該使用 CBC(實現很晚)。CBC 需要一個 IV,它再次佔用一個字節,對我的 zwc 情況施加更多限制。如果我不使用固定的 IV ,每條消息突然變成兩個字節 128 個字元的 zwc。
根據我的研究,如果您在我的情況下更改密鑰,則可以使用固定 IV在我的情況下,使用固定 IV 是安全的。
而且我不明白根據 wiki,len(p)=len(ct) 用於密文竊取,但如果不使用固定的 iv,len(p) 永遠不等於密文的長度?
我可以在我的情況下使用帶有固定IV 和密文竊取的 cbc 嗎?
這是設計這個的正確方法嗎?因為這是我的第一個加密項目
首先,零寬度字元的使用就是我們所說的混淆,實際上就是速記。所描述的加密部分似乎與它分開。
通常我們不會單獨加密每個元素,我們加密明文然後嘗試隱藏明文。加密通常需要一些東西來使密鑰/ IV 唯一,否則您將獲得相同消息的相同密文。在您的情況下,如果您使用基於密碼的密鑰派生函式或 PBKDF 從密碼派生的每個密鑰使用唯一的鹽,則使用固定的 IV 才是安全的。當然,您現在必須儲存鹽,而不是儲存 IV。
CTR 模式只需要一個隨機數而不是一個不可預測的 IV。隨機數是任何大小的唯一值。因此,使用 IV 的成本要小得多。或者,如果您堅持使用 CBC + CTS,您可以使用隨機數作為 CBC 的 IV,方法是使用 AES 加密初始 IV 以派生實際 IV。在這兩種情況下,您可能需要使用零字節正確填充(初始)隨機數,然後才能使用它。
我在您的描述中沒有看到任何關於 PBKDF 的資訊,因此您的設計可能仍需要大量工作。但是,您看到了問題並提出了正確的問題,在這個階段這可能更重要。