能否用AWS KMS解密外部用其公钥加密的载荷?
问题
能否通过AWS KMS服务解密外部用其公钥加密的载荷?
场景说明:将KMS非对称密钥的公钥提供给客户端,客户端无需调用KMS服务,直接用公钥加密生成JWE载荷,服务端通过KMS服务解密该载荷。已知KMS私钥无法下载,解密必须在KMS服务内完成,但尝试基础场景时抛出<InvalidCiphertextException>异常,似乎KMS无法解密非自身加密的内容。
使用环境:.NET 8、AWSSDK.KeyManagementService.3.7.304版本
测试代码:
var pkey = await _kmsClient.GetPublicKeyAsync(new GetPublicKeyRequest { KeyId = _keyId}); using (RSA rsa = RSA.Create()) { rsa.ImportSubjectPublicKeyInfo(pkey.PublicKey.ToArray(), out _); rsa.ExportParameters(false); encryptedCek = rsa.Encrypt(cek, RSAEncryptionPadding.OaepSHA256); } var dec = await _kmsClient.DecryptAsync(new DecryptRequest { CiphertextBlob = new MemoryStream(Convert.FromBase64String(Convert.ToBase64String(encryptedCek))), KeyId = _keyId, EncryptionAlgorithm = EncryptionAlgorithmSpec.RSAES_OAEP_SHA_256 });
预期载荷能被解密,但KMS服务SDK抛出InvalidCiphertextException异常,尝试不转换Base64也得到相同结果。
回答
不行,AWS KMS的Decrypt API仅支持解密由KMS自身加密生成的密文,无法直接处理外部用KMS公钥加密的内容。原因是KMS加密产出的密文包含专属元数据(如密钥ID、加密上下文等),Decrypt API依赖这些元数据完成解密流程,而外部加密的内容没有这类元数据,因此会触发InvalidCiphertextException。
要实现客户端用KMS公钥加密、服务端通过KMS解密的场景,需使用KMS的AsymmetricDecrypt API,该接口专门用于解密用KMS公钥加密的内容,只要加密算法与KMS密钥支持的算法匹配即可。
修改后的代码示例:
var pkey = await _kmsClient.GetPublicKeyAsync(new GetPublicKeyRequest { KeyId = _keyId}); using (RSA rsa = RSA.Create()) { rsa.ImportSubjectPublicKeyInfo(pkey.PublicKey.ToArray(), out _); encryptedCek = rsa.Encrypt(cek, RSAEncryptionPadding.OaepSHA256); } // 替换为AsymmetricDecryptAsync接口 var dec = await _kmsClient.AsymmetricDecryptAsync(new AsymmetricDecryptRequest { CiphertextBlob = new MemoryStream(encryptedCek), KeyId = _keyId, EncryptionAlgorithm = EncryptionAlgorithmSpec.RSAES_OAEP_SHA_256 });
注意事项:
- 确保你的KMS密钥为非对称密钥(类型为RSA或ECC),对称密钥不支持
AsymmetricDecrypt操作。 - 加密时使用的算法必须与KMS密钥配置的加密算法一致,例如示例中的
RSAES_OAEP_SHA_256,需确认目标KMS密钥支持该算法。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

