このトピックでは、Alibaba Cloud CLI を例に使用して、非対称カスタマーマスターキー (CMK) を使用してデータを暗号化および復号化する方法を説明します。 KMS SDK を使用してこの操作を実行することもできます。

通常、非対称暗号化は次の手順で行います。
  1. 情報受信者が公開鍵を送信者に配布します。
  2. 送信者が公開鍵を使用して機密情報を暗号化します。
  3. 送信者が機密情報から生成された暗号テキストを受信者に送信します。
  4. 受信者は秘密鍵を使用して暗号テキストを復号化します。

始める前に

KMS で非対称キーを作成するには、CreateKey操作を実行する必要があります。 非対称キーを作成する際、KeySpec パラメーターを希望のキータイプに設定し、Usage パラメーターをENCRYPT/DECRYPT に設定します。

RSA 暗号化キーを作成します。

$ aliyun kms CreateKey --KeySpec=RSA_2048 --KeyUsage=ENCRYPT/DECRYPT --ProtectionLevel=HSM

公開鍵の取得

1. GetPublicKey を呼び出して、非対称キーペアの公開鍵を取得します。

$ aliyun kms GetPublicKey --KeyId=**** --KeyVersionId=****

想定結果は以下のとおりです。

{
        "RequestId": "82c383eb-c377-4mf6-bxx8-81hkc1g5g7ab",
        "KeyId": "****",
        "KeyVersionId": "****",
        "PublicKey": "PublicKey-DataBlob"
}
2. 公開鍵をファイル rsa_publickey.pub に保存します。 (PublicKey-DataBlob はプレースホルダーです。 取得した公開鍵に置き換える必要があります):
$ echo PublicKey-DataBlob > rsa_publickey.pub

公開鍵を使用したデータの暗号化

1. サンプルのプレーンテキストファイル plaintext-file.txt を作成し、"this is plaintext" を含めます。

echo "this is plaintext" > plaintext-file.txt

2. OpenSSL を使用してファイルを暗号化し、取得したバイナリ暗号テキストを次のファイルに書き込みます: plaintext-file.enc

openssl pkeyutl -encrypt -in plaintext-file.txt \ 
  -inkey rsa_publickey.pub -pubin \
  -pkeyopt rsa_padding_mode:oaep \
  -pkeyopt rsa_oaep_md:sha256 \
  -pkeyopt rsa_mgf1_md:sha256 \
  -out plaintext-file.enc

KMS API 実行によるデータの復号化

KMS API を実行して、秘密鍵でデータを復号化する必要があります。

1. ネットワーク経由で送信する前に暗号化されたデータを Base64 エンコードします。
$ openssl base64 -in plaintext-file.enc
次の Base64 エンコード暗号テキストが返されます。
5kdCB06HHeAwgfH9ARY4/9Nv5vlpQ94GXZcmaC9FE59Aw8v8RYdozT6ggSbyZbi+
8STKVq9402MEfmUDmwJLuu0qgAZsCe5wU4JWHh1y84Qn6HT068j0qOy5X2HIlrjs
fCdetgtMtVorSgb3bbERk2RV67nHWrDkecNbUaz+6ik4AlZxv2uWrV62eQ9yUBYm
Jb956LbqnfWdCFxUSHH/qB5QCnLpijzvPmfNlZr653H4nF08gpZjnmlF4FjTu3i2
mGLzK4J3Rh/l7PQHiVMdc4hSnXosg68QmMVdZBGLK9/cD9SYngPDiirU7z0q7Git
dIeloyCAUDFyuQC6a+SqzA==
2. Base64 でエンコードされた暗号テキストを KMS に移してデータを復号化します。
aliyun kms AsymmetricDecrypt \
  --KeyId **** \
  --KeyVersionId **** \
  --Algorithm RSAES_OAEP_SHA_256 \
  --CiphertextBlob 5kdCB06HHeAwgfH9ARY4/9Nv5vlpQ94GXZcmaC9FE59Aw8v8RYdozT6ggSbyZbi+8STKVq9402MEfmUDmwJLuu0qgAZsCe5wU4JWHh1y84Qn6HT068j0qOy5X2HIlrjsfCdetgtMtVorSgb3bbERk2RV67nHWrDkecNbUaz+6ik4AlZxv2uWrV62eQ9yUBYmJb956LbqnfWdCFxUSHH/qB5QCnLpijzvPmfNlZr653H4nF08gpZjnmlF4FjTu3i2mGLzK4J3Rh/l7PQHiVMdc4hSnXosg68QmMVdZBGLK9/cD9SYngPDiirU7z0q7GitdIeloyCAUDFyuQC6a+SqzA==
想定結果は以下のとおりです。
{
        "KeyId": "****",
        "KeyVersionId": "****",
        "Plaintext": "dGhpcyBpcyBwbGFpbnRleHQgDQo=",
        "RequestId": "6be7a8e4-35b9-4549-ad05-c5b1b535a22c"
}
3. Base64 で返された Base64 エンコードされたプレーンテキストをデコードします。
echo dGhpcyBpcyBwbGFpbnRleHQgDQo= | openssl base64 -d
復号化された次のプレーンテキストデータが返されます。
this is plaintext