Java,解码AES-256时出错

标签 java android cryptography aes

我在解密时收到一个错误:(javax.crypto.BadPaddingException: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt)

我的代码加密/解密:

private static byte[] password = null; //  this.password = editText.getBytes();
static final byte[] ivBytes = {'6','g','6','o','d','a','0','u','4','n','w','i','6','9','i','j'};

public static byte[] encrypt(String text) throws Exception {
    byte[] clear = text.getBytes("UTF-8");
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
    sr.setSeed(password);
    kgen.init(256, sr); // 192 and 256 bits may not be available
    SecretKey skey = kgen.generateKey();
    byte[] key = skey.getEncoded();

    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
    byte[] encrypted = cipher.doFinal(clear);
    return encrypted;
}

public static String decrypt(byte[] encrypted) throws Exception {
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
    sr.setSeed(password);
    kgen.init(256, sr); // 192 and 256 bits may not be available
    SecretKey skey = kgen.generateKey();
    byte[] key = skey.getEncoded();

    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
    String decrypted = new String(cipher.doFinal(encrypted));
    return decrypted;
}

我怀疑这个bug是generateKey。

最佳答案

你做错了两件事:

  • 通过使用 key 为 PRNG 播种来从密码生成 key 不是一个好主意。请改用基于密码的加密。 Java 有一个 PKCS#5 的实现,它将根据密码生成一个 key 。

  • 您需要为每次加密使用新的强随机 IV:

    • 加密时,不要在 cipher.init() 中指定 IV。将为您生成一个新的。
    • encrypt() 需要将 IV (cipher.getIV()) 和密文序列化为字节数组。
    • decrypt():将 IV 与密文分开,从中构建 IvParameterSpec 并像您目前所做的那样输入 cipher.init()。

关于Java,解码AES-256时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22427479/

相关文章:

java - 根据对象将对象转换为 JSONObject 或 JSONArray 的方法

android - 如何配置 LongClick 的响应时间?

android - 更新应用程序后如何在后台运行服务

python - 有谁有 Google App Engine 上 python 中 AES 加密的代码示例吗?

java - 使用 Java 在 Android 上解密 OpenSSL 加密的文件

java - Spring Boot中slf4j的正确配置是什么

java - java.lang.Thread.State : WAITING (parking) 90%线程解析

java - 如何使用 .bat 在 mac 中启动 appium desktop 1.6.1

java - 如何从诺基亚 S40 设备读取 RMS 文件?

.net - 哈希算法实现