Ho letto i seguenti thread e hanno aiutato un po ', ma sto cercando un po' più di informazioni.Come implementare la crittografia AES 256-bit Java con CBC
In sostanza, quello che sto facendo sta scrivendo un programma che crittografare una richiesta da inviare su TCP/IP, e poi decifrati da un programma server. La crittografia dovrà essere AES, e facendo alcune ricerche ho scoperto che ho bisogno di usare CBC e PKCS5Padding. Quindi in pratica ho bisogno di una chiave segreta e anche di una IV.
L'applicazione che sto sviluppando è per un telefono, quindi voglio usare i pacchetti di sicurezza java per mantenere la dimensione bassa. Ho fatto il disegno, ma non sono sicuro dell'implementazione della IV e della chiave condivisa.
Ecco po 'di codice:
// 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);
In poche parole quello che dovrebbe fare è crittografare qualche messaggio che può decifrato dal server senza il server necessità di ottenere una chiave o IV dal telefono. C'è un modo per farlo in modo da poter mettere al sicuro la IV e la chiave del telefono e avere ancora la chiave e la IV conosciute dal server? Sentiti libero di dirmi di rendere le cose più chiare se non lo sono.
Le chiavi e le password hardcoded qui sono solo per la mia comprensione. Non so molto sulla crittografia, quindi sono fondamentalmente in modalità make-it-compile-ed-run. – Stevus
Qual è il tuo modello di minaccia? Voglio dire, se stai pensando che sia necessaria la crittografia, devi avere qualche idea su chi vorrebbe queste informazioni e perché, quanto ottenerle ti farebbe male, a loro vantaggio, ecc. – erickson
Suppongo che il mio modello di minaccia sia che abbiamo certe account/dati di accesso necessari per effettuare una transazione bancaria e non vogliamo che siano esposti. E 'quello che stai cercando? – Stevus