在这个例子中我需要考虑字节顺序吗?
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
数组中的字节。
我正在编写一个 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
数组中的字节。