ECDHChaveiros Raw - AWS Encryption SDK

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

ECDHChaveiros Raw

O ECDH chaveiro Raw usa os pares de chaves públicas-privadas de curva elíptica que você fornece para derivar uma chave de empacotamento compartilhada entre duas partes. Primeiro, o chaveiro obtém um segredo compartilhado usando a chave privada do remetente, a chave pública do destinatário e o algoritmo de acordo de chave Elliptic Curve Diffie-Hellman (). ECDH Em seguida, o chaveiro usa o segredo compartilhado para derivar a chave de empacotamento compartilhada que protege suas chaves de criptografia de dados. A função de derivação de chave que o AWS Encryption SDK usa (KDF_CTR_HMAC_SHA384) para derivar a chave de empacotamento compartilhada está em conformidade com NISTas recomendações para derivação de chave.

A função de derivação de chave retorna 64 bytes de material de chave. Para garantir que ambas as partes usem o material de chave correto, AWS Encryption SDK usam os primeiros 32 bytes como chave de compromisso e os últimos 32 bytes como chave de empacotamento compartilhada. Na descriptografia, se o chaveiro não puder reproduzir a mesma chave de compromisso e chave de encapsulamento compartilhada armazenadas no texto cifrado do cabeçalho da mensagem, a operação falhará. Por exemplo, se você criptografar dados com um chaveiro configurado com a chave privada de Alice e a chave pública de Bob, um chaveiro configurado com a chave privada de Bob e a chave pública de Alice reproduzirá a mesma chave de compromisso e chave de empacotamento compartilhada e poderá descriptografar os dados. Se a chave pública de Bob for de um AWS KMS key par, Bob poderá criar um AWS KMS ECDHchaveiro para decifrar os dados.

O ECDH chaveiro Raw criptografa os dados com uma chave simétrica usando -. AES GCM A chave de dados é então criptografada em envelope com a chave de empacotamento compartilhada derivada usando AES -. GCM Cada ECDH chaveiro Raw pode ter apenas uma chave de embrulho compartilhada, mas você pode incluir vários ECDH chaveiros Raw, sozinhos ou com outros chaveiros, em um chaveiro múltiplo.

Você é responsável por gerar, armazenar e proteger suas chaves privadas, preferencialmente em um módulo de segurança de hardware (HSM) ou sistema de gerenciamento de chaves. Os pares de chaves do remetente e do destinatário devem estar na mesma curva elíptica. O AWS Encryption SDK suporta as seguintes especificações de curva elíptica:

  • ECC_NIST_P256

  • ECC_NIST_P384

  • ECC_NIST_P512

Compatibilidade com linguagens de programação

O ECDH chaveiro Raw foi introduzido na versão 1.5.0 da Cryptographic Material Providers Library (MPL) e é suportado pelas seguintes linguagens e versões de programação:

  • Versão 3. x do AWS Encryption SDK for Java

  • Versão 4. x do AWS Encryption SDK formulário. NET

  • Versão 4. x do AWS Encryption SDK for Python, quando usado com a MPL dependência opcional.

Criando um ECDH chaveiro Raw

O ECDH chaveiro Raw suporta três esquemas de contrato principais: RawPrivateKeyToStaticPublicKeyEphemeralPrivateKeyToStaticPublicKey, e. PublicKeyDiscovery O esquema de contrato de chave selecionado determina quais operações criptográficas você pode realizar e como os materiais de chaveamento são montados.

RawPrivateKeyToStaticPublicKey

Use o esquema de contrato de RawPrivateKeyToStaticPublicKey chave para configurar estaticamente a chave privada do remetente e a chave pública do destinatário no chaveiro. Esse esquema de contrato chave pode criptografar e descriptografar dados.

Para inicializar um ECDH chaveiro Raw com o esquema de contrato de RawPrivateKeyToStaticPublicKey chave, forneça os seguintes valores:

C# / .NET
// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); var BobPrivateKey = new MemoryStream(new byte[] { }); var AlicePublicKey = new MemoryStream(new byte[] { }); // Create the Raw ECDH static keyring var staticConfiguration = new RawEcdhStaticConfigurations() { RawPrivateKeyToStaticPublicKey = new RawPrivateKeyToStaticPublicKeyInput { SenderStaticPrivateKey = BobPrivateKey, RecipientPublicKey = AlicePublicKey } }; var createKeyringInput = new CreateRawEcdhKeyringInput() { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KeyAgreementScheme = staticConfiguration }; var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
Java

