我使用带有密钥的online tool解密了示例文本。
现在我尝试使用tcl。
中的aes包解密获取的十六进制数据示例:
使用上述工具解密hello world
。
使用密钥:121301080D010518130E082007136412
获取十六进制数据:edb191802afcec0deca6c9d725063cbc
set hexData "edb191802afcec0deca6c9d725063cbc"
set key 121301080D010518130E082007136412
aes::aes -hex -mode ecb -dir decrypt -key $key $hexData 5bc428095e1cacdcef56f11c2bcdee58fe3d93098f641849831db0bce1e655fd <<<<
当我将此十六进制转换为字符串时,我看到以下输出
[Ä( ^¬ÜïVñ+ÍîXþ=“ dIƒ°¼áæUý
有人可以帮我吗?
答案 0 :(得分:1)
不建议使用-hex
选项;它只是处理aes::aes
命令的输出,以便以十六进制呈现。它不做的是将输入视为十六进制。
您需要将密钥和加密数据作为二进制值,而您目前将它们都作为十六进制字符串。虽然转换并不难; binary format H*
将完全按照要求执行,并且似乎可以执行所需操作(从交互式会话中剪切粘贴):
% aes::aes -dir decrypt -mode ecb -key [binary format H* $key] [binary format H* $hexData]
hello world
(CBC是默认模式。)
请注意,我认为您可能想要从该结果中删除尾随的NUL,并且可能将字节重新解释为UTF-8(或者在另一端使用的任何其他编码;记住,Tcl的字符串通常用术语定义虚拟Unicode字符,而不是字节序列)。让我们把这一切都包含在可靠性程序中:
proc decryptAES {keyHex encryptedHex {encoding "utf-8"}} {
set key [binary format H* $keyHex]
set encrypted [binary format H* $encryptedHex]
set decrypted [aes::aes -dir decrypt -mode ecb -key $key $encrypted]
binary scan $decrypted A* bytes
return [encoding convertfrom $encoding $bytes]
}
binary format H*
将十六进制序列转换为字节字符串binary scan … A*
从字节串中读取前导非零字节encoding convertfrom
接受一个字节字符串,并将这些字节解释为使用给定编码编码的文本(encoding convertto
朝另一个方向)。