2

我想在我的代码中使用经过身份验证的加密。根据 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);
4

2 回答 2

3

简而言之,你不能(正如布雷特派克所说)。因为 SunJCE 加密提供者(和 Oracle)不包括 AES/GCM 实现。值得庆幸的是,它们至少包含 GCMParameterSpec。

您仅有的两个选择 (AFAIK) 是加密提供商BouncyCastleIAIK

编辑/更新:Oracle JDK-8 似乎提供了 AES/GCM 的工作实现。

于 2013-11-18T02:13:10.623 回答
0

您需要使用像BouncyCastle这样的加密提供程序。一旦你在你的上下文中注册它,那么你应该能够使用任何支持的算法。您的另一个选择是使用内置的 Sun/Oracle 提供的,但这违反了 Java 的要点,能够在任何 JVM 上运行应用程序。

于 2013-08-23T06:36:56.100 回答