O exemplo Java a seguir usa o esquema de contrato de RawPrivateKeyToStaticPublicKey chave para configurar estaticamente a chave privada do remetente e a chave pública do destinatário. Ambos os pares de chaves estão na 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); }
Python

O exemplo de Python a seguir usa o esquema de contrato de RawEcdhStaticConfigurationsRawPrivateKeyToStaticPublicKey chave para configurar estaticamente a chave privada do remetente e a chave pública do destinatário. Ambos os pares de chaves estão na ECC_NIST_P256 curva.

import boto3 from aws_cryptographic_materialproviders.mpl.models import ( CreateRawEcdhKeyringInput, RawEcdhStaticConfigurationsRawPrivateKeyToStaticPublicKey, RawPrivateKeyToStaticPublicKeyInput, ) from aws_cryptography_primitives.smithygenerated.aws_cryptography_primitives.models import ECDHCurveSpec # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Must be a PEM-encoded private key bob_private_key = get_private_key_bytes() # Must be a DER-encoded X.509 public key alice_public_key = get_public_key_bytes() # Create the raw ECDH static keyring raw_keyring_input = CreateRawEcdhKeyringInput( curve_spec = ECDHCurveSpec.ECC_NIST_P256, key_agreement_scheme = RawEcdhStaticConfigurationsRawPrivateKeyToStaticPublicKey( RawPrivateKeyToStaticPublicKeyInput( sender_static_private_key = bob_private_key, recipient_public_key = alice_public_key, ) ) ) keyring = mat_prov.create_raw_ecdh_keyring(raw_keyring_input)

EphemeralPrivateKeyToStaticPublicKey

Os chaveiros configurados com o esquema de contrato de EphemeralPrivateKeyToStaticPublicKey chaves criam um novo par de chaves localmente e derivam uma chave de empacotamento compartilhada exclusiva para cada chamada criptografada.

Esse esquema de contrato de chave só pode criptografar mensagens. Para descriptografar mensagens criptografadas com o esquema de contrato de EphemeralPrivateKeyToStaticPublicKey chave, você deve usar um esquema de contrato de chave de descoberta configurado com a mesma chave pública do destinatário. Para descriptografar, você pode usar um ECDH chaveiro bruto com o algoritmo de acordo de PublicKeyDiscoverychave ou, se a chave pública do destinatário for de um KMS par de chaves de acordo de chave assimétrico, você pode usar AWS KMS ECDH um chaveiro com o esquema de contrato de chave. KmsPublicKeyDiscovery

Para inicializar um ECDH chaveiro Raw com o esquema de contrato de EphemeralPrivateKeyToStaticPublicKey chave, forneça os seguintes valores:

C# / .NET

O exemplo a seguir cria um ECDH chaveiro Raw com o esquema de contrato de EphemeralPrivateKeyToStaticPublicKey chave. Ao criptografar, o chaveiro criará um novo par de chaves localmente na curva especificadaECC_NIST_P256.

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); var AlicePublicKey = new MemoryStream(new byte[] { }); // Create the Raw ECDH ephemeral keyring var ephemeralConfiguration = new RawEcdhStaticConfigurations() { EphemeralPrivateKeyToStaticPublicKey = new EphemeralPrivateKeyToStaticPublicKeyInput { RecipientPublicKey = AlicePublicKey } }; var createKeyringInput = new CreateRawEcdhKeyringInput() { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KeyAgreementScheme = ephemeralConfiguration }; var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
Java

O exemplo a seguir cria um ECDH chaveiro Raw com o esquema de contrato de EphemeralPrivateKeyToStaticPublicKey chave. Ao criptografar, o chaveiro criará um novo par de chaves localmente na curva especificadaECC_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); }
Python

O exemplo a seguir cria um ECDH chaveiro Raw com o esquema de contrato de RawEcdhStaticConfigurationsEphemeralPrivateKeyToStaticPublicKey chave. Ao criptografar, o chaveiro criará um novo par de chaves localmente na curva especificadaECC_NIST_P256.

