java - AES密文不同

标签 java android cryptography aes bouncycastle

我在 Android 和 Java servlet 环境中使用 AES 加密和充气城堡实现。加密部分在这两种情况下都可以。然而,一旦我使用相同的 key 加密相同的文本,我会在这两个平台上得到不同的结果。

我的目的是在Android中进行加密并在Web环境中进行解密。

这是我对 Android AES 实现所做的唯一更改。

    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = null;
    if (android.os.Build.VERSION.SDK_INT >= JELLY_BEAN_4_2) {
        sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
    } else {
        sr = SecureRandom.getInstance("SHA1PRNG");
    }
    sr.setSeed(key);
    kgen.init(128, sr);
    SecretKey skey = kgen.generateKey();
    byte[] raw = skey.getEncoded();

上面我只是将 Crypto 添加到 get 实例中。

我也使用了海绵城堡实现来看看我是否可以实现这一点。尽管如此,它还是给了我与 Android 相同的结果。不确定我是否正确加载了它。我在 API 级别 14 和 17 上对此进行了测试。

这会导致 javax.crypto.BadPaddingException:填充 block 损坏。

最佳答案

对于引用此线程的任何人,这是我对代码所做的更改。目前在Android和服务器环境下运行良好。

答案取自,

Android 4.2 broke my encrypt/decrypt code and the provided solutions don't work

谢谢@kroot

    /* Store these things on disk used to derive key later: */
    int iterationCount = 1000;
    int saltLength = 32; // bytes; should be the same size as the output
                            // (256 / 8 = 32)
    int keyLength = 256; // 256-bits for AES-256, 128-bits for AES-128, etc
    byte[] salt = new byte[saltLength]; // Should be of saltLength

    /* When first creating the key, obtain a salt with this: */
    SecureRandom random = new SecureRandom();
    random.nextBytes(salt);

    /* Use this to derive the key from the password: */
    KeySpec keySpec = new PBEKeySpec(new String(key,
            Constants.CHAR_ENCODING).toCharArray(), key, iterationCount,
            keyLength);
    SecretKeyFactory keyFactory = SecretKeyFactory
            .getInstance("PBEWithSHA256And256BitAES-CBC-BC");
    byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
    SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");

    return secretKey.getEncoded();

关于java - AES密文不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14886250/

相关文章:

android - 回收具有不同行布局的 ListView 行

c - 如何在C上做输入输出文件?

c# - HMACSHA256 和 HMACSHA512 之间的区别

android - Kotlin-多个动画同时出现和/或互相重复

c# - C、C#文件加密方法及具体解决办法

java - Android中可以根据不同的状态条件显示不同的布局组件吗?

java - 自定义 JSpinner

java - 设置Spring Boot可执行jar的工作目录

java - 迭代器模式是否违反得墨忒耳定律? (最少知识原则)

android - Android在WebView请求上加上X-Requested-With有什么好处?