簡體   English   中英

在PC和Android之間發送加密數據時,AES / CTR / NoPadding最后一塊丟失

[英]AES/CTR/NoPadding last block is lost when sending encrypted data between PC and Android

我正在使用AES / CTR / NoPadding算法來加密通過PC和Android之間的套接字發送的數據。

我編寫了單元測試,它向Android設備發送[1; 512]字節並接收回相同的數據-echo服務。 收到的數據必須等於發送的數據。

測試客戶:

for (int n = 1; n <= 512; n++) {
... skip ...
    try {
        Object connection = socketFilter.openConnection(socket);
        in = new CipherInputStream(socket.getInputStream(), encryptor);
        out = new CipherOutputStream(socket.getOutputStream(), decryptor);

        byte buf[] = new byte[n];
        byte received[] = new byte[n];

        TestUtils.numbers(buf);

        out.write(buf, 0, buf.length);
        socket.shutdownOutput();

        int len = in.read(received, 0, received.length);

        if (buf.length != len) {
            System.err.println("Expected: " + buf.length + " but was: " + len);
        }
    }
    finally {
        ... skip close streams ... 
    }

}

回聲服務器:

Socket clientSocket = socket.accept();
CipherInputStream in = new CipherInputStream(clientSocket.getInputStream(), decryptor);
CipherOutputStream out = new CipherOutputStream(clientSocket.getOutputStream(), encryptor);

try {
    byte buf[] = new byte[512];
    int len;

    if ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
        out.close();
    }
}
finally {
    in.close();
    out.close();
}

我用localhost測試了此代碼-一切正常。

當我使用Android設備對其進行測試時,如果未滿,則會丟失最后一個塊。 因此,如果它是30個字節,則僅接收到16個字節。

來自測試的消息:

... skip ...
Expected: 30 but was: 16
Expected: 31 but was: 16
Expected: 33 but was: 32
... skip ...
Expected: 207 but was: 192
Expected: 209 but was: 208
Expected: 210 but was: 208
... skip ...

有什么事嗎

似乎該問題是由於Android和Hotspot JVM使用不同的密碼提供程序這一事實引起的。

Android使用一個叫做Bouncy Castle的城堡,該城堡在AES / CTR模式下具有一個已知的“錯誤”。 進行加密/解密時,它將錯過最后一個塊。 (請參閱其他許多stackoverflow問題)

如果只需要點擊率模式。 已知的解決方法是,您可以在Android上自己實現它,方法是“動態”重復生成密鑰流塊(通過加密0的字節數組),然后將它們與緩沖區進行XOR。

希望這可以幫助

在關閉加密流之前,您是否已完全清除它們? AES以塊大小的塊處理數據,在CTR模式下,它是密鑰流。 如果在關閉流之前沒有完全刷新流,則無論是加密還是解密,您都可能會丟失最后一個塊。

同樣,您需要確保已編寫/讀取了Android和PC之間傳輸文件流中的所有內容。 您的最后幾條數據可能已經放在文件傳輸緩沖區中,而該緩沖區關閉時,該緩沖區正等待寫入。

Android確實與Java不同,因此我懷疑您的錯誤可能是在Android方面。 也許嘗試Android-> Android以及PC-> PC,只是為了確保Android方面的一切都很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM