Hello, I am trying to encrypt a String using Symmetric Key Cryptography. When I try to encrypt the string, on runtime it gives me this error:

input text:  Hello World 
Exception in thread "main" javax.crypto.IllegalBlockSizeException: data not block size aligned
    at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    at SimpleSymmetricExample.main(SimpleSymmetricExample.java:25)

I know it has something to do with my keyBytes variable, but how to I change it so the block size is aligned?

Here is the SimpleSymmetricExample class:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class SimpleSymmetricExample{
    public static void main(String[] args) throws Exception {

           byte[] input = " Hello World ".getBytes();
            byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
            0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };
            SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding", "BC");

        System.out.println("input text: " + new String(input));

        //encryption pass

        byte[] cipherText = new byte[input.length];

        cipher.init(Cipher.ENCRYPT_MODE, key);
        int ctLength = cipher.update(input,0,input.length, cipherText, 0);

        ctLength += cipher.doFinal(cipherText, ctLength);

        System.out.println("cipher text: " + new String(cipherText) + "bytes: " + ctLength);

        //Decryption pass
        byte[] plainText = new byte[ctLength];
        cipher.init(Cipher.DECRYPT_MODE, key);

        int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);

        ptLength += cipher.doFinal(plainText, ptLength);

        System.out.println("plain text" + new String(plainText));

    }
}

I have changed the padding, but still now I am getting an new error:

input text:  Hello World 
Exception in thread "main" javax.crypto.ShortBufferException: output buffer too short
    at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    at SimpleSymmetricExample.main(SimpleSymmetricExample.java:26)

SimpleSymmetricKey.java

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class SimpleSymmetricExample{
    public static void main(String[] args) throws Exception {

           byte[] input = " Hello World ".getBytes();
            byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
            0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };

            SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

        Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding", "BC"); //Changed Padding

        System.out.println("input text: " + new String(input));

        //encryption pass

        byte[] cipherText = new byte[input.length];

        cipher.init(Cipher.ENCRYPT_MODE, key);
        int ctLength = cipher.update(input,0,input.length, cipherText, 0);

        ctLength += cipher.doFinal(cipherText, ctLength);

        System.out.println("cipher text: " + new String(cipherText) + "bytes: " + ctLength);

        //Decryption pass
        byte[] plainText = new byte[ctLength];
        cipher.init(Cipher.DECRYPT_MODE, key);

        int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);

        ptLength += cipher.doFinal(plainText, ptLength);

        System.out.println("plain text" + new String(plainText));

    }
}

Did you check the API doc for doFinal before posting? - it includes

If the output buffer is too small to hold the result, a ShortBufferException is thrown. In this case, repeat this call with a larger output buffer. Use getOutputSize to determine how big the output buffer should be.

My guess is that you make the output buffer the same size as the input, but you forgot that the input will be padded before being encrypted.

Edited 3 Years Ago by JamesCherrill

I made the output the same size as the buffer, now it works, thanks. Also if I were, how would I set the amount bytes myself?

How would I change the keyBytes variable to it 's block size would be aligned instead of padding it?

This question has already been answered. Start a new discussion instead.