我想在我的代码中使用经过身份验证的加密。根据JDK,似乎 java 7支持AES / GCM / NoPadding 。
但是,我使用以下代码收到以下错误。
错误:
java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/GCM/NoPadding
at javax.crypto.Cipher.getInstance(Cipher.java:524)
at CipherService.main(CipherService.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
代码:
Cipher c = Cipher.getInstance ("AES/GCM/NoPadding");
final int blockSize = c.getBlockSize();
final byte[] ivData = new byte[blockSize];
final SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG");
rnd.nextBytes(ivData);
GCMParameterSpec params = new GCMParameterSpec(blockSize * Byte.SIZE, ivData);
SecureRandom sr = new SecureRandom();
byte[] aesKey = new byte[KEY_SIZE];
byte[] ciphertext;
byte[] head = "Head".getBytes();
byte[] data = "Data".getBytes();
sr.nextBytes(aesKey);
SecretKeySpec sks = new SecretKeySpec(aesKey, "AES");
c.init(Cipher.ENCRYPT_MODE, sks, params);
c.updateAAD(head);
ciphertext = c.doFinal(data);
答案 0 :(得分:3)
总之,你不能(正如Brett Pyke所说)。因为SunJCE加密提供程序(和Oracle)不包含AES / GCM实现。值得庆幸的是,它们至少包含了GCMParameterSpec。
您唯一的两个选项(AFAIK)是加密提供商BouncyCastle和IAIK。
编辑/更新:Oracle JDK-8似乎提供了AES / GCM的工作实现。
答案 1 :(得分:0)
您需要使用BouncyCastle等加密提供程序。在上下文中注册后,您应该可以使用任何支持的算法。您的另一个选择是使用内置的Sun / Oracle提供的,但这违反了Java的要点,能够在任何JVM上运行应用程序。