【问题标题】:How to represent the elements of the Galois filed GF(2^8) and perform arithmetic in NTL library如何表示伽罗瓦域 GF(2^8) 的元素并在 NTL 库中进行算术运算
【发布时间】:2021-08-17 05:22:34
【问题描述】:

我是 NTL 库的新手,因为它的 GF2XGF2EGF2EX 等。现在,我想在 Galois 字段 GF(2^8) 上执行乘法运算。问题如下:

Rijndael (standardised as AES) uses the characteristic 2 finite field with 256 elements, 
which can also be called the Galois field GF(2^8). 
It employs the following reducing polynomial for multiplication:
x^8 + x^4 + x^3 + x^1 + 1.

例如,{53} • {CA} = {01} 在 Rijndael 的字段中,因为

(x^6 + x^4 + x + 1)(x^7 + x^6 + x^3 + x)
= (x^13 + x^12 + x^9 + x^7) + (x^11 + x^10 + x^7 + x^5) + (x^8 + x^7 + x^4 + x^2) + (x^7 + x^6 + x^3 + x)
= x^13 + x^12 + x^9 + x^11 + x^10 + x^5 + x^8 + x^4 + x^2 + x^6 + x^3 + x
= x^13 + x^12 + x^11 + x^10 + x^9 + x^8 + x^6 + x^5 + x^4 + x^3 + x^2 + x

and
x^13 + x^12 + x^11 + x^10 + x^9 + x^8 + x^6 + x^5 + x^4 + x^3 + x^2 + x modulo x^8 + x^4 + x^3 + x^1 + 1
=   (11111101111110 mod 100011011)
=   {3F7E mod 11B} = {01}
=   1 (decimal)

我的问题是如何在NTL 中表示减少多项式x^8 + x^4 + x^3 + x^1 + 1 和多项式x^6 + x^4 + x + 1x^7 + x^6 + x^3 + x。然后对这些多项式进行乘法运算,得到结果{01}

这是我使用这个库的一个很好的例子。

【问题讨论】:

  • 如果您的目标是使用 GF(2^8) 符号(作为字节)而不是 NTL,那么创建 log 和 exp 表真的很容易。几年前我这样做是为了支持 NTL 用于 ECC 数学。现在使用 constexpr 真的很容易。
  • 我不懂NTL,但是看文档,好像可以用| ZZ_p::init(ZZ(2)); | ZZ_pX P; | BuildIrred(P, 8); |初始化一个约简多项式,然后将其更改为 1 + x + x^3 + x^4 + x^8。一旦你改变了 P 以匹配 AES 减少多项式,其余的应该是直截了当的。该字段的元素存储为多项式的 8 个元素系数,最低有效位在前。我不知道是否有内置函数可以在字节和 8 项系数之间进行转换。正如 doug 所说,使用字节实现 GF(2^8) 的数学运算会更简单。
  • 感谢您的回答。在这里,我想举一个例子来更好地使用我的问题中提到的 NTL 的有限字段类。
  • 解释和可以直接运行的示例程序是更好的答案。

标签: c++ number-theory ntl finite-field


【解决方案1】:

再说一次,我不知道 NTL,我在 Windows 7 上运行 Visual Studio 2015。我已经下载了我需要的东西,但必须使用所有提供的源文件构建一个库,这需要一段时间才能完成弄清楚。但是,根据另一个答案,这应该可以帮助您入门。首先,初始化 GF(256) 的约简多项式:

GF2X P;                      // apparently the length doesn't need to be set
SetCoeff(P, 0, 1);
SetCoeff(P, 1, 1);
SetCoeff(P, 3, 1);
SetCoeff(P, 4, 1);
SetCoeff(P, 8, 1);
GF2E::init(P);

接下来,将变量赋值为多项式:

GF2X A;
SetCoeff(A, 0, 1);
SetCoeff(A, 1, 1);
SetCoeff(A, 4, 1);
SetCoeff(A, 6, 1);

GF2X B;
SetCoeff(B, 1, 1);
SetCoeff(B, 3, 1);
SetCoeff(B, 6, 1);
SetCoeff(B, 7, 1);

GF2X C;

看起来有一个乘法覆盖,因此假设乘法覆盖基于 GF(2^8) 扩展字段 GF2E::init(P),这将起作用。

C = A * B:

正如问题后评论的那样,NTL 更面向大领域。对于 GF(256),使用字节和查找表会更快。对于高达 GF(2^64),具有无进位乘法 (PCLMULQDQ) 的 xmm 寄存器内在函数可用于在没有表格的情况下快速实现有限域数学(将需要一些常数,多项式及其乘法逆)。对于大于 GF(2^64) 的字段,需要扩展精度数学方法。对于字段 GF(p^n),其中 p != 2 且 n > 1,无符号整数可以与查找表一起使用。构建表格将涉及整数和 GF(p) 多项式系数之间的一些映射。

【讨论】:

  • NTL 也可用于 MSVC 的 vcpkg,它简化了安装。
  • @doug - 有一个关于如何为 VS2015 创建 NTL 库的 youtube 视频,只是需要一些时间,并且可能需要一些修复,除非源已修复。
  • 谢谢。快速浏览了一下。方便的端口。
  • @doug - 除了处理非常大的多项式之外,在什么情况下 NTL 有利于使用有限域数学?即使在那种情况下,从我在网络搜索中发现的情况来看,还有更好的大型多项式库吗?我可能会尝试用有限域系数分解原始多项式,因为这些因子可用于复合域映射,但我觉得它需要太长时间才能实用(例如用 GF 分解 64 次多项式(2^32) 或 GF(2^16) 系数。
  • 我不认为 N​​TL 对于特定的 gf 域工作有用。我确实简单地使用它来验证一些工作,但很快就编写了我自己的代码。但我的应用程序是 Reed-Solomon ECC,它还涉及调整一些矩阵代码以使用 gf(2^8)。更容易编写代码。特别是因为模拟将被移植到 VHDL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多