我目前正在研究我的Raspberry Pi和我的Android設備之間的連接。 這個連接是用blowfish加密的,似乎可以在較小的尺寸下正常工作(通常低於1 kB)。在下一步中,我嘗試從我的Pi發送一張照片到我的設備,該設備應該被加密。我的設備拋出異常javax.crypto.BadPaddingException: pad block corrupted
,經過一些調試後,我發現大約90%的數據傳輸被設置爲零(使用大小爲2444368的數組進行測試,在位置212536之後所有數據都爲零)。Android - 流不能正確讀取數組
我的第一個猜測是Android無法爲我的陣列分配足夠的內存,但因爲沒有任何異常告訴我,所以我告訴Android,我的應用程序通過largeHeap=true
使用很多內存,這不是問題了。這可能是因爲我對Android的工作方式不夠了解,所以我想請你幫助我。有問題的零部件(EncryptionUtil沒有顯示,這不是問題的一部分):
客戶端:
public final byte[] readWithAppend() throws IOException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException{
byte[] b = new byte[read()]; //works fine, tells me the size of the array
System.out.println("Trying to read an array with the size " + b.length);
in.read(b,0,b.length);//No Exception here, so allocation works
if(b.length >= 10000){ //Just some debug for me to compare both sides, server and client.
File f;
FileOutputStream out = new FileOutputStream(f = new File(debugFile,EncryptionUtil.randomString(80)));
System.out.println("PATH: " + f);
out.write(b);out.close();
}
System.out.println("After position " + searchPos(b) + " everything is 0 ?!?!?");
b = EncryptionUtil.decrypt(enc, b, sessionKey); //The Exception gets thrown here.
return b;
}
private int searchPos(byte[] b){
int pos = b.length;
for(int i = b.length-1;i >= 0;i--){
if(b[i] != 0)return pos;
else pos--;
}
return pos;
}
Serverside集團:
private final void write(byte[] b,int off,int len,boolean appendLength) throws IOException{
try {
byte[] b2;
if(len != b.length || off != 0){ //Just ignore this case
byte[] buffer = new byte[len-off];System.arraycopy(b, off, buffer, 0, len);
b2 = EncryptionUtil.encrypt(enc, buffer, sessionKey);
}else{ //This is the case we have to look at
b2 = EncryptionUtil.encrypt(enc, b, sessionKey);
System.out.println("Sending an array with the size " + b2.length);
System.out.println("Decrypting to check for mistakes");
EncryptionUtil.decrypt(SymmetricEncryption.Blowfish, b2, sessionKey); //Debug.
if(b2.length >= 10000){ //Again, debug to compare the both files
FileOutputStream out2 = new FileOutputStream(new File("serverFile"));
out2.write(b2);out2.close();
}
}
if(appendLength)write(b2.length); //Works as well
System.out.println("Length: " + b2.length + "; only writing: " + ((int)len/b.length)*b2.length);// it writes everything.
out.write(b2,0,((int)len/b.length)*b2.length); //The flush part happens somewhere else.
} catch (InvalidKeyException | NoSuchAlgorithmException| NoSuchPaddingException | IllegalBlockSizeException| BadPaddingException e) {
e.printStackTrace();
//throw new IOException(e.getMessage());
}
}
我知道,它需要一些時間來工作到我的代碼,但我會很感激,如果你能幫助我。
編輯: 關於EncryptionUtil
public static final byte[] encrypt(final SymmetricEncryption enc,final byte[] content,final SecretKey key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
final Cipher cipher = Cipher.getInstance(enc.toString());
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(content);
}
public static final byte[] decrypt(final SymmetricEncryption enc,final byte[] text,final SecretKey key) throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException {
final Cipher cipher = Cipher.getInstance(enc.toString());
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(text);
}
更多的測試後的代碼我發現這些數據不會被我的樹莓派發送正確的,所以我想在現在的塊發送。
我猜你的加密有問題 – rainash
我正在使用'Blowfish/CBC/PKCS5Padding'進行加密,加密本身是通過Java提供的Ciper類進行的,沒有增加。看起來,Android將給定位置後的所有內容都設置爲零。 – Ch4t4r
什麼是'','read()'做了什麼? 'in.read()'中沒有分配,緩衝區在這個階段已經被分配了。 –