A quanto pare, non c'è modo di farlo con la libreria standard senza una significativa ricodifica di cose già disponibili in Bouncy Castle, per esempio.
Ecco cosa mi è venuto in mente. Sul lato client, crittografo un file plainfile
come segue:
// install security providerif (Security.getProvider (BouncyCastleProvider.PROVIDER_NAME) == null) {Security .addProvider (new BouncyCastleProvider ());} // carica il certificato pubblico per signingKeyStore publicKs = KeyStore.getInstance (KeyStore.getDefaultType ()); publicKs.load (new FileInputStream ("/ path / to / publicKeystore.ks"), null ); TrustedCertificateEntry entry = (TrustedCertificateEntry) publicKs.getEntry ("public", null); X509Certificate cert = (X509Certificate) entry.getTrustedCertificate (); // crea i dati della busta CMS; // controlla http://www.ietf.org /rfc/rfc3852.txt pagine 15-16 per i dettagli CMSEnvelopedDataGenerator envelopedDataGen = new CMSEnvelopedDataGenerator (); // specifica che la chiave simmetrica generata verrà crittografata da con questa chiave pubblicaenvelopedDataGen.addKeyTransRecipient (cert); // genera automaticamente la chiave AES, data e crittografa la chiave CMSEnvelopedData data = envelopedDataGen.genera te (new CMSProcessableFile (plainfile), CMSEnvelopedDataGenerator.AES256_CBC, 256, BouncyCastleProvider.PROVIDER_NAME); byte [] encryptedData = data.getEncoded ();
Quindi, sul server, posso decrittografare questi dati come segue:
// carica chiave privataKeyStore privateKs = KeyStore.getInstance (KeyStore.getDefaultType ()); privateKs.load (new FileInputStream ("/ path / to / privateKeystore.ks" ), null); PrivateKeyEntry privateKeyEntry = (PrivateKeyEntry) privateKs.getEntry ("privatekey", new KeyStore.PasswordProtection ("password" .toCharArray ())); PrivateKey privateKey = privateKeyEntry.getPrivateKey (); byte [] encryptedData = .. .// parse CMS envelope dataCMSEnvelopedDataParser envelopedDataParser = new CMSEnvelopedDataParser (new ByteArrayInputStream (encryptedData));
// aspettati esattamente un recipientCollection<? > recipients = envelopedDataParser.getRecipientInfos (). getRecipients (); if (recipients.size ()! = 1) lancia una nuova IllegalArgumentException (); // recupera destinatario e decodifica itRecipientInformation = recipientiInformation = recipienti .iterator (). next (); byte [] decryptedData = recipient.getContent (privateKey, BouncyCastleProvider.PROVIDER_NAME);
Si prega di lasciare commenti se mi manca qualcosa di importante o sto commettendo errori ecco ... Grazie!