我找不到任何地方是否每个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).
有人知道Java是否可以保证AES实现(甚至是Android,我想在哪里使用它)?
解决方法:
对于Java,请查看JCA标准名称的Cipher部分.它列出了AES作为标准加密算法之一.还要查看同一文档的Implementation部分.其中列出了所有Java运行时所需的最小加密转换.该列表包括:
> AES / CBC /无填充(128)
> AES / CBC / PKCS5填充(128)
> AES / ECB /无填充(128)
> AES / ECB / PKCS5填充(128)
因此,可以保证在CBC或ECB模式下使用PKCS5或不使用填充都支持AES.保证支持的唯一密钥大小是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转换.