10

我在一个 android 应用程序和一个独立的 java 应用程序中使用以下内容:

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(clear);
    ...

我在 android 和我的独立 java 应用程序上得到不同的加密字符串(都使用相同的代码和密钥)。我得到了与这个问题相同的异常(javax.crypto.BadPaddingException:Blocktype mismatch:0):

RSA 加密:Java 和 Android 的区别

建议的解决方案是指定填充策略,例如:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

但我使用的是“AES”,而不是“RSA”,并且不确定如何结合 AES 指定填充。在这种情况下,我将如何构造传递给 Cipher.getInstance() 的字符串?我试了一下:

Cipher cipher = Cipher.getInstance("AES/PKCS1Padding");

但得到一个关于无效的例外。

谢谢

4

3 回答 3

6

另一个“简短回答”,但我相信 AES-GCM 比 CBC 模式更安全,并且已经存在了几年,但是如果你想在 Android 中使用,你需要包括spongycastle

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
于 2013-11-08T16:56:26.457 回答
4

Short answer:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

Long Answer

于 2013-02-04T21:57:41.387 回答
2

我是这样做的:

keyGenerator.init(new
                KeyGenParameterSpec.Builder(KEY_NAME,
                KeyProperties.PURPOSE_ENCRYPT |
                        KeyProperties.PURPOSE_DECRYPT)
                .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                .setUserAuthenticationRequired(true)
                .setEncryptionPaddings(
                        KeyProperties.ENCRYPTION_PADDING_PKCS7)
                .build());

cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);
于 2017-02-24T09:34:16.503 回答