비대칭 키 사양 - AWS Key Management Service

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

비대칭 키 사양

다음 주제에서는 AWS KMS 가 비대칭 KMS 키에 대해 지원하는 키 사양에 대한 기술 정보를 제공합니다. 비교를 위해 대칭 암호화 키에 대한 SYMMETRIC_DEFAULT 키 사양 정보가 포함되어 있습니다.

RSA 키 사양

RSA 키 사양을 사용하는 경우 RSA 키 쌍이 있는 비대칭 KMS 키를 AWS KMS 생성합니다. 개인 키는 암호화되지 않은 상태로 유지되지 않습니다. AWS KMS 퍼블릭 키를 내부에서 AWS KMS사용하거나 퍼블릭 키를 다운로드하여 외부에서 사용할 수 있습니다. AWS KMS

주의

외부 데이터를 암호화하는 경우 암호문을 해독할 수 있는지 확인하십시오. AWS KMS AWS KMS에서 삭제된 KMS 키의 퍼블릭 키, 서명 및 확인을 위해 구성된 KMS 키의 퍼블릭 키 또는 KMS 키에서 지원하지 않는 암호화 알고리즘을 사용하는 경우 데이터를 복구할 수 없습니다.

에서는 비대칭 KMS 키를 RSA 키 쌍과 함께 암호화와 암호 해독 AWS KMS, 서명 및 확인에 사용할 수 있지만 둘 다 사용할 수는 없습니다. 키 사용이라고 하는 이 속성은 키 사양과는 별도로 결정되지만 키 사양을 선택하기 전에 먼저 결정해야 합니다.

AWS KMS 암호화와 암호 해독 또는 서명 및 확인을 위해 다음과 같은 RSA 키 사양을 지원합니다.

  • RSA_2048

  • RSA_3072

  • RSA_4096

RSA 키 사양은 RSA 키 길이(비트)에 따라 다릅니다. 선택하는 RSA 키 사양은 보안 표준 또는 작업 요구 사항에 따라 결정될 수 있습니다. 일반적으로 작업에 실용적이고 저렴한 키 중에서 가장 큰 키를 사용하세요. RSA 키 사양이 다른 KMS 키에 대한 암호화 작업의 경우에는 가격이 다르게 책정됩니다. AWS KMS 요금에 대한 자세한 내용은 AWS 키 관리 서비스 요금을 참조하십시오. 요청 할당량에 대한 자세한 내용은 요청 할당량 섹션을 참조하세요.

암호화 및 해독을 위한 RSA 키 사양

RSA 비대칭 KMS 키가 암호화 및 해독에 사용되는 경우 퍼블릭 키로 암호화하고 프라이빗 키로 해독합니다. RSA KMS 키에 AWS KMS 대한 Encrypt 작업을 호출하면 RSA 키 쌍의 퍼블릭 키와 지정한 암호화 알고리즘을 사용하여 데이터를 암호화합니다. AWS KMS 암호문을 해독하려면 Decrypt 작업을 호출하고 동일한 KMS 키와 암호화 알고리즘을 지정하십시오. AWS KMS 그런 다음 RSA 키 쌍의 개인 키를 사용하여 데이터를 복호화합니다.

또한 공개 키를 다운로드하여 외부 데이터를 암호화하는 데 사용할 수 있습니다. AWS KMS RSA KMS 키를 AWS KMS 지원하는 암호화 알고리즘을 사용해야 합니다. 암호화 텍스트를 해독하려면 동일한 KMS 키 및 암호화 알고리즘을 사용하여 Decrypt 함수를 호출합니다.

AWS KMS RSA 키 사양의 KMS 키에 대해 두 가지 암호화 알고리즘을 지원합니다. PKCS #1 v2.2에 정의된 이러한 알고리즘은 내부적으로 사용하는 해시 함수가 다릅니다. AWS KMS에서 RSAES_OAEP 알고리즘은 해싱 용도와 마스크 생성 함수(MGF1)에 항상 동일한 해시 함수를 사용합니다. 암호화(Encrypt)해독(Decrypt) 작업을 호출할 때 암호화 알고리즘을 지정해야 합니다. 각 요청마다 다른 알고리즘을 선택할 수 있습니다.

