0

我正在使用 AES 程序,加密格式的输出是一个字节数组。从一串给我

e37c1a5132a9a121d4fbb98ba42a684

但是十六进制数组应该是

e3 7c 1a 51 32 a9 a1 21 d4 fb b9 8b 0a 42 a6 84

第 4 到最后一项是 0a,但在连接的字符串中显示为纯 a。我怎样才能检测到这个?

在下面的附加链接中,我试图从第一个生成的链接转到一个字节数组,但是当我在 0a 中缺少 0 时,字符串会崩溃。

http://laurentcharignon.com/blog/?p=37

4

2 回答 2

2

这种丢失的信息是不可恢复的。您必须修复生成此损坏字符串的位置。用于生成上述字符串的另一个有效源字符串是:

e3 7c 1a 51 32 a9 a1 21 d4 fb b9 8b a4 02 a6 84

这里 0 稍后插入一个位置。在技​​术层面上,无法推断出这些源字符串中的哪一个被用于生成上述去掉零的十六进制表示。

于 2013-09-22T07:04:44.230 回答
2

问题在于,在循环中,函数结果在小于 16 的值的前缀hex()后不包含前导零,因此is和is (调用是不必要的)。所以而不是:'0x'hex(10)'0xa'hex(10)[2:]'a'str()

result = ""
for char in ciph:
    result += str((hex(ord(char))))[2:]

你可以避免使用hex()这样的东西:

result = ""
for char in ciph:
    result += '%02x' % ord(char)

做同样事情的一个稍微更简洁的方法是使用生成器表达式:

result = ''.join('%02x' % ord(char) for char in ciph)

可以使用以下稍微不同的表达式在每个 2 字节十六进制值之间添加空格,以使结果更具可读性:

       ' '.join('%02x' % ord(char) for char in ciph)
于 2013-09-22T09:15:53.507 回答