Hallo,
I did UDP chat with encryption. Fisrt "client" send and encryption message a and second "client" recive message and decription. But no ever. I donīt know, Sometime It send 12 messages and after error sometime only one message and error. I work whit localhost. Here my code if you want try it just re-write ports (4000->5000 and second 5000->4000).... And you will need this bcprov-jdk16-143.jar bouncycastle.org.
OK my code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.spec.AlgorithmParameterSpec;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
 
/**
 *
 * @author Lolek
 */
public class Main {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
 
            String hostname;
            if (args.length==0)
            {
                hostname = "127.0.0.1";
            }
            else
            { 
                hostname = args[0];
            }
 
            InetAddress ia = InetAddress.getByName(hostname);
 
 
            OdeslatVlakno odeslat = new OdeslatVlakno(ia, 4000);
            odeslat.start();
 
            PrijimatVlakno prijimat = new PrijimatVlakno(odeslat.getSocket());
            prijimat.start();
 
        } catch (UnknownHostException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
 
}
class OdeslatVlakno extends Thread
{
    private InetAddress server;
    private DatagramSocket klient;
    private int port;
    private byte nactenyText[] = new byte[256];
    private byte sifrovanyText[] = new byte[256];
 
    private String key1 = "1234567891234567";
 
    public OdeslatVlakno(InetAddress adresa,int port)
    {
        try {
            this.server = adresa;
            this.port = port;
            this.klient = new DatagramSocket(5000);
            this.klient.connect(adresa, port);
 
        } catch (SocketException ex) {
            Logger.getLogger(OdeslatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public DatagramSocket getSocket()
    {
        return this.klient;
    }
    @Override
    public void run()
    {   
        try {
 
 
                BufferedReader cteni = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
 
                Security.addProvider(new BouncyCastleProvider());
                SecretKeySpec key = new SecretKeySpec("1234567891234567".getBytes(), "AES");
                AlgorithmParameterSpec algoritmus = new IvParameterSpec("1234567891234567".getBytes());
                String jmenoAlgoritmu = "AES/CBC/PKCS7Padding";
                Cipher sifrovani = Cipher.getInstance(jmenoAlgoritmu);
                sifrovani.init(Cipher.ENCRYPT_MODE, key, algoritmus);
 
 
 
                String poRadcich = cteni.readLine();
                nactenyText = poRadcich.getBytes();
                sifrovanyText = sifrovani.doFinal(nactenyText);
                System.out.println("Delka sifrovaneho:"+sifrovanyText.length);
                if (poRadcich.equals("/q")) {
                    break;
                }
                DatagramPacket odesilanaData = new DatagramPacket(sifrovanyText, sifrovanyText.length, server, port);
                klient.send(odesilanaData);
            }
        } catch (IllegalBlockSizeException ex) {
            Logger.getLogger(OdeslatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (BadPaddingException ex) {
            Logger.getLogger(OdeslatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(OdeslatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidKeyException ex) {
            Logger.getLogger(OdeslatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidAlgorithmParameterException ex) {
            Logger.getLogger(OdeslatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(OdeslatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchPaddingException ex) {
            Logger.getLogger(OdeslatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } 
    }
}
 
class PrijimatVlakno extends Thread
{
    DatagramSocket klient;
    private byte prijimana [] = new byte[256];
    private byte desifrovanyText[];
    private byte text[]=new byte[256];
    private byte desText[] ;
 
    public PrijimatVlakno (DatagramSocket pomA)
    {
        this.klient=pomA;
    }
 
    @Override
    public void run()
    {   
        try {
 
 
 
            while (true) {
 
                Security.addProvider(new BouncyCastleProvider());
                SecretKeySpec key = new SecretKeySpec("1234567891234567".getBytes(), "AES");
                AlgorithmParameterSpec algoritmus = new IvParameterSpec("1234567891234567".getBytes());
                String jmenoAlgoritmu = "AES/CBC/PKCS7Padding";
 
                Cipher desifrovani = Cipher.getInstance(jmenoAlgoritmu);
                desifrovani.init(Cipher.DECRYPT_MODE, key, algoritmus);
 
                DatagramPacket prijimaci = new DatagramPacket(prijimana, prijimana.length);
                klient.receive(prijimaci);
                System.out.println("Prijmuta delka:"+prijimaci.getLength());
                text = prijimaci.getData();
 
                String sifrovanyText = new String(text,0,prijimaci.getLength());
 
 
                desText = sifrovanyText.getBytes();
 
                System.out.println("K desifrovani:"+desText.length);
                desifrovanyText = desifrovani.doFinal(desText);
                String vypis = new String(desifrovanyText, 0, desifrovanyText.length);
                System.out.println("Prijaty text:"+vypis);
            }
        } catch (IllegalBlockSizeException ex) {
            Logger.getLogger(PrijimatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (BadPaddingException ex) {
            Logger.getLogger(PrijimatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PrijimatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidKeyException ex) {
            Logger.getLogger(PrijimatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidAlgorithmParameterException ex) {
            Logger.getLogger(PrijimatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(PrijimatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchPaddingException ex) {
            Logger.getLogger(PrijimatVlakno.class.getName()).log(Level.SEVERE, null, ex);
        } 
    }
}