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 変換が含まれているはずです。