RSA 키 사양에 지원되는 암호화 알고리즘
암호화 알고리즘 알고리즘 설명
RSAES_OAEP_SHA_1 PKCS #1 v2.2, Section 7.1. 빈 레이블과 함께 해시 및 MGF1 마스크 생성 기능 모두에 SHA-1을 사용하는 OAEP 패딩 포함 RSA 암호화입니다.
RSAES_OAEP_SHA_256 PKCS #1, Section 7.1. 빈 레이블과 함께 해시 및 MGF1 마스크 생성 기능 모두에 SHA-256을 사용하는 OAEP 패딩 포함 RSA 암호화입니다.

특정 암호화 알고리즘을 사용하도록 KMS 키를 구성할 수는 없습니다. 하지만 kms: EncryptionAlgorithm policy 조건을 사용하여 보안 주체가 KMS 키와 함께 사용할 수 있는 암호화 알고리즘을 지정할 수 있습니다.

KMS 키의 암호화 알고리즘을 가져오려면 콘솔에서 KMS 키의 암호화 구성을 보거나 작업을 사용하십시오. AWS KMS DescribeKey AWS KMS 또한 AWS KMS 콘솔에서 또는 작업을 사용하여 공개 키를 다운로드할 때 키 사양과 암호화 알고리즘을 제공합니다. GetPublicKey

각 요청에서 암호화할 수 있는 일반 텍스트 데이터의 길이를 기준으로 RSA 키 사양을 선택할 수 있습니다. 다음 표에서는 Encrypt 작업을 한 번 호출하여 암호화할 수 있는 일반 텍스트의 최대 크기(바이트)를 보여 줍니다. 값은 키 사양 및 암호화 알고리즘에 따라 다릅니다. 예를 들어, 대칭 암호화 KMS 키를 사용하여 한 번에 최대 4,096바이트까지 암호화할 수 있습니다.

이러한 알고리즘에 대한 최대 일반 텍스트 길이(바이트)를 계산하려면 다음 공식을 사용하세요. (키 크기(비트) / 8) - (2 * 해시 길이(비트)/8) - 2. 예를 들어 SHA-256을 사용하는 RSA_2048의 경우 바이트 단위의 최대 일반 텍스트 크기는 (2048/8) - (2 * 256/8) - 2 = 190입니다.

암호화 작업의 최대 일반 텍스트 크기(바이트)
암호화 알고리즘
키 사양 RSAES_OAEP_SHA_1 RSAES_OAEP_SHA_256
RSA_2048 214 190
RSA_3072 342 318
RSA_4096 470 446

서명 및 확인을 위한 RSA 키 사양

서명 및 확인에 RSA 비대칭 KMS 키를 사용하는 경우 프라이빗 키를 사용하여 메시지에 대한 서명을 생성하고 퍼블릭 키를 사용하여 서명을 확인합니다.

비대칭 KMS 키에 AWS KMS 대한 Sign 작업을 호출하면 RSA 키 쌍의 프라이빗 키, 메시지 및 지정한 서명 알고리즘을 AWS KMS 사용하여 서명을 생성합니다. 서명을 확인하려면 확인 작업을 호출합니다. 서명과 함께 동일한 KMS 키, 메시지 및 서명 알고리즘을 지정합니다. AWS KMS 그런 다음 RSA 키 쌍의 공개 키를 사용하여 서명을 확인합니다. 공개 키를 다운로드하여 외부 서명을 확인하는 데 사용할 수도 있습니다. AWS KMS

AWS KMS RSA 키 사양이 있는 모든 KMS 키에 대해 다음과 같은 서명 알고리즘을 지원합니다. 서명확인 작업을 호출할 때 서명 알고리즘을 지정해야 합니다. 각 요청마다 다른 알고리즘을 선택할 수 있습니다. RSA 키 페어로 서명하는 경우에는 RSASSA-PSS 알고리즘을 사용하는 것이 선호됩니다. 기존 애플리케이션과의 호환성을 위해 RSASSA-PKCS1-V1_5 알고리즘이 포함되었습니다.

