2

Encryption/Decryption won't work in cross platform.

I have used this link to encrypt/decrypt text using bouncy castle AES cipher within codename one.

AES Encryption/Decryption with Bouncycastle Example in J2ME

While from server side (.net) , i am using this link to implement same method.

http://zenu.wordpress.com/2011/09/21/aes-128bit-cross-platform-java-and-c-encryption-compatibility/

now i am not getting any error but encrypted from codename one will not getting fully decrypted on server side and vice a versa.

any one please help me out on this.

Code from Codename one:

import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
import org.bouncycastle.util.encoders.Base64;


public class Test
{
    private static PaddedBufferedBlockCipher cipher = null;
    public static void main(String[] args)
    {
        try
        {
            byte key[] = "MAKV2SPBNI992122".getBytes("UTF-8");
            byte[] iv = new byte[16];

            PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(
                    new CBCBlockCipher(
                    new AESEngine()) );

            //Encryption
            String plainText = "Hello How are you !2#&*()% 123456@";
            byte[] plainData = plainText.getBytes("UTF-8");
            KeyParameter keyParam = new KeyParameter(key);
            CipherParameters ivAndKey = new ParametersWithIV(keyParam, iv);
            cipher.init(true, ivAndKey);
            byte[] ciptherBytes = cipherData(plainData); //48
            String cipherText = new String(Base64.encode(ciptherBytes), "UTF-8");//FileUtil.getStringFromByteArray(Base64.encode(ciptherBytes));


            System.out.println("encrypted >> "+cipherText);
            //Decryption

            byte[] cipherData = Base64.decode(cipherText);
            ivAndKey = new ParametersWithIV(keyParam, iv);
            cipher.init(false, ivAndKey);
            plainText = new String(cipherData(cipherData), "UTF-8");//FileUtil.getStringFromByteArray(cipherData(cipherData));

            System.out.println("decrypted >> "+plainText);


        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    private static byte[] cipherData(byte[] data)
            throws CryptoException
    {
        int minSize = cipher.getOutputSize(data.length);
        byte[] outBuf = new byte[minSize];
        int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);
        int length2 = cipher.doFinal(outBuf, length1);
        int actualLength = length1 + length2;
        byte[] result = new byte[actualLength];
        System.arraycopy(outBuf, 0, result, 0, result.length);
        return result;
    }

Code from .net:

 public static RijndaelManaged GetRijndaelManaged(String secretKey)
        {
            var keyBytes = new byte[16];
            var secretKeyBytes = Encoding.UTF8.GetBytes(secretKey);
            Array.Copy(secretKeyBytes, keyBytes, Math.Min(keyBytes.Length, secretKeyBytes.Length));
            return new RijndaelManaged
            {
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7,
                KeySize = 128,
                BlockSize = 128,
                Key = keyBytes,
                IV = keyBytes
            };
        }

        public static byte[] EncryptCBC(byte[] plainBytes, RijndaelManaged rijndaelManaged)
        {
            return rijndaelManaged.CreateEncryptor()
                .TransformFinalBlock(plainBytes, 0, plainBytes.Length);
        }

        public static byte[] DecryptCBC(byte[] encryptedData, RijndaelManaged rijndaelManaged)
        {
            return rijndaelManaged.CreateDecryptor()
                .TransformFinalBlock(encryptedData, 0, encryptedData.Length);
        }

        public static String EncryptCBCStr(String plainText, String key)
        {
            var plainBytes = Encoding.UTF8.GetBytes(plainText);
            return Convert.ToBase64String(EncryptCBC(plainBytes, GetRijndaelManaged(key)));
        }

         public static String DecryptCBCStr(String encryptedText, String key)
        {
            var encryptedBytes = Convert.FromBase64String(encryptedText);
            return Encoding.UTF8.GetString(DecryptCBC(encryptedBytes, GetRijndaelManaged(key)));
        }

// call

var PlainText = "Hello How are you !2#&*()% 123456@";
var EncryptionKey = "MAKV2SPBNI992122";
var cypherCBC = EncryptCBCStr(PlainText, EncryptionKey);
var decryptCBC = DecryptCBCStr(cypherCBC, EncryptionKey);

Thanks in adv.

Community
  • 1
  • 1
Ruchi
  • 5,032
  • 13
  • 59
  • 84
  • Your code please. Now we have to guess. My first guesses are: Nope. Encryption & Decryption acrrosss platforms is not broken. Its your code. Maybe you're not padding the source to encrypt to the correct blocksize. Maybe You''re not flushing the output leaving the reader dycrypter incomplete blocks. All maybe's untill we can check some code. – Marvin Smit Aug 08 '14 at 07:09
  • Hi Marvin, i have added code here.please check. – Ruchi Aug 08 '14 at 09:15
  • Don't see anything obvious. Could there be a difference in KeySize used? I don't know both implementations. – Marvin Smit Aug 08 '14 at 10:53

1 Answers1

2

This issue has been fixed...it is just key/IV bytes issue.as in .net there is same key and IV when in java i have used different IV.

correction in java code:

instead of this

byte key[] = "MAKV2SPBNI992122".getBytes("UTF-8");
byte[] iv = new byte[16];

use this.

byte key[] = "MAKV2SPBNI992122".getBytes("UTF-8");
byte[] iv =  "MAKV2SPBNI992122".getBytes("UTF-8");
Ruchi
  • 5,032
  • 13
  • 59
  • 84