Portachiavi ECDH grezzi - AWS Encryption SDK

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Portachiavi ECDH grezzi

Importante

Il portachiavi Raw ECDH è disponibile solo con la versione 3. x del. SDK di crittografia AWS per Java Il portachiavi Raw ECDH è stato introdotto nella versione 1.5.0 della Material Providers Library.

Il portachiavi Raw ECDH utilizza le coppie di chiavi pubblico-private a curva ellittica fornite dall'utente per ricavare una chiave di wrapping condivisa tra due parti. Innanzitutto, il portachiavi ricava un segreto condiviso utilizzando la chiave privata del mittente, la chiave pubblica del destinatario e l'algoritmo di accordo delle chiavi Elliptic Curve Diffie-Hellman (ECDH). Quindi, il portachiavi utilizza il segreto condiviso per derivare la chiave di avvolgimento condivisa che protegge le chiavi di crittografia dei dati. La funzione di derivazione delle chiavi che AWS Encryption SDK utilizza (KDF_CTR_HMAC_SHA384) per derivare la chiave di wrapping condivisa è conforme alle raccomandazioni del NIST per la derivazione delle chiavi.

La funzione di derivazione delle chiavi restituisce 64 byte di materiale chiave. Per garantire che entrambe le parti utilizzino il materiale chiave corretto, AWS Encryption SDK utilizza i primi 32 byte come chiave di impegno e gli ultimi 32 byte come chiave di wrapping condivisa. Al momento della decrittografia, se il portachiavi non è in grado di riprodurre la stessa chiave di impegno e la stessa chiave di wrapping condivisa memorizzate nel testo cifrato dell'intestazione del messaggio, l'operazione ha esito negativo. Ad esempio, se si crittografano i dati con un portachiavi configurato con la chiave privata di Alice e la chiave pubblica di Bob, un portachiavi configurato con la chiave privata di Bob e la chiave pubblica di Alice riprodurrà la stessa chiave di impegno e la stessa chiave di wrapping condivisa e sarà in grado di decrittografare i dati. Se la chiave pubblica di Bob proviene da una AWS KMS key coppia, Bob può creare un AWS KMS portachiavi ECDH per decrittografare i dati.

Il portachiavi Raw ECDH crittografa i dati con una chiave simmetrica utilizzando AES-GCM. La chiave dati viene quindi crittografata in busta con la chiave di wrapping condivisa derivata utilizzando AES-GCM. Ogni portachiavi Raw ECDH può avere solo una chiave di avvolgimento condivisa, ma è possibile includere più portachiavi Raw ECDH, da soli o con altri portachiavi, in un portachiavi multiplo.

L'utente è responsabile della generazione, dell'archiviazione e della protezione delle chiavi private, preferibilmente in un modulo di sicurezza hardware (HSM) o in un sistema di gestione delle chiavi. Le coppie di chiavi del mittente e del destinatario devono trovarsi sulla stessa curva ellittica. AWS Encryption SDK Supporta le seguenti specifiche della curva ellittica:

  • ECC_NIST_P256

  • ECC_NIST_P384

  • ECC_NIST_P512

Creazione di un portachiavi Raw ECDH

Il portachiavi Raw ECDH supporta tre schemi di accordi chiave:, e. RawPrivateKeyToStaticPublicKey EphemeralPrivateKeyToStaticPublicKey PublicKeyDiscovery Lo schema di accordo chiave selezionato determina quali operazioni crittografiche è possibile eseguire e come vengono assemblati i materiali di codifica.

RawPrivateKeyToStaticPublicKey

Utilizza lo schema degli accordi RawPrivateKeyToStaticPublicKey chiave per configurare staticamente la chiave privata del mittente e la chiave pubblica del destinatario nel portachiavi. Questo schema di accordo chiave può crittografare e decrittografare i dati.

Per inizializzare un portachiavi Raw ECDH con lo schema degli accordi RawPrivateKeyToStaticPublicKey chiave, fornite i seguenti valori:

Java

Il seguente esempio di Java utilizza lo schema di accordo delle RawPrivateKeyToStaticPublicKey chiavi per configurare staticamente la chiave privata del mittente e la chiave pubblica del destinatario. Entrambe le coppie di chiavi sono sulla ECC_NIST_P256 curva.

