원시 키링 ECDH - AWS Encryption SDK

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

원시 키링 ECDH

중요

Raw ECDH 키링은 버전 4에서만 사용할 수 있습니다. 형태의 x AWS Encryption SDK . NET및 버전 3. 의 x AWS Encryption SDK for Java. Raw ECDH 키링은 머티리얼 프로바이더 라이브러리 버전 1.5.0에 도입되었습니다.

Raw ECDH 키링은 사용자가 제공한 타원 곡선 공개-개인 키 쌍을 사용하여 양 당사자 간에 공유된 래핑 키를 생성합니다. 먼저, 키링은 발신자의 개인 키, 수신자의 공개 키, 타원 곡선 Diffie-Hellman () 키 계약 알고리즘을 사용하여 공유 암호를 도출합니다. ECDH 그런 다음 키링은 공유 암호를 사용하여 데이터 암호화 키를 보호하는 공유 래핑 키를 추출합니다. 공유 래핑 키를 추출하기 위해 AWS Encryption SDK 사용 (KDF_CTR_HMAC_SHA384) 하는 키 파생 함수는 키 파생 권장 사항을 준수합니다NIST.

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

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

개인 키를 생성, 저장 및 보호하는 것은 사용자의 책임이며, 가급적이면 하드웨어 보안 모듈 () HSM 또는 키 관리 시스템에서 개인 키를 생성, 저장 및 보호할 책임이 있습니다. 발신자와 수신자의 키 페어는 같은 타원 곡선을 그려야 합니다. 는 다음과 같은 타원 곡선 사양을 AWS Encryption SDK 지원합니다.

  • ECC_NIST_P256

  • ECC_NIST_P384

  • ECC_NIST_P512

원시 키링 만들기 ECDH

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

RawPrivateKeyToStaticPublicKey

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

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

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

EphemeralPrivateKeyToStaticPublicKey

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

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

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

C# / .NET

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

PublicKeyDiscovery

복호화할 때는 사용할 수 있는 래핑 키를 지정하는 것이 좋습니다. AWS Encryption SDK 이 모범 사례를 따르려면 보낸 사람의 개인 키와 받는 사람의 공개 키를 모두 지정하는 ECDH 키링을 사용하십시오. 하지만 원시 ECDH 검색 키링, 즉 지정된 키의 공개 키가 메시지 암호문에 저장된 수신자의 공개 키와 일치하는 경우 메시지를 해독할 수 있는 원시 ECDH 키링을 만들 수도 있습니다. 이 키 계약 스키마는 메시지의 암호만 해독할 수 있습니다.

중요

PublicKeyDiscovery키 계약 스키마를 사용하여 메시지를 해독하면 소유자에 관계없이 모든 공개 키를 수락합니다.

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

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

다음 예시에서는 키 계약 스키마를 사용하여 원시 ECDH 키링을 만듭니다. PublicKeyDiscovery 이 키링은 지정된 개인 키의 공개 키가 메시지 암호문에 저장된 수신자의 공개 키와 일치하는 모든 메시지를 해독할 수 있습니다.

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