Java 7中经过身份验证的加密

时间:2013-08-23 06:31:30

标签: java encryption-symmetric

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

2 个答案:

答案 0 :(得分:3)

总之,你不能(正如Brett Pyke所说)。因为SunJCE加密提供程序(和Oracle)不包含AES / GCM实现。值得庆幸的是,它们至少包含了GCMParameterSpec。

您唯一的两个选项(AFAIK)是加密提供商BouncyCastleIAIK

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

答案 1 :(得分:0)

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