【问题标题】:GF(256) finite field multiplication function in C#C#中的GF(256)有限域乘法函数
【发布时间】:2012-11-05 20:25:55
【问题描述】:

我在 C# 中实现 AES,并且在某些时候(MixColumns 函数)我必须在 GF(2^8) 有限域上乘以两个字节。

所以,我有三个选择:

  • 使用 dotNet 的默认功能(有类似的功能吗?)
  • 编写一个自定义函数来执行此操作
  • 使用查找表

对于自定义函数,我找到了一段 C 代码,我尝试为 C# 重写它,但它不起作用(我得到错误的结果)。 (*)

这是原始的 C 代码段(source):

/* Multiply two numbers in the GF(2^8) finite field defined 
 * by the polynomial x^8 + x^4 + x^3 + x + 1 */
uint8_t gmul(uint8_t a, uint8_t b) {
        uint8_t p = 0;
        uint8_t counter;
        uint8_t hi_bit_set;
        for (counter = 0; counter < 8; counter++) {
                if (b & 1) 
                        p ^= a;
                hi_bit_set = (a & 0x80);
                a <<= 1;
                if (hi_bit_set) 
                        a ^= 0x1b; /* x^8 + x^4 + x^3 + x + 1 */
                b >>= 1;
        }
        return p;
}

这是我重写的:

public Byte GMul(Byte a, Byte b) { // Galois Field (256) Multiplication
   Byte p = 0;
   Byte counter;
   Byte hi_bit_set;
   for (counter = 0; counter < 8; counter++) {
      if ((b & 1) != 0) {
         p ^= a;
      }
      hi_bit_set = (Byte) (a & 0x80);
      a <<= 1;
      if (hi_bit_set != 0) {
         a ^= 0x1b; /* x^8 + x^4 + x^3 + x + 1 */
      }
      b >>= 1;
   }
   return p;
}

我还找到了一些查找表here,这似乎是一种简单而好的方法,但我并不真正知道如何使用它们,尽管我有一种预感。 (**)

底线:我应该选择哪个选项,以及如何使它发挥作用,因为我上面写的就是我到目前为止所获得的全部内容,而且我真的不想深入了解数学知识。

更新:

*) 同时我意识到我的 C# 重写代码产生了正确的答案,这只是我的错,因为我在验证它们时搞砸了。

**) 这些表可以用作 Byte[256] 数组,假设x*3 的答案是table_3[x]x 在用作索引时从 HEX 转换为 DECIMAL表数组。

【问题讨论】:

  • 只是猜测 Byte 在 C# 中是“签名的”。其他一切看起来都很好。
  • 如果您“不想深入了解数学知识”,为什么不使用 AES 的内置实现:msdn.microsoft.com/en-us/library/…
  • @AkiSuihkonen 不是。已签名的称为 SByte。
  • @mikez 我必须将 AES 实施为家庭作业。
  • @AkiSuihkonen 你说得对,我重写的代码其实是正确的,只是不是因为符号问题,而是我在检查结果时混淆了一些东西并没有意识到。跨度>

标签: c# math cryptography aes finite-field


【解决方案1】:

为了在 GF(2) 中乘 x * 3,只需访问 x=table_3[x];

可能有一种 3 查找表方法可用,它使用对数方法。

就像在常规数字 a*b = 2^(log2(a)+log2(b)) 中一样,在 GF(2) 中也会发生同样的情况,但不会出现浮点数或舍入错误。

【讨论】:

  • 你让我了解了查找表。这也是我的预感。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多