我收到以下异常(到目前为止只有Android 4.0.4):
java.security.NoSuchAlgorithmException: KeyGenerator AES implementation not found
at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:103)
这是我的代码:
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey confidentialityKey = keyGen.generateKey();
某些Android版本不支持128 AES吗?
答案 0 :(得分:0)
你真的不需要Java中的AES密钥工厂。 AES密钥只包含随机字节。这意味着您可以执行以下操作:
SecureRandom rng = new SecureRandom();
byte[] aesKeyData = new byte[128 / Byte.SIZE];
rng.nextBytes(aesKeyData);
SecretKey aesKey = new SecretKeySpec(aesKeyData, "AES");
// just to show it works
Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = new byte[aesCBC.getBlockSize()];
rng.nextBytes(iv);
aesCBC.init(Cipher.ENCRYPT_MODE, aesKey, new IvParameterSpec(iv));
唯一的问题是您不能以这种方式在硬件设备上生成AES密钥;为此你需要一个KeyFactory
。
如果你有一个需要密钥生成器的库,那么你最好安装Bouncy Castle或者 - 以避免命名冲突 - Spongy Castle。