private static void StaticRawKeyring() { // Instantiate material providers final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); KeyPair senderKeys = GetRawEccKey(); KeyPair recipient = GetRawEccKey(); // Create the Raw ECDH static keyring final CreateRawEcdhKeyringInput rawKeyringInput = CreateRawEcdhKeyringInput.builder() .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( RawEcdhStaticConfigurations.builder() .RawPrivateKeyToStaticPublicKey( RawPrivateKeyToStaticPublicKeyInput.builder() // Must be a PEM-encoded private key .senderStaticPrivateKey(ByteBuffer.wrap(senderKeys.getPrivate().getEncoded())) // Must be a DER-encoded X.509 public key .recipientPublicKey(ByteBuffer.wrap(recipient.getPublic().getEncoded())) .build() ) .build() ).build(); final IKeyring staticKeyring = materialProviders.CreateRawEcdhKeyring(rawKeyringInput); }

EphemeralPrivateKeyToStaticPublicKey

I portachiavi configurati con lo schema EphemeralPrivateKeyToStaticPublicKey key agreement creano una nuova coppia di chiavi localmente e derivano una chiave di wrapping condivisa unica per ogni chiamata crittografata.

Questo schema di accordo chiave può solo crittografare i messaggi. Per decrittografare i messaggi crittografati con lo schema del contratto di EphemeralPrivateKeyToStaticPublicKey chiave, è necessario utilizzare uno schema di accordo con la chiave di rilevamento configurato con la chiave pubblica dello stesso destinatario. Per decrittografare, è possibile utilizzare un portachiavi ECDH non elaborato con l'algoritmo di accordo PublicKeyDiscoverychiave oppure, se la chiave pubblica del destinatario proviene da una coppia di chiavi KMS con accordo di chiave asimmetrico, è possibile AWS KMS utilizzare un portachiavi ECDH con lo schema di accordo chiave. KmsPublicKeyDiscovery

Per inizializzare un portachiavi ECDH non elaborato con lo schema di accordo chiave, fornisci i seguenti valori: EphemeralPrivateKeyToStaticPublicKey

Java

L'esempio seguente crea un portachiavi ECDH non elaborato con lo schema di accordo delle chiavi. EphemeralPrivateKeyToStaticPublicKey Su encrypt, il portachiavi creerà una nuova coppia di chiavi localmente sulla curva specificataECC_NIST_P256.

private static void EphemeralRawEcdhKeyring() { // Instantiate material providers final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); ByteBuffer recipientPublicKey = getPublicKeyBytes(); // Create the Raw ECDH ephemeral keyring final CreateRawEcdhKeyringInput ephemeralInput = CreateRawEcdhKeyringInput.builder() .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( RawEcdhStaticConfigurations.builder() .EphemeralPrivateKeyToStaticPublicKey( EphemeralPrivateKeyToStaticPublicKeyInput.builder() .recipientPublicKey(recipientPublicKey) .build() ) .build() ).build(); final IKeyring ephemeralKeyring = materialProviders.CreateRawEcdhKeyring(ephemeralInput); }

PublicKeyDiscovery

Durante la decrittografia, è consigliabile specificare le chiavi di avvolgimento che possono utilizzare. AWS Encryption SDK Per seguire questa best practice, utilizzate un portachiavi ECDH che specifichi sia la chiave privata del mittente che la chiave pubblica del destinatario. Tuttavia, puoi anche creare un portachiavi Raw ECDH Discovery, ovvero un portachiavi ECDH non elaborato in grado di decrittografare qualsiasi messaggio in cui la chiave pubblica della chiave specificata corrisponda alla chiave pubblica del destinatario memorizzata nel testo cifrato del messaggio. Questo schema di accordi chiave può solo decrittografare i messaggi.

Importante

Quando si decifrano i messaggi utilizzando lo schema del contratto di PublicKeyDiscovery chiave, si accettano tutte le chiavi pubbliche, indipendentemente dal proprietario.

Per inizializzare un portachiavi Raw ECDH con lo schema di accordo PublicKeyDiscovery chiave, fornite i seguenti valori:

Java

L'esempio seguente crea un portachiavi Raw ECDH con lo schema di accordo chiave. PublicKeyDiscovery Questo portachiavi può decrittografare qualsiasi messaggio in cui la chiave pubblica della chiave privata specificata corrisponda alla chiave pubblica del destinatario memorizzata nel testo cifrato del messaggio.

private static void RawEcdhDiscovery() { // Instantiate material providers final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); KeyPair recipient = GetRawEccKey(); // Create the Raw ECDH discovery keyring final CreateRawEcdhKeyringInput rawKeyringInput = CreateRawEcdhKeyringInput.builder() .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( RawEcdhStaticConfigurations.builder() .PublicKeyDiscovery( PublicKeyDiscoveryInput.builder() // Must be a PEM-encoded private key .recipientStaticPrivateKey(ByteBuffer.wrap(sender.getPrivate().getEncoded())) .build() ) .build() ).build(); final IKeyring publicKeyDiscovery = materialProviders.CreateRawEcdhKeyring(rawKeyringInput); }