import boto3 from aws_cryptographic_materialproviders.mpl.models import ( CreateRawEcdhKeyringInput, RawEcdhStaticConfigurationsEphemeralPrivateKeyToStaticPublicKey, EphemeralPrivateKeyToStaticPublicKeyInput, ) from aws_cryptography_primitives.smithygenerated.aws_cryptography_primitives.models import ECDHCurveSpec # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Your get_public_key_bytes must return a DER-encoded X.509 public key recipient_public_key = get_public_key_bytes() # Create the raw ECDH ephemeral private key keyring ephemeral_input = CreateRawEcdhKeyringInput( curve_spec = ECDHCurveSpec.ECC_NIST_P256, key_agreement_scheme = RawEcdhStaticConfigurationsEphemeralPrivateKeyToStaticPublicKey( EphemeralPrivateKeyToStaticPublicKeyInput( recipient_public_key = recipient_public_key, ) ) ) keyring = mat_prov.create_raw_ecdh_keyring(ephemeral_input)

PublicKeyDiscovery

Ao descriptografar, é uma prática recomendada especificar as chaves de encapsulamento que podem ser usadas. AWS Encryption SDK Para seguir essa prática recomendada, use um ECDH chaveiro que especifique a chave privada do remetente e a chave pública do destinatário. No entanto, você também pode criar um chaveiro Raw ECDH Discovery, ou seja, um ECDH chaveiro Raw que pode descriptografar qualquer mensagem em que a chave pública da chave especificada corresponda à chave pública do destinatário armazenada no texto cifrado da mensagem. Esse esquema de contrato de chave só pode descriptografar mensagens.

Importante

Ao descriptografar mensagens usando o esquema de contrato de PublicKeyDiscovery chave, você aceita todas as chaves públicas, independentemente de quem as possua.

Para inicializar um ECDH chaveiro Raw com o esquema de contrato de PublicKeyDiscovery chave, forneça os seguintes valores:

C# / .NET

O exemplo a seguir cria um ECDH chaveiro Raw com o esquema de contrato de PublicKeyDiscovery chave. Esse chaveiro pode descriptografar qualquer mensagem em que a chave pública da chave privada especificada corresponda à chave pública do destinatário armazenada no texto cifrado da mensagem.

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); var AlicePrivateKey = new MemoryStream(new byte[] { }); // Create the Raw ECDH discovery keyring var discoveryConfiguration = new RawEcdhStaticConfigurations() { PublicKeyDiscovery = new PublicKeyDiscoveryInput { RecipientStaticPrivateKey = AlicePrivateKey } }; var createKeyringInput = new CreateRawEcdhKeyringInput() { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KeyAgreementScheme = discoveryConfiguration }; var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
Java

O exemplo a seguir cria um ECDH chaveiro Raw com o esquema de contrato de PublicKeyDiscovery chave. Esse chaveiro pode descriptografar qualquer mensagem em que a chave pública da chave privada especificada corresponda à chave pública do destinatário armazenada no texto cifrado da mensagem.

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); }
Python

O exemplo a seguir cria um ECDH chaveiro Raw com o esquema de contrato de RawEcdhStaticConfigurationsPublicKeyDiscovery chave. Esse chaveiro pode descriptografar qualquer mensagem em que a chave pública da chave privada especificada corresponda à chave pública do destinatário armazenada no texto cifrado da mensagem.

import boto3 from aws_cryptographic_materialproviders.mpl.models import ( CreateRawEcdhKeyringInput, RawEcdhStaticConfigurationsPublicKeyDiscovery, PublicKeyDiscoveryInput, ) from aws_cryptography_primitives.smithygenerated.aws_cryptography_primitives.models import ECDHCurveSpec # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Your get_private_key_bytes must return a PEM-encoded private key recipient_private_key = get_private_key_bytes() # Create the raw ECDH discovery keyring raw_keyring_input = CreateRawEcdhKeyringInput( curve_spec = ECDHCurveSpec.ECC_NIST_P256, key_agreement_scheme = RawEcdhStaticConfigurationsPublicKeyDiscovery( PublicKeyDiscoveryInput( recipient_static_private_key = recipient_private_key, ) ) ) keyring = mat_prov.create_raw_ecdh_keyring(raw_keyring_input)