RSA 키 사양에 지원되는 서명 알고리즘
서명 알고리즘 알고리즘 설명
RSASSA_PSS_SHA_256 PKCS #1 v2.2, Section 8.1(256비트 솔트와 함께 메시지 다이제스트 및 MGF1 마스크 생성 기능 모두에 SHA-256을 사용하는 PSS 패딩 포함 RSA 서명)
RSASSA_PSS_SHA_384 PKCS #1 v2.2, Section 8.1(384비트 솔트와 함께 메시지 다이제스트 및 MGF1 마스크 생성 기능 모두에 SHA-384를 사용하는 PSS 패딩 포함 RSA 서명)
RSASSA_PSS_SHA_512 PKCS #1 v2.2, Section 8.1(512비트 솔트와 함께 메시지 다이제스트 및 MGF1 마스크 생성 기능 모두에 SHA-512를 사용하는 PSS 패딩 포함 RSA 서명)
RSASSA_PKCS1_V1_5_SHA_256 PKCS #1 v2.2, Section 8.2(PKCS #1v1.5 패딩 및 SHA-256을 사용하는 RSA 서명)
RSASSA_PKCS1_V1_5_SHA_384 PKCS #1 v2.2, Section 8.2(PKCS #1v1.5 패딩 및 SHA-384를 사용하는 RSA 서명)
RSASSA_PKCS1_V1_5_SHA_512 PKCS #1 v2.2, Section 8.2(PKCS #1v1.5 패딩 및 SHA-512를 사용하는 RSA 서명)

특정 서명 알고리즘을 사용하도록 KMS 키를 구성할 수는 없습니다. 하지만 kms: SigningAlgorithm policy 조건을 사용하여 보안 주체가 KMS 키와 함께 사용할 수 있는 서명 알고리즘을 지정할 수 있습니다.

KMS 키의 서명 알고리즘을 가져오려면 콘솔에서 또는 작업을 사용하여 KMS 키의 암호화 구성을 확인하십시오. AWS KMS DescribeKey AWS KMS 또한 AWS KMS 콘솔에서 또는 작업을 사용하여 공개 키를 다운로드할 때 키 사양 및 서명 알고리즘을 제공합니다. GetPublicKey

타원 곡선 키 사양

타원 곡선 (ECC) 키 사양을 사용하는 경우 서명 및 확인 또는 공유 암호 도출 (둘 다 제외) 에 ECC 키 쌍이 있는 비대칭 KMS 키를 AWS KMS 생성합니다. 서명을 생성하거나 공유 암호를 도출하는 개인 키는 암호화되지 않은 상태로 유지되지 않습니다. AWS KMS 퍼블릭 키를 사용하여 내부의 AWS KMS서명을 확인하거나 퍼블릭 키를 다운로드하여 외부에서 사용할 수 있습니다. AWS KMS

AWS KMS 비대칭 KMS 키에 대해 다음과 같은 ECC 키 사양을 지원합니다.

  • NIST에서 권장하는 비대칭 타원 곡선 키 쌍 (서명 및 확인 또는 공유 암호 도출)

    • ECC_NIST_P256(secp256r1)

    • ECC_NIST_P384(secp384r1)

    • ECC_NIST_P521(secp521r1)

  • 기타 비대칭 타원 곡선 키 페어(서명 및 확인)

    • ECC_SECG_P256K1(secp256k1), 일반적으로 암호 화폐에 사용됨.

선택하는 ECC 키 사양은 보안 표준 또는 작업 요구 사항에 따라 결정될 수 있습니다. 일반적으로 작업에 실용적이고 저렴한 곡선 중에서 가장 포인트가 많은 곡선을 사용하세요.

비대칭 KMS 키를 생성하여 공유 암호를 도출하는 경우 NIST에서 권장하는 타원 곡선 키 사양 중 하나를 사용하십시오. 공유 암호 도출을 위해 지원되는 유일한 키 계약 알고리즘은 타원 곡선 암호화 코팩터 디피-헬만 프리미티브 (ECDH) 입니다.

암호 화폐에 사용할 비대칭 KMS 키를 생성하는 경우 ECC_SECG_P256K1 키 사양을 사용하세요. 이 키 사양은 다른 용도로도 사용할 수 있지만 비트코인 및 기타 암호 화폐에는 필수입니다.

ECC 키 사양이 다른 KMS 키는 요금이 다르게 책정되며 다른 요청 할당량이 적용됩니다. AWS KMS 요금에 AWS Key Management Service 대한 자세한 내용은 요금을 참조하십시오. 요청 할당량에 대한 자세한 내용은 요청 할당량 섹션을 참조하세요.

