He leído los siguientes subprocesos y me han ayudado un poco, pero estoy buscando un poco más de información.Cómo implementar cifrado AES Java de 256 bits con CBC
Básicamente, lo que estoy haciendo está escribiendo un programa que va a cifrar una solicitud que se enviará a través de TCP/IP, y entonces descifrado por un programa de servidor. La encriptación necesitará ser AES, y al hacer una investigación descubrí que necesito usar CBC y PKCS5Padding. Básicamente, necesito una clave secreta y una IV también.
La aplicación que estoy desarrollando es para un teléfono, por lo que quiero utilizar los paquetes de seguridad de Java para mantener el tamaño. Ya terminé el diseño, pero no estoy seguro de la implementación del IV y la clave compartida.
Aquí hay algo de 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);
En pocas palabras lo que debe hacer es cifrar algún mensaje que pueda descifrarse por el servidor sin que el servidor necesidad de obtener una clave o IV del teléfono. ¿Hay alguna manera de que yo pueda hacer esto donde pueda asegurar el IV y la llave en el teléfono, y aún así tener la clave y el IV conocidos por el servidor también? Siéntase libre de decirme que deje las cosas más claras si no lo son.
Las claves y contraseñas codificadas aquí son sólo para mi comprensión. No sé mucho sobre encriptación, así que básicamente estoy en modo make-it-compile-and-run. – Stevus
¿Cuál es su modelo de amenaza? Quiero decir, si piensas que se necesita encriptación, debes tener alguna idea sobre quién querría esta información y por qué, cuánto la perjudicaría, la beneficiaría, etc. – erickson
Supongo que mi modelo de amenaza es que tenemos cierta certeza información de cuenta/inicio de sesión necesaria para hacer una transacción bancaria y no queremos que esté expuesta. ¿Es eso lo que estás buscando? – Stevus