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的原始二进制表示,通常通过以下两种方式输入:
直接使用Base64编码
脚本输出的密钥(OSyqOu9mCEFOORD0ziDRs98+qro/Fztdn9Oev9T9Ewc=)和IV(ijsDZzP9n7u2q8EEHLBo9g==)本身就是标准Base64格式,大多数在线解码器都支持直接输入Base64格式的密钥和IV,这是最省心的方式。转成十六进制字符串
如果解码器只支持十六进制输入,把密钥/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
相关产品推荐
相关产品推荐

