java – BouncyCastle GCM / CCM ArrayIndexOutOfBoundsException
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – BouncyCastle GCM / CCM ArrayIndexOutOfBoundsException,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3760字,纯文字阅读大概需要6分钟。
内容图文
![java – BouncyCastle GCM / CCM ArrayIndexOutOfBoundsException](/upload/InfoBanner/zyjiaocheng/816/291338fab1794400827a033877ef276c.jpg)
任何人都可以举个例子,在BouncyCastle中使用带有AES的GCM和/或CCM模式吗?
我的代码是这样的:
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
byte[] block = new byte[1048576];
int i;
long st,et;
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
BufferedInputStream bIn=new BufferedInputStream(new ProgressMonitorInputStream(null,"Encrypting ...",new FileInputStream("input")));
CipherInputStream cIn = new CipherInputStream(bIn, cipher);
BufferedOutputStream bOut=new BufferedOutputStream(new FileOutputStream("output.enc"));
int ch;
while ((i = cIn.read(block)) != -1) {
bOut.write(block, 0, i);
}
cIn.close();
bOut.close();
Thread.sleep(5000);
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
BufferedInputStream fis=new BufferedInputStream(new ProgressMonitorInputStream(null,"Decrypting ...",new FileInputStream("output.enc")));
//FileInputStream fis=new FileInputStream("output.enc");
//FileOutputStream ro=new FileOutputStream("regen.plain");
BufferedOutputStream ro=new BufferedOutputStream(new FileOutputStream("regen.plain"));
CipherInputStream dcIn = new CipherInputStream(fis, cipher);
while ((i = dcIn.read(block)) != -1) {
ro.write(block, 0, i);
}
dcIn.close();
ro.close();
但是在GCM模式下解密时会抛出此异常(第70行是bOut.write(block,0,i);):
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at org.bouncycastle.crypto.modes.CCMBlockCipher.processPacket(Unknown Source)
at org.bouncycastle.crypto.modes.CCMBlockCipher.doFinal(Unknown Source)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$AEADGenericBlockCipher.doFinal(Unknown Source)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at javax.crypto.CipherInputStream.a(DashoA13*..)
at javax.crypto.CipherInputStream.read(DashoA13*..)
at javax.crypto.CipherInputStream.read(DashoA13*..)
at enctest.Main.main(Main.java:70)
在CCM模式下加密时出现此异常(第70行是bOut.write(block,0,i);):
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at org.bouncycastle.crypto.modes.CCMBlockCipher.processPacket(Unknown Source)
at org.bouncycastle.crypto.modes.CCMBlockCipher.doFinal(Unknown Source)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$AEADGenericBlockCipher.doFinal(Unknown Source)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at javax.crypto.CipherInputStream.a(DashoA13*..)
at javax.crypto.CipherInputStream.read(DashoA13*..)
at javax.crypto.CipherInputStream.read(DashoA13*..)
at enctest.Main.main(Main.java:70)
解决方法:
对于CCM模式,有一点障碍:IV的大小应小于块大小.您的代码在以下内容崩溃:
BlockCipher ctrCipher = new SICBlockCipher(cipher);
byte[] iv = new byte[blockSize];
byte[] out;
iv[0] = (byte)(((15 - nonce.length) - 1) & 0x7);
System.arraycopy(nonce, 0, iv, 1, nonce.length);
尝试使用15字节的“IV”(IV实际上是NONCE,但IvParameterSpec用于NONCE).
另一个问题是,当CipherInputStream无法从底层流中检索任何数据时,以及调用close()时,都会调用cipher.doFinal()方法.请注意,CipherInputStream是一个编写得非常糟糕的类,它在抛出时也会删除BadPaddingException – 这是标记验证失败时获得的异常(!!!).你最好根据CipherInputStream创建自己的一个.我已经更改为代码以抛出特定的基于IOException的异常而不是忽略异常,并保持一个布尔状态以查看是否已在底层密码上执行了doFinal().它不应该两次调用doFinal().
所以你在这里运行Java JCE错误.我可能会把它放在Oracle错误数据库中,直到现在我的所有错误报告都被完全忽略了.
测试了最新版本的OpenJDK 7和Bouncy Castle 1.47(2012-08-30或接近的东西).
内容总结
以上是互联网集市为您收集整理的java – BouncyCastle GCM / CCM ArrayIndexOutOfBoundsException全部内容,希望文章能够帮你解决java – BouncyCastle GCM / CCM ArrayIndexOutOfBoundsException所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。