다음 표에는 각 ECC 키 사양을 AWS KMS 지원하는 서명 알고리즘이 나와 있습니다. 특정 서명 알고리즘을 사용하도록 KMS 키를 구성할 수는 없습니다. 하지만 kms: SigningAlgorithm policy 조건을 사용하여 보안 주체가 KMS 키와 함께 사용할 수 있는 서명 알고리즘을 지정할 수 있습니다.

ECC 키 사양에 지원되는 서명 알고리즘
키 사양 서명 알고리즘 알고리즘 설명
ECC_NIST_P256 ECDSA_SHA_256 NIST FIPS 186-4, Section 6.4(메시지 다이제스트를 위해 키 및 SHA-256에 의해 지정된 곡선을 사용하는 ECDSA 서명.)
ECC_NIST_P384 ECDSA_SHA_384 NIST FIPS 186-4, Section 6.4(메시지 다이제스트를 위해 키 및 SHA-384에 의해 지정된 곡선을 사용하는 ECDSA 서명.)
ECC_NIST_P521 ECDSA_SHA_512 NIST FIPS 186-4, Section 6.4(메시지 다이제스트를 위해 키 및 SHA-512에 의해 지정된 곡선을 사용하는 ECDSA 서명.)
ECC_SECG_P256K1 ECDSA_SHA_256 NIST FIPS 186-4, Section 6.4(메시지 다이제스트를 위해 키 및 SHA-256에 의해 지정된 곡선을 사용하는 ECDSA 서명.)

오프라인에서 공유 암호 도출

ECC 키 쌍의 퍼블릭 키를 다운로드하여 오프라인 작업, 즉 외부 작업에 사용할 수 있습니다. AWS KMS

다음 OpenSSL 안내에서는 ECC KMS 키 쌍의 공개 키와 OpenSSL로 만든 개인 키를 AWS KMS 사용하지 않고 공유 암호를 도출하는 한 가지 방법을 보여줍니다.

  1. OpenSSL에서 ECC 키 쌍을 생성하고 함께 사용할 수 있도록 준비하십시오. AWS KMS

    // Create an ECC key pair in OpenSSL and save the private key in openssl_ecc_key_priv.pem export OPENSSL_CURVE_NAME="P-256" export KMS_CURVE_NAME="ECC_NIST_P256" export OPENSSL_KEY1_PRIV_PEM="openssl_ecc_key1_priv.pem" openssl ecparam -name ${OPENSSL_CURVE_NAME} -genkey -out ${OPENSSL_KEY1_PRIV_PEM} // Derive the public key from the private key export OPENSSL_KEY1_PUB_PEM="openssl_ecc_key1_pub.pem" openssl ec -in ${OPENSSL_KEY1_PRIV_PEM} -pubout -outform pem \ -out ${OPENSSL_KEY1_PUB_PEM} // View the PEM file containing the public key and extract the public key as a // Base64 encoded string into OPENSSL_KEY1_PUB_BASE64 for use with AWS KMS export OPENSSL_KEY1_PUB_BASE64=`cat ${OPENSSL_KEY1_PUB_PEM} | \ tee /dev/stderr | grep -v "PUBLIC KEY" | tr -d "\n"`
  2. ECC 키 계약 키 페어를 생성하고 AWS KMS OpenSSL과 함께 사용할 수 있도록 준비하십시오.

    // Create a KMS key on the same curve as the key pair from step 1 // with a key usage of KEY_AGREEMENT // Save its ARN in KMS_KEY1_ARN. export KMS_KEY1_ARN=`aws kms create-key --key-spec ${KMS_CURVE_NAME} \ --key-usage KEY_AGREEMENT | tee /dev/stderr | jq -r .KeyMetadata.Arn` // Download the public key and save the Base64-encoded version in KMS_KEY1_PUB_BASE64 export KMS_KEY1_PUB_BASE64=`aws kms get-public-key --key-id ${KMS_KEY1_ARN} | \ tee /dev/stderr | jq -r .PublicKey` // Create a PEM file for the public KMS key for use with OpenSSL export KMS_KEY1_PUB_PEM="aws_kms_ecdh_key1_pub.pem" echo "-----BEGIN PUBLIC KEY-----" > ${KMS_KEY1_PUB_PEM} echo ${KMS_KEY1_PUB_BASE64} | fold -w 64 >> ${KMS_KEY1_PUB_PEM} echo "-----END PUBLIC KEY-----" >> ${KMS_KEY1_PUB_PEM}
  3. OpenSSL의 개인 키와 공개 KMS 키를 사용하여 OpenSSL에서 공유 암호를 도출합니다.

    export OPENSSL_SHARED_SECRET1_BIN="openssl_shared_secret1.bin" openssl pkeyutl -derive -inkey ${OPENSSL_KEY1_PRIV_PEM} \ -peerkey ${KMS_KEY1_PUB_PEM} -out ${OPENSSL_SHARED_SECRET1_BIN}

