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); } } }