这有什么问题?
for (Object obj : java.security.Security.getAlgorithms("Cipher")) {
System.out.println(obj);
}
javax.crypto.SecretKeyFactory.getInstance("AES");
这是输出(Mac OS 10.6上的JDK 1.6):
BLOWFISH
ARCFOUR
PBEWITHMD5ANDDES
RC2
RSA
PBEWITHMD5ANDTRIPLEDES
PBEWITHSHA1ANDDESEDE
DESEDE
AESWRAP
AES
DES
DESEDEWRAP
PBEWITHSHA1ANDRC2_40
java.security.NoSuchAlgorithmException: AES SecretKeyFactory not available
at javax.crypto.SecretKeyFactory.<init>(DashoA13*..)
at javax.crypto.SecretKeyFactory.getInstance(DashoA13*..)
...
答案 0 :(得分:5)
这是经过验证的java错误。见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7022467
编辑:不同的Java版本支持不同的算法,您也可以使用自定义提供程序扩展它等等。 Oracle在这里有一个java 6的列表http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html。对于KeyFactory,这是DSA。
答案 1 :(得分:4)
您实际上不需要使用SecretKeyFactory
。您可以使用以下内容创建AES密钥;
byte[] keyData = ........
SecretKeySpec key = new SecretKeySpec(keyData, "AES");
如果要进行基于密码的加密(PBE),则只需选择一种安全散列算法,该算法为您提供与所需密钥大小相同的散列。例如,如果您想要一个256位密钥用于AES,这里有一个构建密钥的方法;
private Key buildKey(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest digester = MessageDigest.getInstance("SHA-256");
digester.update(password.getBytes("UTF-8"));
byte[] key = digester.digest();
SecretKeySpec spec = new SecretKeySpec(key, "AES");
return spec;
}
修改强>
我建议不要使用MD5和DES,除非这是一个游戏项目,两者都有缺点并被认为是过时的。
答案 2 :(得分:2)
并非所有版本的Java都在其默认提供程序中为“AES”提供SecretKeyFactory
。
如果要生成新密钥,请从SecureRandom
实例中选择所需的位数(128,192或256),并使用该随机数初始化SecretKeySpec
实例。
如果您使用的是基于密码的加密,请为“PBKDF2WithHmacSHA1”算法创建SecretKeyFactory
,并使用它将SecretKeySpec
实例初始化为illustrated here.