![](/img/trans.png)
[英]Problem with decryption , cipher in 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.