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

如何修复PowerShell中AES-128-CBC解密的密钥长度错误?

问题分析与修正方案

你的代码存在四个核心问题,导致密钥长度错误及解密失败,以下是具体修改点和修正后的完整代码:


需要修改的关键部分

  • 密钥/IV的字节转换方式错误:直接将char[]转byte[]会使用.NET默认的UTF-16编码,而测试网站默认用UTF-8编码处理字符串密钥和IV,必须显式指定UTF-8编码获取字节数组。
  • 密钥长度不符合AES-128要求:AES-128要求密钥长度为16字节(128位),你的密钥nszxnqbq1s转UTF-8后仅10字节,需补0字节至16字节(测试网站的默认处理逻辑)。
  • 加密数据未做Base64解码:$data是Base64编码的密文,必须先解码为字节数组才能传入解密方法。
  • 填充模式设置错误:测试网站默认使用PKCS7填充,而非None,需修正填充模式。

修正后的完整代码

# test-data from https://www.coderstool.com/aes-decryption
# should return 'CodersTool secret message'

$data = "Y+egIFaYXtHdRKFVg5h80Bn/6dECi5iiPgr2L9Bd8LY="
$iv   = "rwj76dfsotja10tk"
$key  = "nszxnqbq1s"

# 1. 将密钥转UTF-8字节并补0至16字节(AES-128要求)
$keyBytes = [System.Text.Encoding]::UTF8.GetBytes($key)
$aesKey = [byte[]]::CreateInstance([byte], 16)
[System.Array]::Copy($keyBytes, $aesKey, $keyBytes.Length)

# 2. 将IV转UTF-8字节(IV长度刚好16字节,符合AES要求)
$ivBytes = [System.Text.Encoding]::UTF8.GetBytes($iv)

# 3. 初始化AES对象
$aes = [System.Security.Cryptography.Aes]::Create()
$aes.Key = $aesKey
$aes.IV = $ivBytes
$aes.Mode = [System.Security.Cryptography.CipherMode]::CBC
$aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7

# 4. 解码Base64密文并解密
$cipherBytes = [System.Convert]::FromBase64String($data)
$decryptor = $aes.CreateDecryptor()
$plainBytes = $decryptor.TransformFinalBlock($cipherBytes, 0, $cipherBytes.Length)

# 5. 将解密后的字节转字符串并输出
$plainText = [System.Text.Encoding]::UTF8.GetString($plainBytes)
Write-Output $plainText

# 清理资源
$decryptor.Dispose()
$aes.Dispose()

代码说明

  • 密钥补0:通过创建16字节数组并复制原密钥字节,剩余位置自动填充0,匹配测试网站的密钥处理逻辑。
  • 编码统一:全程使用UTF-8编码,确保和测试网站的字符转字节逻辑一致。
  • Base64解码:密文必须先从Base64字符串还原为原始加密字节数组。
  • 填充模式修正:PKCS7是AES加密的通用填充方式,符合测试网站的默认配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:25:41