SM2 키 사양(중국 리전 전용)

SM2 키 사양은 China's Office of State Commercial Cryptography Administration(OSCCA)에서 공개한 GM/T 사양 시리즈 내에 정의된 타원형 커브 키 사양입니다. SM2 키 사양은 중국 리전에서만 사용할 수 있습니다. SM2 키 사양을 사용하는 경우 SM2 키 쌍이 있는 비대칭 KMS 키를 AWS KMS 생성합니다. SM2 키 쌍을 내에서 AWS KMS사용하거나 외부에서 사용하기 위해 공개 키를 다운로드할 수 있습니다. AWS KMS

각 KMS 키에는 하나의 키 사용만 있을 수 있습니다. SM2 KMS 키는 서명 및 확인, 암호화 및 암호 해독, 공유 암호 도출 등에 사용할 수 있습니다. KMS 키를 생성할 때 키 사용을 지정해야 하고, 키를 만든 후에는 변경할 수 없습니다.

비대칭 KMS 키를 생성하여 공유 암호를 도출하는 경우 SM2 키 사양을 사용하세요. 공유 암호를 추출하기 위해 지원되는 유일한 키 계약 알고리즘은 타원 곡선 암호화 코팩터 디피-헬만 프리미티브 (ECDH) 입니다.

AWS KMS 다음과 같은 SM2 암호화 및 서명 알고리즘을 지원합니다.

  • SM2PKE 암호화 알고리즘

    SM2PKE는 OSCCA가 GM/T 0003.4-2012에서 정의한 타원형 커브 기반 암호화 알고리즘입니다.

  • SM2DSA 서명 알고리즘

    SM2DSA는 OSCCA가 GM/T 0003.2-2012에서 정의한 타원형 커브 기반 서명 알고리즘입니다. SM2DSA 에는 SM3 해싱 알고리즘으로 해시된 다음 전달된 메시지 또는 메시지 다이제스트와 결합되는 고유 ID가 필요합니다. AWS KMS그런 다음 이 연결된 값을 해시하고 서명합니다. AWS KMS

SM2를 사용한 오프라인 작업(중국 리전 전용)

오프라인 작업, 즉 AWS KMS외의 작업에 사용하는 SM2 키 페어의 퍼블릭 키를 다운로드할 수 있습니다. 그러나 SM2 퍼블릭 키를 오프라인으로 사용하면 추가적인 변환과 계산을 수작업으로 수행해야 할 수 있습니다. SM2DSA 작업은 구분 ID를 제공하거나 메시지 다이제스트를 계산해야 할 수 있습니다. SM2PKE 암호화 작업을 수행하려면 원시 암호문 출력을 허용할 수 있는 형식으로 변환해야 할 수 있습니다. AWS KMS

이러한 작업을 돕기 위해 Java용 SM2OfflineOperationHelper 클래스에는 이 태스크를 수행하는 메서드가 있습니다. 이 도우미 클래스를 다른 암호화 공급자의 모델로 사용할 수 있습니다.

중요

SM2OfflineOperationHelper 참조 코드는 Bouncy Castle 버전 1.68과 호환되도록 설계되었습니다. 다른 버전에 대한 도움말은 bouncycastle.org를 참조하세요.

SM2 키 페어를 사용한 오프라인 인증(중국 리전 전용)

SM2 공개 키를 AWS KMS 사용하여 외부의 서명을 확인하려면 고유 ID를 지정해야 합니다. 원시 메시지를 서명 API로 전달할 때는 GM/T 0009-2012의 OSCCA에서 정의한 기본 식별 ID를 AWS KMS 사용합니다. MessageType:RAW1234567812345678 AWS KMS내에서 구분 ID를 지정할 수 없습니다.

