원시 ECDH 키링 - AWS Encryption SDK

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

원시 ECDH 키링

원시 ECDH 키링은 사용자가 제공하는 타원 곡선 퍼블릭-프라이빗 키 페어를 사용하여 두 당사자 간에 공유 래핑 키를 도출합니다. 먼저 키링은 발신자의 프라이빗 키, 수신자의 퍼블릭 키 및 Elliptic Curve Diffie-Hellman(ECDH) 키 계약 알고리즘을 사용하여 공유 보안 암호를 도출합니다. 그런 다음 키링은 공유 암호를 사용하여 데이터 암호화 키를 보호하는 공유 래핑 키를 도출합니다. 가 (KDF_CTR_HMAC_SHA384)를 AWS Encryption SDK 사용하여 공유 래핑 키를 도출하는 키 도출 함수는 NIST 키 도출에 대한 권장 사항을 준수합니다.

키 파생 함수는 64바이트의 키 구성 요소를 반환합니다. 양 당사자가 올바른 키 구성 요소를 사용하도록 하기 위해 는 처음 32바이트를 커밋 키로 사용하고 마지막 32바이트를 공유 래핑 키로 AWS Encryption SDK 사용합니다. 복호화 시 키링이 메시지 헤더 암호 텍스트에 저장된 것과 동일한 커밋 키와 공유 래핑 키를 복제할 수 없는 경우 작업이 실패합니다. 예를 들어 Alice의 프라이빗 키와 Bob의 퍼블릭 키로 구성된 키링으로 데이터를 암호화하는 경우 Bob의 프라이빗 키와 Alice의 퍼블릭 키로 구성된 키링은 동일한 커밋 키와 공유 래핑 키를 복제하고 데이터를 해독할 수 있습니다. Bob의 퍼블릭 키가 AWS KMS key 페어에서 가져온 경우 Bob은 AWS KMS ECDH 키링을 생성하여 데이터를 복호화할 수 있습니다.

원시 ECDH 키링은 AES-를 사용하여 대칭 키로 데이터를 암호화합니다GCM. 그런 다음 데이터 키는 AES-를 사용하여 파생된 공유 래핑 키로 암호화된 봉투입니다GCM. 각 원시 ECDH 키링에는 하나의 공유 래핑 키만 있을 수 있지만 다중 ECDH 키링 에 단독으로 또는 다른 키링과 함께 여러 원시 키을 포함할 수 있습니다.

프라이빗 키를 생성, 저장 및 보호할 책임은 주로 하드웨어 보안 모듈(HSM) 또는 키 관리 시스템에 있습니다. 발신자와 수신자의 키 페어는 동일한 타원 곡선에 많이 있습니다. 는 AWS Encryption SDK 다음과 같은 타원 정육면체 사양을 지원합니다.

  • ECC_NIST_P256

  • ECC_NIST_P384

  • ECC_NIST_P512

프로그래밍 언어 호환성

Raw ECDH 키링은 암호화 자료 공급자 라이브러리(MPL) 버전 1.5.0에 도입되었으며 다음 프로그래밍 언어 및 버전에서 지원됩니다.

  • 의 버전 3.x AWS Encryption SDK for Java

  • AWS Encryption SDK 용 의 버전 4.x.NET

  • 선택적 MPL 종속성과 함께 사용되는 AWS Encryption SDK for Python경우 의 버전 4.x.

원시 ECDH 키링 생성

원시 ECDH 키링은 RawPrivateKeyToStaticPublicKey, 및 EphemeralPrivateKeyToStaticPublicKey의 세 가지 키 계약 스키마를 지원합니다PublicKeyDiscovery. 선택하는 키 계약 스키마에 따라 수행할 수 있는 암호화 작업과 키 지정 자료가 조립되는 방식이 결정됩니다.

RawPrivateKeyToStaticPublicKey

RawPrivateKeyToStaticPublicKey 키 계약 스키마를 사용하여 키링에서 발신자의 프라이빗 키와 수신자의 퍼블릭 키를 정적으로 구성합니다. 이 키 계약 스키마는 데이터를 암호화하고 해독할 수 있습니다.

