【问题标题】:Multiplication of 2 big binary strings modulo another binary string with out converting them to Big Integer2个大二进制字符串的乘法模另一个二进制字符串而不将它们转换为大整数
【发布时间】:2016-01-08 22:03:24
【问题描述】:

我正在实施高级加密标准 (AES) 的代码。我对乘法模运算感到震惊。二进制字符串到 BigInteger 的正常转换需要异常大量的时间。关于如何编码的任何帮助是? 下面的链接解释了有限域中的操作。

http://www.doc.ic.ac.uk/~mrh/330tutor/ch04s04.html

提前致谢

关于有限域 GF(2^m) 中的按位运算,下面的堆栈溢出链接可能会有所帮助。 http:Multiplying two polynomials

【问题讨论】:

  • 使用BigInteger需要大量的时间,因为这个操作需要大量的计算。我怀疑你是否会找到一个优于 BigInteger 的解决方案。
  • 是javacard的意思吗(int和long不能用)?

标签: java security binary modular-arithmetic


【解决方案1】:

不,AES (Rijndael) 涉及 GF(2^m) 算术,而不是整数算术。您不应该为此使用 BigIntegers -- 整数算术与 GF(2^m) 算术非常不同(整数有进位,有限域没有)。

如果你真的想知道如何做 GF(2^m) 算术,原始 Rijndael 论文的数学预备部分有一个很好的教程:http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf。您可以在位数组中实现这一点,或者为那些在字节内映射回位时感到困惑的人使用字节数组。但是看在上帝的份上,请不要使用 BigIntegers!

但是,您无需了解太多有关 GF(2^m) 的知识即可实现 AES/Rinjdael。您不需要执行 GF(2^m) 算术来计算 Rijndael 的 S-box,而是通过预先计算的表使用表查找。这就是它几乎总是在实践中实施的方式。此外,MixColumn 的实现非常简单,因为在最复杂的情​​况下,您只是乘以 x+1,因此最多只涉及一个模减少(如果您最终得到一个 x^8,那么只需减去不可约多项式,即在 AES 中是 x^8 + x^4 + x^3 + x + 1)。

例子:

(x^7 + x^3 + 1)*(x+1) 
= (x^7 + x^3 + 1)*x + (x^7 + x^3 + 1)*1 
= (x^8 + x^4 + x) + (x^7 + x^3 + 1)
= x^8 + x^7 + x^4 + x^3 + x + 1

由于前导项是 x^8,所以必须减去 x^8 + x^4 + x^3 + x + 1 :

(x^8 + x^7 + x^4 + x^3 + x + 1) - (x^8 + x^4 + x^3 + x + 1)
= x^7 

那个结果不是负数,但-1 与 GF(2^m) 中的 +1 相同,因此任何为负数的系数都会免费变成正数。

当您实现这个时,乘以 x 只是多项式的位表示的左移,而减法只是多项式的位表示的异或。

【讨论】:

    猜你喜欢
    • 2014-06-12
    • 2021-02-24
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多