Encryption

在 AES128-CBC 加密的消息中附加了什麼樣的數據?

  • February 28, 2017

我目前正在使用wireshark 來分析TLSv1 流量。我使用以下 java (jdk 6) 程式碼生成到 Apache (OpenSSL) 的流量:

       URL url = new URL(strUrl);
       HttpURLConnection httpc = (HttpURLConnection) url.openConnection();
       httpc.setRequestMethod("POST");
       httpc.setDoOutput(true);
       httpc.setFixedLengthStreamingMode(32);
       OutputStream out = httpc.getOutputStream();

       String request = "A";
       byte[] bytesRequest = new byte[1];
       bytesRequest[0] = Character.toString((char)Integer.parseInt(partsRequest[0])).getBytes("UTF-8")[0];
       out.write(bytesRequest);
       out.flush();
       out.close();

握手中選擇的算法是 AES128_CBC_SHA。

因此,如果我理解正確,POST 請求被加密並發送,那麼我們使用該請求的最後一個密碼塊作為要加密的消息“A”的 IV。

但是,當使用 Wireshark 嗅探流量時,我注意到加密數據的大小為 32 字節,即使 Wireshark 僅將其解密為 1 字節:

使用wireshark擷取流量

所以我的問題是:附加數據、填充或有關消息長度的資訊的性質是什麼,或兩者兼而有之?

此外,我加密了 16 和 32 個字節,我分別以 48 和 64 個加密字節結束,即使不需要填充(我使用的是塊大小的消息)。

所以我的問題是:附加數據、填充或有關消息長度的資訊的性質是什麼,或兩者兼而有之?

使用此密碼套件,加密數據由明文數據和明文的 HMAC(以及標頭和序列號)組成;這個 HMAC 有 20 個字節長。

因此,如果您加密 1 個字節,那麼您最終將加密 21 個字節;使用 CBC 模式時,最多可填充 32 個字節;正是你所看到的。並且,一個 16 字節的消息使用 HMAC 變為 36 字節,因此填充後為 48 字節;一個 32 字節的消息變成了 52 個字節,填充後是 64 個字節。

對您所做聲明的一項更正:

即使不需要填充(我正在使用塊大小的消息)。

實際上,即使沒有添加 20 字節的 HMAC,您也始終必須添加至少一個字節的填充;如果預先添加的消息是 16 字節長的倍數,這意味著您需要添加完整的 16 字節填充。如果你加密一個 12 字節的消息(所以它在 HMAC 之後變成 32 字節),在填充之後變成 48 字節;如果沒有添加填充,那麼在解密時,將無法區分“這個解密的消息正好是 32 個字節長”和“這個解密的消息短於 32 個字節,並且添加了填充”

引用自:https://crypto.stackexchange.com/questions/44266