You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS KMS解密本地加密文件时遇InvalidCiphertextException求助

AWS KMS本地文件解密失败排查与解决

问题背景

已通过AWS控制台创建客户托管KMS密钥,使用AWS CLI加密本地文件成功,但解密时遇到报错;调整路径前缀后报错消失,却出现解密结果与原文件内容不符的问题。

KMS密钥信息

执行aws kms describe-key命令输出如下:

{
    "KeyMetadata": {
        "AWSAccountId": "<redacted>",
        "KeyId": "<redacted>",
        "Arn": "arn:aws:kms:eu-west-2:<redacted>:key/<redeacted>",
        "CreationDate": "2022-11-01T14:02:40.684000+00:00",
        "Enabled": true,
        "Description": "CST MED1 FORT-B",
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "Origin": "AWS_KMS",
        "KeyManager": "CUSTOMER",
        "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
        "KeySpec": "SYMMETRIC_DEFAULT",
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ],
        "MultiRegion": false
    }
}

加密操作(执行成功)

使用以下命令加密本地文件field342med1,生成加密文件field342med1.encrypted:

aws kms encrypt --key-id <redacted> --plaintext fileb://field342med1 --output text --query CiphertextBlob --region eu-west-2 > field342med1.encrypted

解密操作问题

  1. 初始解密命令触发报错:
aws kms decrypt --ciphertext-blob fileb://field342med1.encrypted --query Plaintext

报错信息:

An error occurred (InvalidCiphertextException) when calling the Decrypt operation:
  1. 将fileb://改为file://后报错消失,但解密输出内容与原明文文件完全不符。

原因分析与解决方法

核心原因

加密时使用--output text --query CiphertextBlob,把加密后的二进制数据Base64编码为文本格式写入了文件,但解密时:

  • 用fileb://会直接读取文件的二进制内容,而文件实际是Base64文本,导致传入的CiphertextBlob格式错误,触发InvalidCiphertextException。
  • 用file://读取文本后,AWS CLI会自动将其视为Base64编码内容解码,但解密后的Plaintext默认会以Base64格式输出,直接查看显示的是编码字符串而非原文件内容。

正确解密步骤

方法1:适配现有加密文件的解密命令

解密时指定输出格式为文本,再通过base64解码还原原文件:

aws kms decrypt --ciphertext-blob file://field342med1.encrypted --output text --query Plaintext --region eu-west-2 | base64 --decode > field342med1.decrypted

可通过以下命令验证结果一致性:

diff field342med1 field342med1.decrypted

方法2:使用二进制模式处理加密文件(推荐)

如果加密时直接输出二进制数据,解密流程会更直观:

  • 加密命令(直接输出二进制):
aws kms encrypt --key-id <redacted> --plaintext fileb://field342med1 --output binary --query CiphertextBlob --region eu-west-2 > field342med1.encrypted.bin
  • 解密命令(读取二进制加密文件):
aws kms decrypt --ciphertext-blob fileb://field342med1.encrypted.bin --output binary --query Plaintext --region eu-west-2 > field342med1.decrypted

关键注意点

  • fileb://用于读取二进制文件,file://用于读取文本文件,需根据加密时输出的文件格式选择对应前缀。
  • AWS CLI的--output text会将二进制字段(如CiphertextBlob、Plaintext)自动做Base64编码,--output binary则直接输出原始二进制数据。
  • 解密后的Plaintext若用--output text输出,必须经过Base64解码才能还原原文件内容。

内容的提问来源于stack exchange,提问作者RizAcn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:35:30