RawPrivateKeyToStaticPublicKey 키 계약 스키마를 사용하여 원시 ECDH 키링을 초기화하려면 다음 값을 제공합니다.

  • 발신자의 프라이빗 키

    RFC 5958에 정의된 대로 발신자의 PEM인코딩된 프라이빗 키(PKCS #8 PrivateKeyInfo 구조)를 제공해야 합니다.

  • 수신자의 퍼블릭 키

    5280에 정의된 대로 수신자의 DER인코딩된 X.509 퍼블릭 키, 즉 SubjectPublicKeyInfo (SPKI)를 제공해야 합니다. RFC

    비대칭 키 계약 키 KMS 페어의 퍼블릭 키 또는 외부에서 생성된 키 페어의 퍼블릭 키를 지정할 수 있습니다 AWS.

  • 곡선 사양

    지정된 키 페어에서 타원 곡선 사양을 식별합니다. 발신자와 수신자의 키 페어 모두 곡선 사양이 동일해야 합니다.

    유효한 값: ECC_NIST_P256, ECC_NIS_P384, ECC_NIST_P512

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

다음 Java 예제에서는 RawPrivateKeyToStaticPublicKey 키 계약 스키마를 사용하여 발신자의 프라이빗 키와 수신자의 퍼블릭 키를 정적으로 구성합니다. 두 키 페어 모두 ECC_NIST_P256 곡선에 있습니다.

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

다음 Python 예제에서는 RawEcdhStaticConfigurationsRawPrivateKeyToStaticPublicKey 키 계약 스키마를 사용하여 발신자의 프라이빗 키와 수신자의 퍼블릭 키를 정적으로 구성합니다. 두 키 페어 모두 ECC_NIST_P256 곡선에 있습니다.

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

EphemeralPrivateKeyToStaticPublicKey 키 계약 스키마로 구성된 키링은 로컬에서 새 키 페어를 생성하고 각 암호화 호출에 대해 고유한 공유 래핑 키를 도출합니다.

이 키 계약 스키마는 메시지만 암호화할 수 있습니다. EphemeralPrivateKeyToStaticPublicKey 키 계약 스키마로 암호화된 메시지를 복호화하려면 동일한 수신자의 퍼블릭 키로 구성된 검색 키 계약 스키마를 사용해야 합니다. 복호화하려면 PublicKeyDiscovery 키 계약 알고리즘과 함께 원시 ECDH 키링을 사용하거나 수신자의 퍼블릭 키가 비대칭 키 계약 KMS 키 페어에 속한 경우 키 계약 스키마와 함께 KmsPublicKeyDiscovery 키링을 사용할 AWS KMS ECDH 수 있습니다.

EphemeralPrivateKeyToStaticPublicKey 키 계약 스키마를 사용하여 원시 ECDH 키링을 초기화하려면 다음 값을 제공합니다.

  • 수신자의 퍼블릭 키

    5280에 정의된 대로 수신자의 DER인코딩된 X.509 퍼블릭 키, 즉 SubjectPublicKeyInfo (SPKI)를 제공해야 합니다. RFC

    비대칭 키 계약 키 KMS 페어의 퍼블릭 키 또는 외부에서 생성된 키 페어의 퍼블릭 키를 지정할 수 있습니다 AWS.

  • 곡선 사양

    지정된 퍼블릭 키에서 타원 곡선 사양을 식별합니다.

    암호화 시 키링은 지정된 곡선에 새 키 페어를 생성하고 새 프라이빗 키와 지정된 퍼블릭 키를 사용하여 공유 래핑 키를 도출합니다.

    유효한 값: ECC_NIST_P256, ECC_NIS_P384, ECC_NIST_P512

C# / .NET

다음 예제에서는 EphemeralPrivateKeyToStaticPublicKey 키 계약 스키마를 사용하여 원시 ECDH 키링을 생성합니다. 암호화 시 키링은 지정된 ECC_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

다음 예제에서는 EphemeralPrivateKeyToStaticPublicKey 키 계약 스키마를 사용하여 원시 ECDH 키링을 생성합니다. 암호화 시 키링은 지정된 ECC_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

다음 예제에서는 RawEcdhStaticConfigurationsEphemeralPrivateKeyToStaticPublicKey 키 계약 스키마를 사용하여 Raw ECDH 키링을 생성합니다. 암호화 시 키링은 지정된 ECC_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

복호화할 때 에서 사용할 AWS Encryption SDK 수 있는 래핑 키를 지정하는 것이 가장 좋습니다. 이 모범 사례를 따르려면 발신자의 프라이빗 ECDH 키와 수신자의 퍼블릭 키를 모두 지정하는 키링을 사용합니다. 그러나 Raw ECDH discovery 키링, 즉 지정된 ECDH 키의 퍼블릭 키가 메시지 암호 텍스트에 저장된 수신자의 퍼블릭 키와 일치하는 모든 메시지를 복호화할 수 있는 Raw 키링을 생성할 수도 있습니다. 이 키 계약 스키마는 메시지만 복호화할 수 있습니다.

중요

PublicKeyDiscovery 키 계약 스키마를 사용하여 메시지를 복호화할 때 누가 소유하든 관계없이 모든 퍼블릭 키를 수락합니다.

PublicKeyDiscovery 키 계약 스키마를 사용하여 원시 ECDH 키링을 초기화하려면 다음 값을 제공합니다.

  • 수신자의 정적 프라이빗 키

    RFC 5958에 정의된 대로 수신자의 PEM인코딩된 프라이빗 키(PKCS #8 PrivateKeyInfo 구조)를 제공해야 합니다.

  • 곡선 사양

    지정된 프라이빗 키에서 타원 곡선 사양을 식별합니다. 발신자와 수신자의 키 페어 모두 곡선 사양이 동일해야 합니다.

    유효한 값: ECC_NIST_P256, ECC_NIS_P384, ECC_NIST_P512

C# / .NET

다음 예제에서는 PublicKeyDiscovery 키 계약 스키마를 사용하여 원시 ECDH 키링을 생성합니다. 이 키링은 지정된 프라이빗 키의 퍼블릭 키가 메시지 암호 텍스트에 저장된 수신자의 퍼블릭 키와 일치하는 모든 메시지를 복호화할 수 있습니다.

// 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

다음 예제에서는 PublicKeyDiscovery 키 계약 스키마를 사용하여 원시 ECDH 키링을 생성합니다. 이 키링은 지정된 프라이빗 키의 퍼블릭 키가 메시지 암호 텍스트에 저장된 수신자의 퍼블릭 키와 일치하는 모든 메시지를 복호화할 수 있습니다.

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

다음 예제에서는 RawEcdhStaticConfigurationsPublicKeyDiscovery 키 계약 스키마를 사용하여 원시 ECDH 키링을 생성합니다. 이 키링은 지정된 프라이빗 키의 퍼블릭 키가 메시지 암호 텍스트에 저장된 수신자의 퍼블릭 키와 일치하는 모든 메시지를 복호화할 수 있습니다.

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)