그러나 외부에서 메시지 다이제스트를 생성하는 경우 고유 ID를 지정한 다음 메시지 다이제스트를 전달하여 서명할 수 있습니다. AWSMessageType:DIGEST AWS KMS 이를 위해서는 SM2OfflineOperationHelper 클래스에서 DEFAULT_DISTINGUISHING_ID 값을 변경합니다. 구분 ID는 최대 8,192자 이내의 문자열로 지정할 수 있습니다. 메시지 다이제스트에 AWS KMS 서명하고 나면 메시지 다이제스트 또는 메시지와 다이제스트를 계산하는 데 사용되는 식별 ID가 있어야 오프라인에서 확인할 수 있습니다.

SM2OfflineOperationHelper 클래스

AWS KMS내부에서는 원시 암호문 변환과 SM2DSA 메시지 다이제스트 계산이 자동으로 수행됩니다. 모든 암호화 공급자가 동일한 방식으로 SM2를 구현하는 것은 아닙니다. OpenSSL 버전 1.1.1 이상과 같은 일부 라이브러리는 이러한 작업을 자동으로 수행합니다. AWS KMS OpenSSL 버전 3.0으로 테스트하여 이 동작을 확인했습니다. Bouncy Castle과 같은 라이브러리와 함께 다음 SM2OfflineOperationHelper 클래스를 사용하여 이러한 변환과 계산을 수작업으로 수행해야 합니다.

SM2OfflineOperationHelper 클래스는 다음 오프라인 작업에 대한 메서드를 제공합니다.

  • 메시지 다이제스트 계산

    오프라인 확인에 사용하거나 서명을 위해 전달할 수 있는 메시지 다이제스트를 오프라인으로 AWS KMS 생성하려면 메서드를 사용하십시오. calculateSM2Digest calculateSM2Digest 메서드는 SM3 해싱 알고리즘으로 메시지 다이제스트를 생성합니다. GetPublicKeyAPI는 공개 키를 바이너리 형식으로 반환합니다. 바이너리 키를 PublicKey Java로 파싱해야 합니다. 파싱된 퍼블릭 키에 메시지를 제공합니다. 이 방법은 메시지와 기본 구분 ID, 1234567812345678를 자동으로 결합하지만 DEFAULT_DISTINGUISHING_ID 값을 변경하면 자체적인 구분 ID를 설정할 수 있습니다.

  • Verify

    오프라인에서 서명을 인증하려면 offlineSM2DSAVerify 메서드를 사용하세요. offlineSM2DSAVerify 메서드는 지정된 구분 ID에서 계산된 메시지 다이제스트와 디지털 서녕 인증에 제공하는 원본 메시지를 사용합니다. GetPublicKeyAPI는 공개 키를 바이너리 형식으로 반환합니다. 바이너리 키를 PublicKey Java로 파싱해야 합니다. 파싱된 공개 키에 원본 메시지와 인증하려는 서명을 제공합니다. 자세한 내용은 SM2 키 페어로 오프라인 인증을 참조하세요.

  • 암호화

    일반 텍스트를 오프라인에서 암호화하려면 offlineSM2PKEEncrypt 메서드를 사용합니다. 이 메서드는 암호문이 해독할 수 있는 형식으로 되어 있는지 확인합니다. AWS KMS offlineSM2PKEEncrypt 메서드는 일반 텍스트를 암호화한 다음, SM2PKE에서 생성한 원본 사이퍼퍼텍스트를 ASN.1 형식으로 변환합니다. GetPublicKeyAPI는 공개 키를 바이너리 형식으로 반환합니다. 바이너리 키를 PublicKey Java로 파싱해야 합니다. 파싱된 공개 키에 암호화하려는 일반 텍스트를 제공합니다.

    변환을 수행해야 하는지 확신하기 어려운 경우, 다음 OpenSSL 작업을 사용하여 사이퍼텍스트의 형식을 테스트합니다. 작업이 실패할 경우, 사이퍼텍스트를 ASN.1 형식으로 변환합니다.

    openssl asn1parse -inform DER -in ciphertext.der

기본적으로 SM2OfflineOperationHelper 클래스는 SM2DSA 작업에 대한 메시지 다이제스트를 생성할 때 기본 구분 ID, 1234567812345678를 사용합니다.

