【发布时间】:2021-08-17 05:22:34
【问题描述】:
我是 NTL 库的新手,因为它的 GF2X、GF2E、GF2EX 等。现在,我想在 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 + 1 和x^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