我正在实施高级加密标准(AES)的代码。我对乘法模运算感到震惊。二进制字符串到BigInteger的正常转换花费了异常大量的时间。有关如何编码的任何帮助是?? 以下链接解释了有限域中的操作。
http://www.doc.ic.ac.uk/~mrh/330tutor/ch04s04.html
提前致谢
关于有限域GF(2 ^ m)中的逐位运算,下面的堆栈溢出链接可能会有所帮助。 HTTP:Multiplying two polynomials
答案 0 :(得分:0)
不,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)arithemtic来计算Rijndael的S-box,而是通过预先计算的表使用表查找。这就是它几乎总是在实践中实施的方式。此外,MixColumn非常简单,因为在最复杂的情况下,你只需要乘以x + 1,因此最多只需要一个mod减少(如果最终得到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只是多项式的位表示的左移,而减法只是多项式的异或表示。