如何在tcl中使用aes算法解密十六进制流

时间:2014-07-08 14:47:39

标签: tcl

我使用带有密钥的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ý

有人可以帮我吗?

1 个答案:

答案 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]
}

使用的标准Tcl命令的备忘单:

  • binary format H*将十六进制序列转换为字节字符串
  • binary scan … A*从字节串中读取前导非零字节
  • encoding convertfrom接受一个字节字符串,并将这些字节解释为使用给定编码编码的文本(encoding convertto朝另一个方向)。