在Android 7和8中出现javax.crypto.BadPaddingException填充块损坏问题的原因是由于在这些Android版本中,对于AES/CBC/PKCS7Padding模式的加密和解密操作,需要手动指定填充块的方式。
以下是解决该问题的代码示例:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class CryptoUtils {
private static final String AES_ALGORITHM = "AES/CBC/PKCS7Padding";
private static final String AES_KEY = "Your_Aes_Key";
private static final String AES_IV = "Your_Aes_IV";
public static String encrypt(String data) throws Exception {
Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
SecretKeySpec keySpec = new SecretKeySpec(AES_KEY.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(AES_IV.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
return Base64.encodeToString(encryptedBytes, Base64.DEFAULT);
}
public static String decrypt(String encryptedData) throws Exception {
Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
SecretKeySpec keySpec = new SecretKeySpec(AES_KEY.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(AES_IV.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] encryptedBytes = Base64.decode(encryptedData, Base64.DEFAULT);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes);
}
}
在上面的代码示例中,AES_ALGORITHM为"AES/CBC/PKCS7Padding",AES_KEY和AES_IV是加密和解密操作所需的密钥和初始化向量。在实际使用时,请替换为您自己的密钥和初始化向量。
您可以使用上述代码示例中的encrypt方法进行加密,使用decrypt方法进行解密。如果仍然出现javax.crypto.BadPaddingException填充块损坏问题,请确保所使用的密钥和初始化向量与加密时使用的密钥和初始化向量相匹配。