Como implementar a criptografia AES de 256 bits Java com CBC

Eu li os tópicos a seguir e eles ajudaram um pouco, mas estou procurando um pouco mais de informação.

Como escrever AES / CBC / PKCS5Padding criptografia e descriptografia com parâmetro de vetor de inicialização para BlackBerry

Criptografia Java 256bit AES

Basicamente, o que estou fazendo é escrever um programa que irá criptografar um pedido para ser enviado por TCP / IP e, em seguida, descriptografado por um programa de servidor. A criptografia terá que ser AES, e fazendo algumas pesquisas descobri que preciso usar CBC e PKCS5Padding. Então basicamente eu preciso de uma chave secreta e um IV também.

O aplicativo que estou desenvolvendo é para um telefone, então eu quero usar os pacotes de segurança do java para manter o tamanho baixo. Eu tenho o design feito, mas não tenho certeza da implementação do IV e da chave compartilhada.

Aqui está um código:

// My user name
byte[] loginId = "login".getBytes();

byte[] preSharedKey128 = "ACME-1234AC".getBytes();
byte[] preSharedKey192 = "ACME-1234ACME-1234A".getBytes();
// 256 bit key
byte[] preSharedKey256 = "ACME-1234ACME-1234ACME-1234".getBytes();
byte[] preSharedKey = preSharedKey256;

// Initialization Vector
// Required for CBC
byte[] iv ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
IvParameterSpec ips = new IvParameterSpec(iv);


byte[] encodedKey = new byte[loginId.length + preSharedKey.length];

System.arraycopy(loginId, 0, encodedKey, 0, loginId.length);
System.arraycopy(preSharedKey, 0, encodedKey, loginId.length, preSharedKey.length);

// The SecretKeySpec provides a mechanism for application-specific generation
// of cryptography keys for consumption by the Java Crypto classes.

// Create a key specification first, based on our key input.
SecretKey aesKey = new SecretKeySpec(encodedKey, "AES");

// Create a Cipher for encrypting the data using the key we created.
Cipher encryptCipher;

encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Initialize the Cipher with key and parameters
encryptCipher.init(Cipher.ENCRYPT_MODE, aesKey, ips);

// Our cleartext
String clearString = "33,8244000,9999,411,5012022517,0.00,0,1,V330";
byte[] cleartext = clearString.getBytes();

// Encrypt the cleartext
byte[] ciphertext = encryptCipher.doFinal(cleartext);

// Now decrypt back again...
// Decryption cipher
Cipher decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Initialize PBE Cipher with key and parameters
decryptCipher.init(Cipher.DECRYPT_MODE, aesKey, ips);

// Decrypt the cleartext
byte[] deciphertext = decryptCipher.doFinal(ciphertext);

Em suma, o que ele deve fazer é criptografar algumas mensagens que podem ser descriptografadas pelo servidor sem que o servidor precise obter uma chave ou IV do telefone. Existe uma maneira que eu poderia fazer isso onde eu poderia proteger o IV e chave no telefone, e ainda tem a chave e IV conhecido pelo servidor também? Sinta-se livre para me dizer para deixar as coisas mais claras se não forem.

questionAnswers(2)

yourAnswerToTheQuestion