Windows 和 Linux 对于 ElAES.pas 的不同结果

Different results on Windows and Linux for ElAES.pas

我正在尝试为 Linux 编译我的项目,在 ElAES.pas 中有这样的代码:

type
  TAESKey256 = array [0..31] of byte;
  TAESExpandedKey256 = array [0..63] of longword;
  PLongWord = ^LongWord;

procedure ExpandAESKeyForEncryption(const Key: TAESKey256; var ExpandedKey: TAESExpandedKey256); overload;
begin
  ExpandedKey[0] := PLongWord(@Key[0])^;
  ExpandedKey[1] := PLongWord(@Key[4])^;
  ExpandedKey[2] := PLongWord(@Key[8])^;
  ExpandedKey[3] := PLongWord(@Key[12])^;
  ExpandedKey[4] := PLongWord(@Key[16])^;
  ExpandedKey[5] := PLongWord(@Key[20])^;
  ExpandedKey[6] := PLongWord(@Key[24])^;
  ExpandedKey[7] := PLongWord(@Key[28])^;

我在 Windows(32/64 位)上的 ExpandedKey 中有一个结果,在 Linux 和 MacOS 上有不同的结果。两个平台上的键值相同。我应该更改什么才能在 Linux/MAC 上获得与在 Windows 上相同的结果?

通常,如果代码在 Win32 中运行正常,我会在 Win64 中进行测试。这有助于捕获与 32 位和 64 位的某些类型的不同长度相关的错误。这一直对我有用,但只有在这种情况下才有效。上面的代码在 Win64 中运行正常。但在 MacOS 中使用时出现错误。我最后想到的是字体大小的差异。事实证明 - 徒劳无功。 LongWord 原来是一种非常奇怪的类型,它的大小对于 Windows 32/64 位是相同的,而对于 Linux/MacOS 则更大。更改模块中的类型后,一切都可以在任何位深度的所有平台上运行。

type
  TAESKey256 = array [0..31] of byte;
  TAESExpandedKey256 = array [0..63] of UInt32;
  PUInt32 = ^UInt32;

procedure ExpandAESKeyForEncryption(const Key: TAESKey256; var ExpandedKey: TAESExpandedKey256); overload;
begin
  ExpandedKey[0] := PUInt32(@Key[0])^;
  ExpandedKey[1] := PUInt32(@Key[4])^;
  ExpandedKey[2] := PUInt32(@Key[8])^;
  ExpandedKey[3] := PUInt32(@Key[12])^;