Thực ra, tôi đã tìm kiếm rất nhiều từ internet và trong stackoverflow quá cho điều này,khối cuối cùng đầy đủ với CipherInputStream/CipherOutputStream, ngay cả với đệm AES/CBC/PKCS5Padding
Ban đầu tôi không sử dụng padding trong mã hóa và giải mã của tôi,
Nhưng Cuối cùng tôi có giải pháp từ đây
https://stackoverflow.com/a/10775577/1115788
và tôi cập nhật mã của tôi với đệm như AES/CBC/PKCS5Padding và lỗi tương tự là Comi ng, và khối cuối cùng không được giải mã ...
Tôi đang làm việc về vấn đề này cho hai ngày cuối cùng, nhưng không có giải pháp tìm thấy
Mã Crypter tôi:
package mani.droid.browsedropbox;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Crypter {
Cipher encipher;
Cipher decipher;
CipherInputStream cis;
CipherOutputStream cos;
FileInputStream fis;
byte[] ivbytes = new byte[]{(byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o', (byte)'p'};
IvParameterSpec iv = new IvParameterSpec(ivbytes);
public boolean enCrypt(String key, InputStream is, OutputStream os)
{
try {
byte[] encoded = new BigInteger(key, 16).toByteArray();
SecretKey seckey = new SecretKeySpec(encoded, "AES");
encipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
encipher.init(Cipher.ENCRYPT_MODE, seckey, iv);
cis = new CipherInputStream(is, encipher);
copyByte(cis, os);
return true;
}
catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
public boolean deCrypt(String key, InputStream is, OutputStream os)
{
try {
byte[] encoded = new BigInteger(key, 16).toByteArray();
SecretKey seckey = new SecretKeySpec(encoded, "AES");
encipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
encipher.init(Cipher.DECRYPT_MODE, seckey, iv);
cos = new CipherOutputStream(os, encipher);
copyByte(is, cos);
//cos.close();
return true;
}
catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
public void copyByte(InputStream is, OutputStream os) throws IOException
{
byte[] buf = new byte[8192];
int numbytes;
while((numbytes = is.read(buf)) != -1)
{
os.write(buf, 0, numbytes);
os.flush();
}
os.close();
is.close();
}
}
là phần còn lại của văn bản mật mã ok? Các dòng đầu vào mã hóa có thói quen đáng ghét là xáo trộn các ngoại lệ bên dưới thảm, bao gồm cả các trường hợp của 'BadPaddingException'. –
Kiểm tra kích thước của tệp (?) Bạn đang viết và đảm bảo rằng bạn đang viết mọi thứ đúng cách. –
@owlstead phần còn lại của mật mã là giải mã hoàn hảo, nhưng khối cuối cùng bị thiếu, để kiểm tra mã tôi đã in 'numbytes' trong' copyByte', kết quả là khi mã hóa, tất cả các khối được đọc, 16 bit ngay cả lần cuối cùng chưa hoàn thành khối, nhưng để giải mã giá trị khối cuối cùng không phải là 16, nhỏ hơn 16 ..., Vì vậy, tôi đoán là, đệm của nó với null hoặc 0, do đó, khối đọc đầy đủ tại thời điểm mã hóa, vì vậy kích thước tệp được mã hóa giống như kích thước tệp gốc của tôi không nhiều trong 16byte ... – Mani