簡體   English   中英

伽羅瓦域中的乘法/除法不正確(2 ^ 8)

[英]Incorrect Multiplication/Division in Galois Field (2^8)

我正在嘗試使用日志和指數表在GF(2 ^ 8)中實現乘法和除法。 我使用指數3作為我的生成器,使用此處的指令。

但是我失敗了一些瑣碎的測試用例。

例:

//passes  
assert((GF256elm(4) / GF256elm(1)) == GF256elm(4));  
assert((GF256elm(32) / GF256elm(16)) == GF256elm(2));  
assert((GF256elm(15) / GF256elm(5)) == GF256elm(3));  
assert((GF256elm(88) / GF256elm(8)) == GF256elm(11));  
//fails, but should pass
assert((GF256elm(77) / GF256elm(11)) == GF256elm(7));
assert((GF256elm(77) / GF256elm(7)) == GF256elm(11));  

前四行通過,但它在第5和第6行都失敗了。
經過進一步研究,我發現當存在“包裹”時會發生這些錯誤,即log3(a) + log3(b) > 255 (乘法情況)或log3(a) - log3(b) < 0 然而,該值是“修改的”,使得它們使用真模數保持在0~255。

GF256elm& GF256elm::operator/=(const GF256elm& other) { //C++ operator override for division
    int t = _logTable[val] - _logTable[other.val]; //log3(a) - log3(b)
    int temp =  ((t % 255) + 255) % 255; //this wraps the value to between 0~254 inclusive.
    val = _expTable[temp];
    return *this;
}

/運算符是使用上面的/= override實現的,所以沒有特別的事情發生。

我已經檢查過生成的log / exp表是否正確。

我在這里錯過了什么? 謝謝!

首先,請仔細閱讀此問題及其所有答案和評論:

伽羅瓦域中的加法和乘法

我認為你的代碼沒問題,但你有兩個問題。

首先,評論是錯誤的; 你保持指數在0-254范圍內,而不是0-255。

其次,你的“瑣碎”測試案例是錯誤的。

在此字段中,將數字視為多項式,其系數來自數字的二進制表示。 例如,由於5 = 2 ^ 2 + 1,因此在該字段中“5”表示x ^ 2 + 1。

所以“5”*“3”=(x ^ 2 + 1)*(x + 1)= x ^ 3 + x ^ 2 + x + 1,或“15”。 這就是你的測試用例assert((GF256elm(15) / GF256elm(5)) == GF256elm(3)); 作品。 它與你通常認為五次三等於十五的概念無關。 同樣,對於其他工作測試用例,您會注意到這些測試用例主要涉及兩個權限。

然而,“7”*“11”=(x ^ 2 + x + 1)*(x ^ 3 + x + 1)= x ^ 5 + x ^ 4 + 2x ^ 3 + 2x ^ 2 + 2x + 1

但系數都是模2,所以這實際上是x ^ 5 + x ^ 4 + 1 =“49”。 這就是您最后兩個測試用例失敗的原因。

如果你嘗試assert(GF256elm(49) / GF256elm(7) == GF256elm(11)); 你應該找到它結賬。

x % n計算結果為0到(n - 1)之間的整數。

這意味着x % 255計算結果為0到254之間的整數,而不是0到255之間的整數。

您應該用256替換255,或者對於相同的結果執行與0xff的按位AND。 后者更快,盡管編譯器很可能足夠聰明,可以將它們優化為相同的字節碼。

代碼沒有任何問題。 有限域乘法/除法與常規算法不同。 請參考cryptostackxchange中的這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM