BouncyCastle GCM/CCM Exceprion in JAVA

Posted by 4r1y4n on Stack Overflow See other posts from Stack Overflow or by 4r1y4n
Published on 2012-09-01T03:33:20Z Indexed on 2012/09/01 3:37 UTC
Read the original article Hit count: 885

Filed under:
|
|
|
|

can anyone give me an example for using GCM and/or CCM modes with AES in BouncyCastle?
My code is this:

    SecretKeySpec   key = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
    Cipher          cipher = Cipher.getInstance("AES/AEAD/PKCS5Padding", "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();

but it throws this exception when decrypting in GCM mode (line 70 is 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)

And this Exception when encrypting in CCM mode (line 70 is 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)

© Stack Overflow or respective owner

Related posts about java

Related posts about cryptography