如何修复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
相关产品推荐
相关产品推荐

