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」が実装されることが保証されているかどうかはわかりません (「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 に付属している場合でも) を知っている人はいますか?

4

1 に答える 1

3

Java については、JCA 標準名のCipherセクションを参照してください。標準の暗号化アルゴリズムの 1 つとして AES がリストされています。同じドキュメントの実装セクションも参照してください。そこには、すべての Java ランタイムに必要な最小限の暗号化変換がリストされています。リストには次のものが含まれます。

  • AES/CBC/NoPadding (128)
  • AES/CBC/PKCS5パディング (128)
  • AES/ECB/NoPadding (128)
  • AES/ECB/PKCS5パディング (128)

したがって、AES は、PKCS5 またはパディングなしの CBC または ECB モードでサポートされることが保証されています。サポートが保証されている唯一のキー サイズは 128 ビットです。

現在、Android は技術的には Java ランタイムではないため、JCA 要件に拘束されていません。ただし、 Android の API ドキュメントに例として含まれているため、AES はいずれかのモードでサポートされている可能性があります。使用可能な暗号化変換の完全なリストを取得するには、次のコードを使用します。

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 暗号化 API を使用した Android 暗号化からコピー)

そのリストには、いくつかの AES 変換が含まれているはずです。

于 2013-09-18T03:56:45.940 に答える