java AES加密遇到的一些问题

java AES加密遇到的一些问题

AES加密工具类见:https://github.com/scottyab/AESCrypt-Android/blob/master/aescrypt/src/main/java/com/scottyab/aescrypt/AESCrypt.java

1.Android支持PKCS7Padding填充方式,而java默认支持PKCS5Padding,

报错:java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding

解决方法:
1.通过BouncyCastle组件来让java里面支持PKCS7Padding填充,BouncyCastle组件下载链接:http://www.bouncycastle.org/
2.

public static byte[] encrypt(final SecretKeySpec key, final byte[] iv, final byte[] message)
        throws GeneralSecurityException {

    IvParameterSpec ivSpec = new IvParameterSpec(iv);

    /**
     * 这个地方调用BouncyCastleProvider
     *让java支持PKCS7Padding
     */
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

    final Cipher cipher = Cipher.getInstance(AES_MODE);
    cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
    byte[] cipherText = cipher.doFinal(message);

    log("cipherText", cipherText);

    return cipherText;
}

2.java.security.InvalidKeyException: Illegal key size

原来是jdk不兼容的问题,我本地以及同事的测试环境都是jdk1.7,而我搭建的环境用的是jdk1.8
解决方案如下:
处理办法: 在官方网站下载JCE无限制权限策略文件
JDK7的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html 
下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt
如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件
如果安装了JDK,还要将两个jar文件也放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AES (Advanced Encryption Standard) 解密时出现 "final block not properly padded" 错误通常是因为数据在加密后没有按照规定的填充模式正确处理。AES 加密过程中,如果数据块长度不是16字节的倍数,就需要进行填充以达到块大小。常见的填充模式有 PKCS7,其中会在剩余空间中填充1到16个字节的0,最后一位会是填充的字节数。 当解密时,如果接收到的最终块没有按预期的填充规则,就会抛出这个错误。在Java中,使用Bouncy Castle或Java Cryptography Extension (JCE) 库进行AES解密时,可以遇到这种情况。 以下是一个简单的例子,展示了如何处理这个错误: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.security.Key; import java.security.Security; import java.util.Base64; Security.addProvider(new BouncyCastleProvider()); public class AESDecryption { private static final String KEY = "your_secret_key"; // 用实际密钥替换 public static void main(String[] args) { try { String encryptedData = "base64_encoded_encrypted_data"; // 假设是从Base64解码得到的 byte[] keyBytes = KEY.getBytes(); Key key = new SecretKeySpec(keyBytes, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC"); cipher.init(Cipher.DECRYPT_MODE, key); byte[] iv = getIvFromSomewhere(); // 获取CBC模式的初始化向量 cipher.updateAAD(new byte[] {0x01}); // 有时候可能需要提供额外的认证数据,这取决于加密时的情况 byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData)); if (cipher.getOutputSize(decryptedData.length) == decryptedData.length) { // 检查是否是正确的解密结果 System.out.println("Decrypted data: " + new String(decryptedData)); } else { throw new RuntimeException("Invalid padding or final block error"); } } catch (Exception e) { e.printStackTrace(); // 这里捕获并处理特定的PaddingException,因为可能是由于填充错误 if (e instanceof PaddingException) { throw new RuntimeException("Final block not properly padded: " + e.getMessage()); } else { throw e; } } } private static byte[] getIvFromSomewhere() { // 实现从存储或上下文中获取初始化向量的方法 // 假设iv已知 return new byte[] {0x00, 0x01, ...}; } } ``` 确保在使用`Cipher.updateAAD`或`Cipher.getIV`之前,你已经正确地获取了初始化向量(IV)和任何附加的认证数据(如`Cipher.updateAAD`中的数据)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值