Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Rohe ECDH Schlüsselanhänger
Der ECDH Raw-Schlüsselbund verwendet die von Ihnen bereitgestellten Paare aus öffentlichen und privaten Schlüsseln mit elliptischer Kurve, um einen gemeinsamen Wrapping-Schlüssel zwischen zwei Parteien abzuleiten. Zunächst leitet der Schlüsselbund mithilfe des privaten Schlüssels des Absenders, des öffentlichen Schlüssels des Empfängers und des Elliptic Curve Diffie-Hellman () -Schlüsselvereinbarungsalgorithmus ein gemeinsames Geheimnis ab. ECDH Anschließend leitet der Schlüsselbund anhand des gemeinsamen geheimen Schlüssels den gemeinsamen Wrapping-Schlüssel ab, der Ihre Datenverschlüsselungsschlüssel schützt. Die Schlüsselableitungsfunktion, die (KDF_CTR_HMAC_SHA384
) AWS Encryption SDK verwendet, um den gemeinsamen Wrapping-Schlüssel abzuleiten, entspricht den Empfehlungen für die Schlüsselableitung. NIST
Die Funktion zur Schlüsselableitung gibt 64 Byte an Schlüsselmaterial zurück. Um sicherzustellen, dass beide Parteien das richtige Schlüsselmaterial verwenden, AWS Encryption SDK verwendet der die ersten 32 Byte als Commitment-Schlüssel und die letzten 32 Byte als gemeinsamen Wrapping-Schlüssel. Wenn der Schlüsselbund beim Entschlüsseln nicht denselben Commitment-Schlüssel und denselben gemeinsamen Wrapping-Schlüssel reproduzieren kann, die im Chiffretext der Nachrichtenkopfzeile gespeichert sind, schlägt der Vorgang fehl. Wenn Sie beispielsweise Daten mit einem Schlüsselbund verschlüsseln, der mit Alices privatem Schlüssel und Bobs öffentlichem Schlüssel konfiguriert ist, reproduziert ein Schlüsselbund, der mit Bobs privatem Schlüssel und Alices öffentlichem Schlüssel konfiguriert ist, denselben Commitment-Schlüssel und gemeinsamen Wrapping-Schlüssel und kann die Daten entschlüsseln. Wenn Bobs öffentlicher Schlüssel aus einem AWS KMS key Paar stammt, kann Bob einen AWS KMS ECDHSchlüsselbund erstellen, um die Daten zu entschlüsseln.
Der ECDH Raw-Schlüsselbund verschlüsselt Daten mit einem symmetrischen Schlüssel mithilfe von -. AES GCM Der Datenschlüssel wird dann mit dem abgeleiteten gemeinsamen Wrapping-Schlüssel unter Verwendung von - umhüllverschlüsselt. AES GCM Jeder ECDH Raw-Schlüsselbund kann nur einen gemeinsamen Wrap-Schlüssel haben, aber Sie können mehrere ECDH Raw-Schlüsselanhänger, einzeln oder zusammen mit anderen Schlüsselbunden, zu einem Mehrfachschlüsselbund zusammenfassen.
Sie sind dafür verantwortlich, Ihre privaten Schlüssel zu generieren, zu speichern und zu schützen, vorzugsweise in einem Hardware-Sicherheitsmodul (HSM) oder einem Schlüsselverwaltungssystem. Die Schlüsselpaare des Absenders und des Empfängers müssen sich auf derselben elliptischen Kurve befinden. Der AWS Encryption SDK
unterstützt die folgenden Spezifikationen für elliptische Kurven:
-
ECC_NIST_P256
-
ECC_NIST_P384
-
ECC_NIST_P512
Kompatibilität mit Programmiersprachen
Der ECDH Raw-Schlüsselbund wurde in Version 1.5.0 der Cryptographic Material Providers Library (MPL) eingeführt und wird von den folgenden Programmiersprachen und Versionen unterstützt:
-
Version 3. x der AWS-Verschlüsselungs-SDK for Java
-
Ausführung 4. x der AWS Encryption SDK Form. NET
-
Ausführung 4. x von AWS-Verschlüsselungs-SDK for Python, wenn es mit der optionalen MPL Abhängigkeit verwendet wird.
Einen ECDH Raw-Schlüsselbund erstellen
Der ECDH Raw-Schlüsselbund unterstützt drei wichtige Vereinbarungsschemata:RawPrivateKeyToStaticPublicKey
, undEphemeralPrivateKeyToStaticPublicKey
. PublicKeyDiscovery
Das von Ihnen gewählte Schlüsselvereinbarungsschema bestimmt, welche kryptografischen Operationen Sie ausführen können und wie die Schlüsselmaterialien zusammengestellt werden.
RawPrivateKeyToStaticPublicKey
Verwenden Sie das RawPrivateKeyToStaticPublicKey
Schlüsselvereinbarungsschema, um den privaten Schlüssel des Absenders und den öffentlichen Schlüssel des Empfängers im Schlüsselbund statisch zu konfigurieren. Dieses Schlüsselvereinbarungsschema kann Daten ver- und entschlüsseln.
Um einen ECDH Raw-Schlüsselbund mit dem Schlüsselvereinbarungsschema zu initialisieren, geben Sie die RawPrivateKeyToStaticPublicKey
folgenden Werte an:
- 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
-
Das folgende Java-Beispiel verwendet das RawPrivateKeyToStaticPublicKey
Schlüsselvereinbarungsschema, um den privaten Schlüssel des Absenders und den öffentlichen Schlüssel des Empfängers statisch zu konfigurieren. Beide Schlüsselpaare befinden sich auf der ECC_NIST_P256
Kurve.
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
-
Das folgende Python-Beispiel verwendet das RawEcdhStaticConfigurationsRawPrivateKeyToStaticPublicKey
Schlüsselvereinbarungsschema, um den privaten Schlüssel des Absenders und den öffentlichen Schlüssel des Empfängers statisch zu konfigurieren. Beide Schlüsselpaare befinden sich auf der ECC_NIST_P256
Kurve.
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
Mit dem Schlüsselvereinbarungsschema konfigurierte EphemeralPrivateKeyToStaticPublicKey
Schlüsselringe erstellen lokal ein neues key pair und leiten für jeden Verschlüsselungsaufruf einen eindeutigen gemeinsamen Wrapping-Schlüssel ab.
Dieses Schlüsselvereinbarungsschema kann nur Nachrichten verschlüsseln. Um Nachrichten zu entschlüsseln, die mit dem EphemeralPrivateKeyToStaticPublicKey
Schlüsselvereinbarungsschema verschlüsselt wurden, müssen Sie ein Discovery-Schlüsselvereinbarungsschema verwenden, das mit dem öffentlichen Schlüssel desselben Empfängers konfiguriert ist. Zum Entschlüsseln können Sie einen ECDH Raw-Schlüsselbund mit dem PublicKeyDiscoverySchlüsselvereinbarungsalgorithmus verwenden. Wenn der öffentliche Schlüssel des Empfängers aus einem asymmetrischen key pair für die Schlüsselvereinbarung stammt, können Sie einen KMS AWS KMS ECDH Schlüsselbund mit dem KmsPublicKeyDiscoverySchlüsselvereinbarungsschema verwenden.
Um einen ECDH Raw-Schlüsselbund mit dem Schlüsselvereinbarungsschema zu initialisieren, geben Sie die EphemeralPrivateKeyToStaticPublicKey
folgenden Werte an:
-
Der öffentliche Schlüssel des Empfängers
Sie müssen den DER -codierten öffentlichen X.509-Schlüssel des Empfängers, auch bekannt als SubjectPublicKeyInfo
(SPKI), wie in 5280 definiert, angeben. RFC
Sie können den öffentlichen Schlüssel eines Schlüsselpaars mit asymmetrischer KMS Schlüsselvereinbarung oder den öffentlichen Schlüssel eines außerhalb von AWS generierten key pair angeben.
-
Spezifikation der Kurve
Identifiziert die Spezifikation für elliptische Kurven im angegebenen öffentlichen Schlüssel.
Beim Verschlüsseln erstellt der Schlüsselbund ein neues key pair auf der angegebenen Kurve und verwendet den neuen privaten Schlüssel und den angegebenen öffentlichen Schlüssel, um einen gemeinsamen Wrapping-Schlüssel abzuleiten.
Zulässige Werte: ECC_NIST_P256
, ECC_NIS_P384
, ECC_NIST_P512
- C# / .NET
-
Im folgenden Beispiel wird ein ECDH Raw-Schlüsselbund mit dem EphemeralPrivateKeyToStaticPublicKey
Schlüsselvereinbarungsschema erstellt. Beim Verschlüsseln erstellt der Schlüsselbund lokal auf der angegebenen ECC_NIST_P256
Kurve ein neues key pair.
// 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
-
Im folgenden Beispiel wird ein ECDH Raw-Schlüsselbund mit dem Schlüsselvereinbarungsschema EphemeralPrivateKeyToStaticPublicKey
erstellt. Beim Verschlüsseln erstellt der Schlüsselbund lokal auf der angegebenen ECC_NIST_P256
Kurve ein neues key pair.
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
-
Im folgenden Beispiel wird ein ECDH Raw-Schlüsselbund mit dem Schlüsselvereinbarungsschema RawEcdhStaticConfigurationsEphemeralPrivateKeyToStaticPublicKey
erstellt. Beim Verschlüsseln erstellt der Schlüsselbund lokal auf der angegebenen ECC_NIST_P256
Kurve ein neues key pair.
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
Beim Entschlüsseln empfiehlt es sich, die Umschließungsschlüssel anzugeben, die sie verwenden können. AWS Encryption SDK Um dieser bewährten Methode zu folgen, verwenden Sie einen ECDH Schlüsselbund, der sowohl den privaten Schlüssel des Absenders als auch den öffentlichen Schlüssel des Empfängers angibt. Sie können jedoch auch einen Raw ECDH Discovery-Schlüsselbund erstellen, d. h. einen ECDH Raw-Schlüsselbund, mit dem jede Nachricht entschlüsselt werden kann, bei der der öffentliche Schlüssel des angegebenen Schlüssels mit dem öffentlichen Schlüssel des Empfängers übereinstimmt, der im Chiffretext der Nachricht gespeichert ist. Dieses Schlüsselvereinbarungsschema kann nur Nachrichten entschlüsseln.
Wenn Sie Nachrichten mithilfe des PublicKeyDiscovery
Schlüsselvereinbarungsschemas entschlüsseln, akzeptieren Sie alle öffentlichen Schlüssel, unabhängig davon, wem sie gehören.
Um einen ECDH Raw-Schlüsselbund mit dem PublicKeyDiscovery
Schlüsselvereinbarungsschema zu initialisieren, geben Sie die folgenden Werte an:
- C# / .NET
-
Im folgenden Beispiel wird ein ECDH Raw-Schlüsselbund mit dem PublicKeyDiscovery
Schlüsselvereinbarungsschema erstellt. Dieser Schlüsselbund kann jede Nachricht entschlüsseln, bei der der öffentliche Schlüssel des angegebenen privaten Schlüssels mit dem öffentlichen Schlüssel des Empfängers übereinstimmt, der im Chiffretext der Nachricht gespeichert ist.
// 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
-
Im folgenden Beispiel wird ein ECDH Raw-Schlüsselbund mit dem Schlüsselvereinbarungsschema erstellt. PublicKeyDiscovery
Dieser Schlüsselbund kann jede Nachricht entschlüsseln, bei der der öffentliche Schlüssel des angegebenen privaten Schlüssels mit dem öffentlichen Schlüssel des Empfängers übereinstimmt, der im Chiffretext der Nachricht gespeichert ist.
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
-
Im folgenden Beispiel wird ein ECDH Raw-Schlüsselbund mit dem Schlüsselvereinbarungsschema erstellt. RawEcdhStaticConfigurationsPublicKeyDiscovery
Dieser Schlüsselbund kann jede Nachricht entschlüsseln, bei der der öffentliche Schlüssel des angegebenen privaten Schlüssels mit dem öffentlichen Schlüssel des Empfängers übereinstimmt, der im Chiffretext der Nachricht gespeichert ist.
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)