Aes
AES CTR 模式下的消息長度?
我正在將自己的 AES 實施作為個人教育練習(不用於生產用途),以及我用作資源的一本書:
在 CTR 的情況下,我們只是將密碼的輸出與明文進行異或運算。這意味著沒有繼承原因為什麼明文必須是密碼塊大小的倍數。CTR 模式對於 1 比特消息和 TB 消息一樣好。
我不明白作者的說法。在我的實現中,我計劃擁有一個 16 字節的 IV/計數器,其中 12 個字節是隨機 IV,4 個字節用於計數器。在虛擬碼中,是這樣的:
byte [] CTR_encrypt(byte [] key, byte [] plainText){ byte [16] IVAndCounter; nPlainTextBytes = plainText.getLength(); int blockCount = ceiling(nPlainTextBytes / 16) for(int i = 0 ; i < blockCount ; i++){ byte [???] cipheredIVAndCounter = AES(key, IVAndCounter); IVAndCounter++; byte [???] cipherText = cipheredIVAndCounter XOR plainText; byte [???] cipherTextComplete = cipherTextComplete + cipherText; } return cipherTextComplete; }
我理解為什麼你不必填充說最後一個明文塊,它可能不是 128 位長,但你仍然必須將明文分成 128 位塊,以便與 128 位加密 IV/ 進行異或計數器不是嗎?您不能只對 128 位加密 IV/計數器與整個明文進行異或運算,因為這會留下很多未加密的數據?也就是說,明文必須是 128 位或更少的 CTR 模式?
也許我錯過了一些東西。我看了這個問題:為什麼CTR模式不需要阻塞?,但還是不明白,看完後覺得有沒有更困惑的地方。
好吧,讓我們嘗試舉一個具體的例子:
假設您有一條 142 位消息需要使用 CTR 模式進行加密。你做什麼工作?
好吧,您使用 AES 生成第一個 128 位塊;你取消息的前 128 位,異或兩個,這就是密文的前 128 位。
然後呢?好吧,你還有 142-128=14 位的明文。所以,你要做的是用 AES 生成第二個 128 位塊;然後你取它的前 14 位,排他或與 14 位明文,這給了你密文的最後 14 位。而且,你如何處理剩下的 128-14=114 位 AES 輸出?好吧,你丟棄它——你不需要它。
如果解密者執行完全相同的邏輯,他會將 142 位密文轉換為原始的 142 位明文。
這會讓事情變得更清楚嗎?