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

PowerShell AES-256密钥与IV编码适配在线解密问题

AES-256密钥/IV编码适配在线解码器问题

我偶然找到一段生成AES-256密钥的PowerShell代码,现在想给密钥和IV选正确的编码方式,让任意在线AES-256解码器都能解密对应的密文。当前要求密钥长度32字节、IV长度16字节,但把Base64字符串转UTF-8、十进制值转换后都出现了未知字符。

运行输出

2023-08-31T12:22:44.583 [Information] INFORMATION: AES-Key is OSyqOu9mCEFOORD0ziDRs98+qro/Fztdn9Oev9T9Ewc= : 57 44 170 58 239 102 8 65 78 57 16 244 206 32 209 179 223 62 170 186 63 23 59 93 159 211 158 191 212 253 19 7 : 9,ª:ïfV9UG>,Πѳß>ªº?ëc;Ó¿ÔýÅ

2023-08-31T12:22:44.649 [Information] INFORMATION: IV : ijsDZzP9n7u2q8EEHLBo9g== : 138 59 3 103 51 253 159 187 182 171 193 4 28 176 104 246 : ;#};»¶«Á*QLhö

2023-08-31T12:22:44.649 [Information] INFORMATION: EncryptedString is ijsDZzP9n7u2q8EEHLBo9ghBKy4ES0yosW3Elwu/R9o=

用到的PowerShell脚本

function Create-AesKey() {
    $aesManaged = Create-AesManagedObject
    $aesManaged.GenerateKey()
    [System.Convert]::ToBase64String($aesManaged.Key)
}

function Encrypt-String($key, $unencryptedString) {
    $bytes = [System.Text.Encoding]::UTF8.GetBytes($unencryptedString)
    $aesManaged = Create-AesManagedObject $key
    $encryptor = $aesManaged.CreateEncryptor()
    $encryptedData = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length);
    [byte[]] $fullData = $aesManaged.IV + $encryptedData
    $iv = [Convert]::ToBase64String($aesManaged.IV)
    Write-Host "IV = $iv : $($aesManaged.IV)"
    $aesManaged.Dispose()
    [System.Convert]::ToBase64String($fullData)
}

$key = Create-AesKey
$okey = [System.Convert]::FromBase64String($key)
Write-Host "AES-Key is $key : $okey"
$unencryptedString = "blahblahblah"
$encryptedString = Encrypt-String $key $unencryptedString
Write-Host "EncryptedString is $encryptedString"

解决方案

核心问题:密钥/IV是二进制数据,不能直接转UTF-8

AES密钥和IV是纯二进制字节序列,不是文本字符串,强行转UTF-8必然出现乱码(因为很多字节组合不是合法的UTF-8编码点)。在线解码器需要的是密钥/IV的原始二进制表示,通常通过以下两种方式输入:

  1. 直接使用Base64编码
    脚本输出的密钥(OSyqOu9mCEFOORD0ziDRs98+qro/Fztdn9Oev9T9Ewc=)和IV(ijsDZzP9n7u2q8EEHLBo9g==)本身就是标准Base64格式,大多数在线解码器都支持直接输入Base64格式的密钥和IV,这是最省心的方式。

  2. 转成十六进制字符串
    如果解码器只支持十六进制输入,把密钥/IV的字节数组转成十六进制字符串即可。比如你的密钥字节数组57 44 170 58 ...转成十六进制就是5744AA3AEF6608414E3910F4CE20D1B9DF3EAABA63173B5D9FD39EBFD4FD1307(注意去掉空格,统一小写或大写)。
    可以用PowerShell快速转换:

    # 密钥转十六进制
    $keyHex = [BitConverter]::ToString($okey).Replace('-', '').ToLower()
    # IV转十六进制(需在Encrypt-String函数内获取IV字节数组后转换)
    $ivHex = [BitConverter]::ToString($aesManaged.IV).Replace('-', '').ToLower()
    

解密时的注意事项

  • 确认在线解码器的AES模式:脚本里的Create-AesManagedObject默认是CBC模式,填充方式是PKCS7,解密时必须匹配这些参数。
  • 密文处理:脚本输出的EncryptedString是IV + 加密数据拼接后转的Base64,解密时需要先把Base64转成字节数组,前16字节是IV,剩下的是真正的密文数据。如果在线解码器要求分开输入IV和密文,要拆分后再输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:27:11