什么“SecretKeyFactory不可用”的意思?

这有什么问题?

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.(DashoA13*..) at javax.crypto.SecretKeyFactory.getInstance(DashoA13*..) ... 

这是一个经过validation的java bug。 请参见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。

你真的不需要使用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,除非这是一个游戏项目,两者都有缺点并被认为是过时的。

并非所有版本的Java都在其默认提供程序中为“AES”提供SecretKeyFactory

如果要生成新密钥,请从SecureRandom实例中选择所需的位数(128,192或256),并使用该随机数初始化SecretKeySpec实例。

如果您使用基于密码的加密,请为“PBKDF2WithHmacSHA1”算法创建SecretKeyFactory ,并使用它来初始化SecretKeySpec实例,如此处所示。