我的问题是我需要保留信息流,这些信息流需要作为文件中加密的字节数组来保存。为此,我使用AES算法,因为我希望它是实时的并且需要速度。但是当我在移动设备上运行它时,出现了以下错误:
0606506D:数字信封例程:EVP_DecryptFinal_ex:错误的最终版本 块长
但是,如果我在NetBeans这样的另一种想法中尝试它,则不会给我任何错误。有人可以告诉我我的代码有什么问题,或者如何在Android上正确加密。
如果我使用注释的代码,我也会收到相同的错误
public class AESCrypt {
private SecretKey secret;
private final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
private final byte[] salt = new byte[]{82, -20, 113, 27, 6, 52, 124, -13};
private final byte[] iv = {-66, 11, -122, -68, -54, -102, 123, -29, 107, 109, -1, 44, -125, 25, 5, -109};
public AESCrypt(String pass) throws Exception {
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
sha256.update(pass.getBytes("UTF-8"));
byte[] digest = sha256.digest();
byte sec[] = new byte[32];
System.arraycopy(digest, 0, sec, 0, sec.length);//primeros length bytes del sha-256
secret = new SecretKeySpec(sec, "AES");
/*SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(pass.toCharArray(), salt, 65536, 128);
SecretKey tmp = factory.generateSecret(spec);
secret = new SecretKeySpec(tmp.getEncoded(), "AES");*/
}
public byte[] encrypt(byte[] arr) throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(iv));
return cipher.doFinal(arr);
}
public byte[] decrypt(byte[] arr) throws Exception {
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
return cipher.doFinal(arr);
}
}