package com.amazon.kms.utils; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java.io.IOException; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.PublicKey; import org.bouncycastle.crypto.CryptoException; import org.bouncycastle.jce.interfaces.ECPublicKey; import java.util.Arrays; import org.bouncycastle.asn1.ASN1EncodableVector; import org.bouncycastle.asn1.ASN1Integer; import org.bouncycastle.asn1.DEROctetString; import org.bouncycastle.asn1.DERSequence; import org.bouncycastle.asn1.gm.GMNamedCurves; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.params.ParametersWithID; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.crypto.signers.SM2Signer; import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil; public class SM2OfflineOperationHelper { // You can change the DEFAULT_DISTINGUISHING_ID value to set your own distinguishing ID, // the DEFAULT_DISTINGUISHING_ID can be any string up to 8,192 characters long. private static final byte[] DEFAULT_DISTINGUISHING_ID = "1234567812345678".getBytes(StandardCharsets.UTF_8); private static final X9ECParameters SM2_X9EC_PARAMETERS = GMNamedCurves.getByName("sm2p256v1"); // ***calculateSM2Digest*** // Calculate message digest public static byte[] calculateSM2Digest(final PublicKey publicKey, final byte[] message) throws NoSuchProviderException, NoSuchAlgorithmException { final ECPublicKey ecPublicKey = (ECPublicKey) publicKey; // Generate SM3 hash of default distinguishing ID, 1234567812345678 final int entlenA = DEFAULT_DISTINGUISHING_ID.length * 8; final byte [] entla = new byte[] { (byte) (entlenA & 0xFF00), (byte) (entlenA & 0x00FF) }; final byte [] a = SM2_X9EC_PARAMETERS.getCurve().getA().getEncoded(); final byte [] b = SM2_X9EC_PARAMETERS.getCurve().getB().getEncoded(); final byte [] xg = SM2_X9EC_PARAMETERS.getG().getXCoord().getEncoded(); final byte [] yg = SM2_X9EC_PARAMETERS.getG().getYCoord().getEncoded(); final byte[] xa = ecPublicKey.getQ().getXCoord().getEncoded(); final byte[] ya = ecPublicKey.getQ().getYCoord().getEncoded(); final byte[] za = MessageDigest.getInstance("SM3", "BC") .digest(ByteBuffer.allocate(entla.length + DEFAULT_DISTINGUISHING_ID.length + a.length + b.length + xg.length + yg.length + xa.length + ya.length).put(entla).put(DEFAULT_DISTINGUISHING_ID).put(a).put(b).put(xg).put(yg).put(xa).put(ya) .array()); // Combine hashed distinguishing ID with original message to generate final digest return MessageDigest.getInstance("SM3", "BC") .digest(ByteBuffer.allocate(za.length + message.length).put(za).put(message) .array()); } // ***offlineSM2DSAVerify*** // Verify digital signature with SM2 public key public static boolean offlineSM2DSAVerify(final PublicKey publicKey, final byte [] message, final byte [] signature) throws InvalidKeyException { final SM2Signer signer = new SM2Signer(); CipherParameters cipherParameters = ECUtil.generatePublicKeyParameter(publicKey); cipherParameters = new ParametersWithID(cipherParameters, DEFAULT_DISTINGUISHING_ID); signer.init(false, cipherParameters); signer.update(message, 0, message.length); return signer.verifySignature(signature); } // ***offlineSM2PKEEncrypt*** // Encrypt data with SM2 public key public static byte[] offlineSM2PKEEncrypt(final PublicKey publicKey, final byte [] plaintext) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, IOException { final Cipher sm2Cipher = Cipher.getInstance("SM2", "BC"); sm2Cipher.init(Cipher.ENCRYPT_MODE, publicKey); // By default, Bouncy Castle returns raw ciphertext in the c1c2c3 format final byte [] cipherText = sm2Cipher.doFinal(plaintext); // Convert the raw ciphertext to the ASN.1 format before passing it to AWS KMS final ASN1EncodableVector asn1EncodableVector = new ASN1EncodableVector(); final int coordinateLength = (SM2_X9EC_PARAMETERS.getCurve().getFieldSize() + 7) / 8 * 2 + 1; final int sm3HashLength = 32; final int xCoordinateInCipherText = 33; final int yCoordinateInCipherText = 65; byte[] coords = new byte[coordinateLength]; byte[] sm3Hash = new byte[sm3HashLength]; byte[] remainingCipherText = new byte[cipherText.length - coordinateLength - sm3HashLength]; // Split components out of the ciphertext System.arraycopy(cipherText, 0, coords, 0, coordinateLength); System.arraycopy(cipherText, cipherText.length - sm3HashLength, sm3Hash, 0, sm3HashLength); System.arraycopy(cipherText, coordinateLength, remainingCipherText, 0,cipherText.length - coordinateLength - sm3HashLength); // Build standard SM2PKE ASN.1 ciphertext vector asn1EncodableVector.add(new ASN1Integer(new BigInteger(1, Arrays.copyOfRange(coords, 1, xCoordinateInCipherText)))); asn1EncodableVector.add(new ASN1Integer(new BigInteger(1, Arrays.copyOfRange(coords, xCoordinateInCipherText, yCoordinateInCipherText)))); asn1EncodableVector.add(new DEROctetString(sm3Hash)); asn1EncodableVector.add(new DEROctetString(remainingCipherText)); return new DERSequence(asn1EncodableVector).getEncoded("DER"); } }

SYMMETRIC_DEFAULT 키 사양

기본 키 사양인 SYMMETRIC_DEFAULT는 대칭 암호화 KMS 키의 키 사양입니다. AWS KMS 콘솔에서 대칭 키 유형과 암호화 및 암호 해독 키 사용을 선택하면 키 사양이 선택됩니다. SYMMETRIC_DEFAULT CreateKey작업 시 KeySpec 값을 지정하지 않으면 SYMMETRIC_DEFAULT가 선택됩니다. 다른 키 사양을 사용할 이유가 없다면 SYMMETRIC_DEFAULT가 좋은 선택입니다.

SYMMETRIC_DEFAULT는 현재 보안 암호화를 위한 업계 표준인 256비트 키가 있는 Galois Counter Mode(GCM)의 고급 암호화 표준(AES)을 기반으로 하는 대칭 알고리즘인 AES-256-GCM을 나타냅니다. 이 알고리즘이 생성하는 암호화 텍스트는 암호화 컨텍스트와 같은 추가 인증 데이터(AAD)를 지원하며 GCM은 암호화 텍스트에 대한 추가 무결성 검사를 제공합니다. 자세한 내용은 AWS Key Management Service 암호화 세부 정보 섹션을 참조하세요.

AES-256-GCM으로 암호화된 데이터는 미래에도 보호됩니다. 암호 전문가는 이 알고리즘을 양자 저항으로 간주합니다. 256비트 AES-GCM 키로 생성된 암호화 텍스트에 대한 이론적인 미래의 대규모 양자 컴퓨팅 공격은 키의 효과적 보안을 128비트로 감소시킵니다. 하지만 이 보안 수준은 암호문에 대한 무차별 대입 공격을 불가능하게 만들기에 충분합니다. AWS KMS

단, 중국 리전은 SYMMETRIC_DEFAULT가 SM4 암호화를 사용하는 128비트 대칭적 키를 나타냅니다. 중국 리전 내에서는 128비트 SM4 키만 생성할 수 있습니다. 중국 리전에서는 256비트 AES-GCM KMS 키를 생성할 수 없습니다.

대칭 암호화 KMS 키를 사용하여 데이터를 암호화, 복호화 및 재암호화하고 생성된 데이터 키와 데이터 키 쌍을 보호할 수 있습니다. AWS KMS AWS 와 통합된 서비스는 대칭 암호화 KMS 키를 AWS KMS 사용하여 저장된 데이터를 암호화합니다. 대칭 암호화 KMS 키로 자체 키 구성 요소를 가져오고 사용자 지정 키 스토어에서 대칭 암호화 KMS 키를 생성할 수 있습니다. 대칭 및 비대칭 KMS 키에서 수행할 수 있는 작업을 비교하는 표는 대칭 및 비대칭 KMS 키 비교 섹션을 참조하세요.

대칭 암호화 키에 대한 기술 세부 정보 AWS KMS 및 대칭 암호화 키는 암호화 세부 정보를 참조하십시오.AWS Key Management Service