3

如果每个 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”(如保证在每个 Java 平台上实现“SHA-1”算法,根据此引用:

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

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

有谁知道 AES 实现是否保证随 Java 提供(甚至是 Android,这是我想使用它的地方)?

4

1 回答 1

3

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

  • AES/CBC/NoPadding (128)
  • AES/CBC/PKCS5Padding (128)
  • AES/ECB/无填充 (128)
  • AES/ECB/PKCS5 填充 (128)

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

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

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 Cryptography API 从 Android Encryption复制)

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

于 2013-09-18T03:56:45.940 回答