在这个例子中我需要考虑字节顺序吗?

Do I need to consider endianness in this example?

我正在编写一个 encryption/decryption 算法,我从文件中读取 字节 块,施展魔法,然后将这些块写回到文件中。 我的部分算法使用联合。我将字节填充到 bytes_io 字段中,然后再次从 words_io 字段中取出它们并应用一些 uint32_t 位掩码。

union {
    uint32_t words_io[GKO_BLOCK_SIZE / sizeof(uint32_t)];
    uint8_t bytes_io[GKO_BLOCK_SIZE];                       
} transformOut;

我假设(也是我的问题)我不必担心平台字节序会影响我从 union 的词字段中吸取的词,因为 union 实际上只存储我推入其中的字节流首先(并且不会根据访问对它们重新排序。)

我说得对吗?

恐怕你的假设是不正确的:

  • 从输入中读取字节并存储联合字段的 bytes_io 字节的方式在以 4 块为单位读取时将被视为 int32_t 值肯定会受到系统字节序的影响.

例如,假设您的加密技术是简单的独占或应用于 words_io 成员的元素。除非密钥恰好是字节序对称的,否则异或运算的结果在小端系统和大端系统上会有所不同。在大端手机中应用此密码将与接收加密消息的小端 PC 上的相同代码 运行 不兼容。

如果您的密码使用 int32_t 的数组,您必须采取以下步骤:

  • 将输入字节读入 bytes_io 块并用适当的值填充 GKO_BLOCK_SIZE 字节。
  • 应用字节交换以对 words_io 数组中的所有单词强制执行指定的字节顺序。例如,在读取字节后使用 ntohl(),在写入字节之前使用 htonl()。这将是大端系统上的空操作。或者,您可以使用其他方法测试字节顺序,如果它与指定的默认值不同,则使用 bswap32()
  • 将您的密码应用于 words_io 数组,用于加密或解密。
  • 以相反的方式应用字节交换,使用 htonl() 或其他一些适当的方式。
  • 输出 bytes_io 数组中的字节。