我正在学校开展一个项目,我们在网络上建立了一个简单的密钥分发中心,用河豚加密。我已成功编码并使其在同端机器上运行。当我必须将它发送到另一个端点的机器时,问题就出现了。密钥作为字符数组加密,并通过网络发送和接收。在任一端打印加密密钥时,它会显示相同的加密字符串,但解密失败。我试过反转数组的顺序和解密,但结果是一样的。
我的问题:
在这种情况下,我对char数组的反转是否是处理endian问题的正确方法?
问题可能是它已经在一个端点样式的机器上加密了,并且在小端机器上无法使用相同的算法解密吗? (这是我使用的河豚的版本:http://www.codeproject.com/KB/security/blowfish.aspx)
答案 0 :(得分:2)
这取决于算法实现。查看implementation your are using(查看BytesToBlock
和BlockToBytes
函数),它将字节块转换为无符号整数。
此转换依赖于endian,因此必须根据正在运行的机器的字节顺序调整算法。
答案 1 :(得分:0)
Endianness适用于数据中较小的元素。如果一个不同的endian机器无法读取你的char
数组,那么它可能意味着它以相同的顺序期望字节,但它们的位被反转。
因此,您需要反转char
元素中的位顺序。您的数组顺序应保持不变。
答案 2 :(得分:0)
字节可能以某种容量反转,但这通常只发生在数字上(参见https://beej.us/guide/bgnet/html/multi/htonsman.html)。更可能的是每个char中的位数。在解密之前,您只需要一个简单的算法来切换它们。当然,如果位AND字节被反转,那就更有趣了。
现在,它显示相同的字符串这一事实让我相信问题实际上并不在字符数组中 - 它在解密算法本身中依赖于字节顺序。在这种情况下,您肯定需要查看上面的链接并考虑您对多字节类型执行的操作。 (64位字节序切换器通常必须手动编写,但字节交换不是一种难以编写的算法。)