java - AES - 保证 Java (Android) 支持?

标签 java android encryption aes

如果每个 Java 平台实现也必须附带 AES 实现,我找不到任何地方。

我想在 Android 上使用以下代码:

 SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
 Cipher cipher = Cipher.getInstance("AES");
 cipher.init(Cipher.DECRYPT_MODE, skeySpec);
 decrypted = cipher.doFinal(encryptedData);

但是,我找不到是否保证会实现“AES”(如“SHA-1”算法保证在每个 Java 平台上都根据此引用实现:

“Java 平台的每个实现都需要支持以下标准 MessageDigest 算法: MD5 SHA-1 SHA-256”

(字体:http://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html)。

有人知道 AES 实现是否保证随 Java(或什至 Android,这是我想使用它的地方)一起提供吗?

最佳答案

对于 Java,请查看 Cipher JCA 标准名称的一部分。它将 AES 列为标准加密算法之一。另请查看 Implementation同一文档的各个部分。在那里,它列出了所有 Java 运行时所需的最少加密转换。该列表包括:

  • AES/CBC/NoPadding (128)
  • AES/CBC/PKCS5Padding (128)
  • AES/ECB/NoPadding (128)
  • AES/ECB/PKCS5Padding (128)

因此,AES 保证在 CBC 或 ECB 模式下使用 PKCS5 或无填充得到支持。保证支持的唯一 key 大小是 128 位。

现在,Android 在技术上不是 Java 运行时,因此不受 JCA 要求的约束。但是,AES 很可能在一种或另一种模式下受支持,因为它作为示例包含在 Android's API documentation 中。 .要获取可用加密转换的完整列表,请使用以下代码:

public void ListSupportedAlgorithms() {
String result = "";

// get all the providers
Provider[] providers = Security.getProviders();

for (int p = 0; p < providers.length; p++) {
    // get all service types for a specific provider
    Set<Object> ks = providers[p].keySet();
    Set<String> servicetypes = new TreeSet<String>();
    for (Iterator<Object> it = ks.iterator(); it.hasNext();) {
        String k = it.next().toString();
        k = k.split(" ")[0];
        if (k.startsWith("Alg.Alias."))
            k = k.substring(10);

        servicetypes.add(k.substring(0, k.indexOf('.')));
    }

    // get all algorithms for a specific service type
    int s = 1;
    for (Iterator<String> its = servicetypes.iterator(); its.hasNext();) {
        String stype = its.next();
        Set<String> algorithms = new TreeSet<String>();
        for (Iterator<Object> it = ks.iterator(); it.hasNext();) {
        String k = it.next().toString();
        k = k.split(" ")[0];
        if (k.startsWith(stype + "."))
            algorithms.add(k.substring(stype.length() + 1));
        else if (k.startsWith("Alg.Alias." + stype +"."))
            algorithms.add(k.substring(stype.length() + 11));
    }

    int a = 1;
    for (Iterator<String> ita = algorithms.iterator(); ita.hasNext();) {
        result += ("[P#" + (p + 1) + ":" + providers[p].getName() + "]" +
                   "[S#" + s + ":" + stype + "]" +
                   "[A#" + a + ":" + ita.next() + "]\n");
        a++;
    }

    s++;
}
}

(从 Android Encryption with the Android Cryptography API 复制)

该列表中应该有几个 AES 转换。

关于java - AES - 保证 Java (Android) 支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18863322/

相关文章:

java - 无法结束我的 Android 应用程序

java - Jenkins Android 库 - 不支持的 Major.minor 版本 51.0

android - 如何在android中的 float 操作栏(fab)上放置文本,让操作栏是购物车,文本是项目数量

encryption - 使用 erlang + RSA 解密字符串

java - 从 JInternalFrame 调用 JFrame 的方法?

windows - 构建 OpenJDK - Corba 问题

java - 在 JNI 和 C 中释放持久数组

android - 使用 android studio 将我的项目连接到 gitlab

python - 解密 SSL 预主 key

c# - 在 Internet 中加密并在专用网络中解密的最佳方法是什么?